Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在wxpython中添加和删除按钮的简单示例_Wxpython - Fatal编程技术网

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

在wxpython中添加和删除按钮的简单示例,wxpython,Wxpython,我用的是wxpython 我想为一个GUI解决一个简单的问题,这个GUI由一个按钮“Add”组成,当按下该按钮时,会创建一个名为“Remove”的新按钮。您可以按“添加”任意次数,并创建许多删除按钮并将其添加到面板中。 我想要的是,当你按下一个移除按钮时,移除按钮本身从面板移除 问题是当您使用以下命令将函数绑定到按钮时: self.Bind(wx.EVT\u按钮、self.remove\u功能、按钮名称) 不能将参数传递给函数,告诉它要删除哪个按钮。(或者你能吗?几年前我在这里写过这个话题:

我用的是wxpython

我想为一个GUI解决一个简单的问题,这个GUI由一个按钮“Add”组成,当按下该按钮时,会创建一个名为“Remove”的新按钮。您可以按“添加”任意次数,并创建许多删除按钮并将其添加到面板中。 我想要的是,当你按下一个移除按钮时,移除按钮本身从面板移除

问题是当您使用以下命令将函数绑定到按钮时:

self.Bind(wx.EVT\u按钮、self.remove\u功能、按钮名称)


不能将参数传递给函数,告诉它要删除哪个按钮。(或者你能吗?

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

但以下示例可能会有所帮助:

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传递按钮对象:

下面是关于将多个小部件绑定到同一事件处理程序的一些附加信息:


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

self.Bind(wx.EVT_按钮,lambda e:otherFunction(arg1,arg2),按钮名称)

感谢您提供了一个很好的示例。不幸的是,它在Python3.9.2中不能正常工作(不再?)。你的线路

self.main_sizer.Remove(btn)
在remove_button()中,方法抛出一个TypeError:

TypeError:Sizer.Remove():参数与任何重载参数不匹配 电话:

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

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

对我来说,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
请告诉我是否有更简单或更优雅的/蟒蛇式的方法