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