在wxpython中添加和删除按钮的简单示例

时间:2015-03-17 13:23:14

标签: wxpython

我正在使用wxpython。

我想解决一个GUI的简单问题,该GUI包含一个按钮" Add",按下时会创建一个名为"删除"的新按钮。您可以按"添加"您可以多次使用并创建许多删除按钮并将其添加到面板中。 我想要的是,当您按下其中一个删除按钮时,删除按钮本身将从面板中删除。

问题是当你将一个函数绑定到一个按钮时:

self.Bind(wx.EVT_BUTTON, self.remove_function, button_name)

你不能向函数传递一个参数,告诉它要删除哪个按钮。 (或者你可以吗?)

3 个答案:

答案 0 :(得分:1)

几年前我在这里写过这个话题:

以下示例可能有所帮助:

import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)
        self.btns = 1

        self.main_sizer = wx.BoxSizer(wx.VERTICAL)
        add_btn = wx.Button(self, label='Add')
        add_btn.Bind(wx.EVT_BUTTON, self.add_button)

        self.main_sizer.Add(add_btn, 0, wx.CENTER|wx.ALL, 5)
        self.SetSizer(self.main_sizer)

    #----------------------------------------------------------------------
    def add_button(self, event):
        """"""
        new_btn = wx.Button(self, label="Remove %s" % self.btns)
        new_btn.Bind(wx.EVT_BUTTON, self.remove_button)
        self.btns += 1
        self.main_sizer.Add(new_btn, 0, wx.CENTER|wx.ALL, 5)
        self.main_sizer.Layout()

    #----------------------------------------------------------------------
    def remove_button(self, event):
        """"""
        btn = event.GetEventObject()
        print "Deleting %s button" % btn.GetLabel()
        self.main_sizer.Hide(btn)
        self.main_sizer.Remove(btn)
        self.main_sizer.Layout()


########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Buttons")
        panel = MyPanel(self)
        self.Show()

if __name__ == '__main__':
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

您还可以使用lambda,内联函数或functools传递按钮对象:

这里有一些关于将多个小部件绑定到同一个事件处理程序的其他信息:

答案 1 :(得分:1)

如果您的问题是将参数传递给函数,请考虑以下事项:

self.Bind(wx.EVT_BUTTON, lambda e: otherFunction(arg1, arg2), button_name)

答案 2 :(得分:0)

@Mike Driscoll 感谢您提供的出色示例。不幸的是,它不能在 Python 3.9.2 中正常工作(不再?)。你的线路

self.main_sizer.Remove(btn)

在 remove_button() 方法中抛出一个 TypeError:

<块引用>

TypeError: Sizer.Remove(): 参数不匹配任何重载 调用:

重载 1:参数 1 具有意外类型 'Button'

重载 2:参数 1 具有意外类型“按钮”

对我来说,wx.Sizer.Remove() 只对 SizerItem 的索引起作用。所以而不是使用

self.main_sizer.Remove(btn)

我用过:

sizerItemIdx = 0

for sizerItem in self.main_sizer.GetChildren():
    widget = sizerItem.GetWindow()
    if widget == btn:
        self.main_sizer.Remove(sizerItemIdx)
    sizerItemIdx += 1

请告诉我是否有更简单或更优雅/Pythonian 的方法来做到这一点。