2017-06-10 1 views
0

J'ai cette classe qui traite avec listBox: J'ai essayé de faire un bouton de suppression pour les éléments de la liste de contrôle, mais cela n'a pas fonctionné. La fonction "deleteItem" fonctionne maintenant.Sans les parties marquées cela fonctionne bien, mais il n'y a pas d'option de suppression. Aider quelqu'un?Supprimer l'élément de listBox wxpython

class SettingProcess(wx.Frame): 
    itemsArr= [] 
    # ---------------------------------------------------------------------- 
    def __init__(self): 

     wx.Frame.__init__(self, None, wx.ID_ANY, "Black list Proceses",size=(500, 600)) 
     self.Centre() 

     # Add a panel so it looks the correct on all platforms 
     panel = wx.Panel(self, wx.ID_ANY,size=(500, 600)) 
     self.index = 0 
     sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6) 

     lbl_process = wx.StaticText(panel, -1, "Process name") 
     lbl_process.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)) 
     self.txt_processname = wx.TextCtrl(panel, size=(140, -1)) 
     self.txt_processname.SetValue("chrome.exe") 
     sizer.AddMany([lbl_process, self.txt_processname]) 


     #------------- Files ListBox ------------------------------------- 
     global ProcessListMain 

     self.files_listBox = wx.ListBox(panel, -1, (12, 130), (200, 240), ProcessListMain, 
         wx.LB_SINGLE | wx.LB_HSCROLL | wx.LB_ALWAYS_SB | wx.LB_SORT) 
     self.files_listBox.SetBackgroundColour(wx.Colour(255, 255, 128)) 

     #------------- Set event handlers --------------------------------- 
     m_start = wx.Button(panel, wx.ID_CLOSE, "Add") 
     m_start.Bind(wx.EVT_BUTTON, self.OnAddButton) 
     sizer.Add(m_start, 0, wx.ALL, 10) 


     m_close = wx.Button(panel, wx.ID_CLOSE, "Close") 
     m_close.Bind(wx.EVT_BUTTON, self.onExit) 
     sizer.Add(m_close, 0, wx.ALL, 10) 

     **m_delete = wx.Button(panel, wx.ID_CLOSE, "Delete") 
     m_delete.Bind(wx.EVT_BUTTON, self.deleteItem) 
     sizer.Add(m_delete, 0, wx.ALL, 10)** 

     panel.SetSizer(sizer) 

    # ---------------------------------------------------------------------- 

    def OnAddButton(self,str): 
     global ProcessListMain 

     #print "value is "+ str(self.txt_processname.GetValue()) 
     ProcessListMain.append(self.txt_processname.GetValue()) 
     self.files_listBox.Set(ProcessListMain) 

    def onExit(self, event): 
     self.Destroy() 

    ***def deleteItem(self,event): 
     numOfItems=self.files_listBox.GetCount() 
     for i in range(numOfItems): 
      self.itemsArr[i]=self.files_listBox.GetString() 
     selectedItems=self.files_listBox.GetStringSelection() 
     self.files_listBox.clear() 
     for i in numOfItems : 
      if self.itemsArr[i]!=selectedItems: 
       self.files_listBox.append(self.itemsArr[i])*** 

Répondre

0

Voici la version, avec la permission du commentaire de Robin Dunn:
Notez que j'ai aussi lié la textctrl afin que remplissant simplement un nom de processus et en appuyant sur Entrée, agit également comme le bouton Add.

import wx 
class SettingProcess(wx.Frame): 
    # ---------------------------------------------------------------------- 
    def __init__(self): 

     wx.Frame.__init__(self, None, wx.ID_ANY, "Black list Processes",size=(500, 600)) 
     self.Centre() 

     # Add a panel so it looks the correct on all platforms 
     panel = wx.Panel(self, wx.ID_ANY,size=(500, 600)) 
     self.index = 0 
     sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6) 

     lbl_process = wx.StaticText(panel, -1, "Process name") 
     lbl_process.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)) 
     self.txt_processname = wx.TextCtrl(panel, size=(140, -1), style=wx.TE_PROCESS_ENTER) 
     self.txt_processname.SetValue("chrome.exe") 
     self.txt_processname.Bind(wx.EVT_TEXT_ENTER, self.OnAddButton) 
     sizer.AddMany([lbl_process, self.txt_processname]) 


     #------------- Files ListBox ------------------------------------- 
     ProcessListMain = ['Process A','Process B','Process C','Process D','Process E'] 
     self.files_listBox = wx.ListBox(panel, -1, (12, 130), (200, 240), ProcessListMain, 
         wx.LB_SINGLE | wx.LB_HSCROLL | wx.LB_ALWAYS_SB | wx.LB_SORT) 
     self.files_listBox.SetBackgroundColour(wx.Colour(255, 255, 128)) 

     #------------- Set event handlers --------------------------------- 
     m_start = wx.Button(panel, -1, "Add") 
     m_start.Bind(wx.EVT_BUTTON, self.OnAddButton) 
     sizer.Add(m_start, 0, wx.ALL, 10) 


     m_close = wx.Button(panel, -1, "Close") 
     m_close.Bind(wx.EVT_BUTTON, self.onExit) 
     sizer.Add(m_close, 0, wx.ALL, 10) 

     m_delete = wx.Button(panel, -1, "Delete") 
     m_delete.Bind(wx.EVT_BUTTON, self.deleteItem) 
     sizer.Add(m_delete, 0, wx.ALL, 10) 

     panel.SetSizer(sizer) 

    # ---------------------------------------------------------------------- 

    def OnAddButton(self,event): 
     Addproc = self.txt_processname.GetValue() 
     if Addproc: 
      self.files_listBox.Append(Addproc) 

    def onExit(self, event): 
     self.Destroy() 

    def deleteItem(self,event): 
     deleted_item = self.files_listBox.GetSelection() 
     self.files_listBox.Delete(deleted_item) 

if __name__=='__main__': 
    app = wx.App() 
    frame = SettingProcess() 
    frame.Show() 
    app.MainLoop() 

Il est un peu plus compliqué que d'avoir de double de Id pour vos boutons, comme je l'ai suggéré plus tôt.
les opérations suivantes: (Je suis coincé avec votre global ProcessListMain, mais a dû se moquer vers le haut, comme il n'est pas déclaré dans votre code Questions)

import wx 
class SettingProcess(wx.Frame): 
    itemsArr= [] 
    # ---------------------------------------------------------------------- 
    def __init__(self): 

     wx.Frame.__init__(self, None, wx.ID_ANY, "Black list Processes",size=(500, 600)) 
     self.Centre() 

     # Add a panel so it looks the correct on all platforms 
     panel = wx.Panel(self, wx.ID_ANY,size=(500, 600)) 
     self.index = 0 
     sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6) 

     lbl_process = wx.StaticText(panel, -1, "Process name") 
     lbl_process.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)) 
     self.txt_processname = wx.TextCtrl(panel, size=(140, -1)) 
     self.txt_processname.SetValue("chrome.exe") 
     sizer.AddMany([lbl_process, self.txt_processname]) 


     #------------- Files ListBox ------------------------------------- 
     global ProcessListMain 
     ProcessListMain = ['123','456','789','1123','2123'] 
     self.files_listBox = wx.ListBox(panel, -1, (12, 130), (200, 240), ProcessListMain, 
         wx.LB_SINGLE | wx.LB_HSCROLL | wx.LB_ALWAYS_SB | wx.LB_SORT) 
     self.files_listBox.SetBackgroundColour(wx.Colour(255, 255, 128)) 

     #------------- Set event handlers --------------------------------- 
     m_start = wx.Button(panel, -1, "Add") 
     m_start.Bind(wx.EVT_BUTTON, self.OnAddButton) 
     sizer.Add(m_start, 0, wx.ALL, 10) 


     m_close = wx.Button(panel, -1, "Close") 
     m_close.Bind(wx.EVT_BUTTON, self.onExit) 
     sizer.Add(m_close, 0, wx.ALL, 10) 

     m_delete = wx.Button(panel, -1, "Delete") 
     m_delete.Bind(wx.EVT_BUTTON, self.deleteItem) 
     sizer.Add(m_delete, 0, wx.ALL, 10) 

     panel.SetSizer(sizer) 

    # ---------------------------------------------------------------------- 

    def OnAddButton(self,event): 
     global ProcessListMain 
     Addproc = self.txt_processname.GetValue() 
     ProcessListMain.append(Addproc) 
     self.files_listBox.Set(ProcessListMain) 

    def onExit(self, event): 
     self.Destroy() 

    def deleteItem(self,event): 
     global ProcessListMain 
     deleted_item = self.files_listBox.GetStringSelection() 
     numOfItems=self.files_listBox.GetCount() 
     itemsArr = [] 
     for i in range(numOfItems): 
      x = self.files_listBox.GetString(i) 
      if x != deleted_item: 
       itemsArr.append(x) 
     ProcessListMain = itemsArr 
     self.files_listBox.Clear() 
     self.files_listBox.Set(ProcessListMain) 
     self.files_listBox.Update() 

if __name__=='__main__': 
    app = wx.App() 
    frame = SettingProcess() 
    frame.Show() 
    app.MainLoop() 
+0

ce que je peux écrire au lieu de? si je les supprime c'est une erreur – tal

+1

Ou vous pouvez simplement utiliser la méthode 'Delete' héritée de' wx.ItemContainer': https://docs.wxpython.org/wx.ItemContainer.html#wx.ItemContainer.Delete – RobinDunn

+0

@RobinDunn Vous avez bien sûr raison, mais j'aurais aussi dû changer la fonction 'OnAddButton' pour utiliser la méthode' Append'. Je courais avec le code existant mais votre commentaire est le bienvenu et pertinent. –