我正在尝试将基于CLI的程序移植到GUI中,以使其更加用户友好。我已经掌握了wxPython的基础知识,但是有一个问题困扰了我。
我已经定义了一个对话框,它带有一个允许我创建动态对话框的参数:
def infoDialog(self,event,message):
dialog = wx.MessageDialog(None, message, 'Info', wx.OK | wx.ICON_INFORMATION)
dialog.ShowModal()
我在类中有一个主子程序,它生成所有GUI元素:
def initGUI(self):
panel = wx.Panel(self)
如果我在initGUI中调用信息对话框,如下所示:
pidButton = wx.Button(panel, label='Open...', pos=(540,445), size=(60,20))
pidButton.Bind(wx.EVT_BUTTON, self.questionDialog(event,"Hi!"))
然后我收到此错误:
pidButton.Bind(wx.EVT_BUTTON, self.questionDialog(event,"Hi!"))
NameError:全局名称'事件'未定义
然而,如果我从一个不是initGUI()的子程序中调用它,这是有效的。我该如何解决这个问题?
我感谢任何建议
答案 0 :(得分:0)
由于异常告诉您此时没有定义“事件”,但我也没有看到定义的qeustionDialog,所以我认为您需要进行这些更改。
变化:
def infoDialog(self,event,message):
为:
def infoDialog(self, message):
和
pidButton.Bind(wx.EVT_BUTTON, self.questionDialog(event,"Hi!"))
为:
pidButton.Bind(wx.EVT_BUTTON, self.infoDialog)
答案 1 :(得分:0)
将事件处理程序绑定到按钮事件,并在该处理程序内调用您希望发生的任何操作。
请注意,绑定时,将引用传递给处理程序而不调用它,即no()其他方面,您绑定调用处理程序的结果。处理程序必须接受一个参数。
import wx
from wx.lib import sized_controls
class MainFrame(sized_controls.SizedFrame):
def __init__(self, *args, **kwargs):
super(MainFrame, self).__init__(*args, **kwargs)
self.SetTitle('MainFrame')
pane = self.GetContentsPane()
button = wx.Button(pane, label='open')
button.Bind(wx.EVT_BUTTON, self.on_open_button)
def on_open_button(self, event):
self.infoDialog("Hi!")
def infoDialog(self, message):
dialog = wx.MessageDialog(
None, message, 'Info', wx.OK | wx.ICON_INFORMATION)
dialog.ShowModal()
if __name__ == '__main__':
wxapp = wx.App(False)
frame = MainFrame(None)
frame.Show()
wxapp.MainLoop()