我一直在研究wxpython中的GUI代码,它或多或少地重复相同的信息4次。屏幕上有很多按钮,我必须将事件绑定到,我发现我有很多看起来几乎相同的on_button_click定义。所以,我想知道在将按钮绑定到事件并删除3个定义时是否有一种方法可以直接传递参数。这是一个例子:
self.VDBenchSlot1 = wx.Button(self, -1, "Slot 1 VDBench")
sizer.Add(self.VDBenchSlot1,(1, 5), (1, 5), wx.EXPAND)
self.VDBenchSlot1.Bind(wx.EVT_BUTTON, self.VDBenchSlot1_clicked)
self.VDBenchSlot2 = wx.Button(self, -1, "Slot 2 VDBench")
sizer.Add(self.VDBenchSlot2,(1, 5), (1, 5), wx.EXPAND)
self.VDBenchSlot2.Bind(wx.EVT_BUTTON, self.VDBenchSlot2_clicked)
self.VDBenchSlot3 = wx.Button(self, -1, "Slot 3 VDBench")
sizer.Add(self.VDBenchSlot3,(1, 5), (1, 5), wx.EXPAND)
self.VDBenchSlot3.Bind(wx.EVT_BUTTON, self.VDBenchSlot3_clicked)
self.VDBenchSlot4 = wx.Button(self, -1, "Slot 4 VDBench")
sizer.Add(self.VDBenchSlot4,(1, 5), (1, 5), wx.EXPAND)
self.VDBenchSlot4.Bind(wx.EVT_BUTTON, self.VDBenchSlot4_clicked)
def VDBenchSlot1_clicked(self, event):
global diskchange
if diskchange[1] == 'No Disk':
self.TextSlot1.AppendText("No Disk is currently in the slot so you cannot run this! \n")
else:
# Open the file startDisk#VD.sh that has the setup to start running VDBench
os.system("echo pcieRocks | sudo -S gnome-terminal --profile=VDbench --working-directory=/home/pciedev3ubuntu/Documents -e './vdbench -f disk%dVDscript.txt -vr' &" %diskchange[1])
def VDBenchSlot2_clicked(self, event):
global diskchange
if diskchange[2] == 'No Disk':
self.TextSlot2.AppendText("No Disk is currently in the slot so you cannot run this! \n")
else:
# Open the file startDisk#VD.sh that has the setup to start running VDBench
os.system("echo pcieRocks | sudo -S gnome-terminal --profile=VDbench --working-directory=/home/pciedev3ubuntu/Documents -e './vdbench -f disk%dVDscript.txt -vr' &" %diskchange[2])
def VDBenchSlot3_clicked(self, event):
global diskchange
if diskchange[3] == 'No Disk':
self.TextSlot3.AppendText("No Disk is currently in the slot so you cannot run this! \n")
else:
# Open the file startDisk#VD.sh that has the setup to start running VDBench
os.system("echo pcieRocks | sudo -S gnome-terminal --profile=VDbench --working-directory=/home/pciedev3ubuntu/Documents -e './vdbench -f disk%dVDscript.txt -vr' &" %diskchange[3])
def VDBenchSlot4_clicked(self, event):
global diskchange
if diskchange[4] == 'No Disk':
self.TextSlot4.AppendText("No Disk is currently in the slot so you cannot run this! \n")
else:
# Open the file startDisk#VD.sh that has the setup to start running VDBench
os.system("echo pcieRocks | sudo -S gnome-terminal --profile=VDbench --working-directory=/home/pciedev3ubuntu/Documents -e './vdbench -f disk%dVDscript.txt -vr' &" %diskchange[4])
我尝试将VDBenchslotx_clicked更改为VDBenchslotx_clicked()并将参数传递给它,但是发生了两件事之一;它告诉我输入的参数与def的参数不匹配,或者它允许我的程序运行,但它会在程序启动时自动执行def,而不是按下按钮时,然后按钮无法正常运行。
答案 0 :(得分:2)
使用lambda表达式将参数传递给绑定函数。例如:
self.VDBenchSlot1.Bind(wx.EVT_BUTTON, lambda event: self.VDBenchSlot_clicked(event, 1))
def VDBenchSlot_clicked(self, event, position):
if position == 1:
text_slot = self.TextSlot1
elif position == 2:
text_slot = self.TextSlot2
elif position == 3:
text_slot = self.TextSlot3
elif position == 4:
text_slot = self.TextSlot4
global diskchange
if diskchange[position] == 'No Disk':
text_slot.AppendText("No Disk is currently in the slot so you cannot run this! \n")
else:
# Open the file startDisk#VD.sh that has the setup to start running VDBench
os.system("echo pcieRocks | sudo -S gnome-terminal --profile=VDbench --working-directory=/home/pciedev3ubuntu/Documents -e './vdbench -f disk%dVDscript.txt -vr' &" %diskchange[position])
答案 1 :(得分:0)
dbc(和the linked question)展示了如何实现您的目标。但这是我在上面的评论中提到的辅助功能概念的简短演示。
def make_button(text, callback):
button = wx.Button(self, -1, text)
sizer.Add(button, (1, 5), (1, 5), wx.EXPAND)
button.Bind(wx.EVT_BUTTON, callback)
return button
self.VDBenchSlot1 = make_button("Slot 1 VDBench", self.VDBenchSlot1_clicked)
self.VDBenchSlot2 = make_button("Slot 2 VDBench", self.VDBenchSlot2_clicked)
请注意,make_button
的签名中没有self
。那是因为它不是方法,它是在方法中定义的函数。有关GTK2 +中完整运行的示例,请参阅this answer。
另请注意,我的代码基于您的原始代码,但您应该很容易使其适应使用dbc的新VDBenchSlot_clicked
回调方法。