从listBox wxpython中删除项目

时间:2017-06-10 07:44:13

标签: python user-interface listbox wxpython

我有这个类处理listBox: 我试图为listBox项目创建一个删除按钮,但它没有工作。 " deleteItem"函数现在工作。没有标记的部分它工作正常,但没有删除选项。帮助别人?

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])***

1 个答案:

答案 0 :(得分:0)

这是版本,由Robin Dunn的评论提供:
请注意,我还绑定了textctrl,这样只需填写流程名称并按Enter键,就像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()

正如我之前建议的那样,它比你的按钮有重复的Id要复杂一点 请尝试以下操作:(我坚持使用global ProcessListMain,但必须对其进行模拟,因为它未在您的问题代码中声明)

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()