这是来自wxpython-can we add ok button on pybusyinfo dialog?
的后续问题我已经创建了自定义对话框。当我们从另一个函数调用一个函数时会弹出它,如果用户点击对话框窗口中的“Dont proceed”按钮,我需要得到true / False值以便知道是否按下了特定按钮或不要将该值传递给函数调用以继续进行。
但是使用wx自定义对话框,我没有任何返回值,因为一旦按下任何按钮,对话框就会被销毁。
有没有办法通过按钮点击事件从自定义对话框类中获取返回值,并且即使它被销毁也可以从类外部访问。
提前致谢。
def main():
print "start execution"
ret = getUserInput("Do you want to proceed?")
if ret:
print "proceed"
else:
print "exit"
def getUserInput(msg):
class Busy(wx.Dialog):
def __init__(self, parent, msg):
wx.Dialog.__init__(self, parent, wx.ID_ANY, "Message", size=(420, 200))
self.panel = wx.Panel(self, wx.ID_ANY)
self.label = wx.StaticText(self.panel, label=msg, pos=(20, 20))
self.gauge = wx.Gauge(self.panel, size=(300, 20), pos=(50, 50), style=wx.GA_HORIZONTAL)
self.livelabel = wx.StaticText(self.panel, label="Time to live:", pos=(50, 80))
self.lltime = wx.StaticText(self.panel, label="30", pos=(130, 80))
self.notProceedButton = wx.Button(self.panel, label="Don't proceed", pos=(50, 100))
self.timeoutButton = wx.Button(self.panel, label="Timer Off", pos=(250, 100))
self.notProceedButton.Bind(wx.EVT_BUTTON, self.notProceed)
self.timeoutButton.Bind(wx.EVT_BUTTON, self.OnNoTimeout)
self.Bind(wx.EVT_CLOSE, self.OnQuit)
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
self.lifetimer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnLifeTimer, self.lifetimer)
self.timer.Start(100)
self.lifetimer.Start(1000)
self.timeoutbutton_pressed = False
self.gauge.SetBackgroundColour(wx.Colour(0, 127, 255, 255)) # Slate Blue
self.gauge.SetRange(100)
self.gauge.SetValue(0)
self.life = 30
self.direction = 1
self.result_text = True
def OnTimer(self, evt): # Update gauge
x = int(self.gauge.GetValue())
if x == 0:
self.direction = 1
elif x == 100:
self.direction = -1
x += self.direction
self.gauge.SetValue(x)
def OnLifeTimer(self, evt): # Update time to live
if self.timeoutbutton_pressed == True:
return
self.life -= 1
self.lltime.SetLabelText(str(self.life))
if self.life < 1:
self.OnQuit(None)
def OnNoTimeout(self, evt): # toggle time to live
if self.timeoutbutton_pressed == False:
self.timeoutbutton_pressed = True
self.timeoutButton.SetLabel("Timer On")
else:
self.timeoutbutton_pressed = False
self.timeoutButton.SetLabel("Timer Off")
def OnQuit(self, event):
self.timer.Stop()
self.lifetimer.Stop()
self.Destroy()
def notProceed(self, event): # return input
self.result_text = False
self.timer.Stop()
self.lifetimer.Stop()
self.Destroy()
app = wx.App()
dlg = Busy(parent = None, msg=msg)
dlg.ShowModal()
return dlg.result_text
答案 0 :(得分:1)
不确定。 EndModal
方法将返回您想要的任何返回代码。即
def OnLifeTimer(self, evt): # Update time to live
if self.timeoutbutton_pressed == True:
return
self.life -= 1
self.lltime.SetLabelText(str(self.life))
if self.life < 1:
self.EndModal(SOME_ID_THAT_YOU_DEFINED_SOMEWHERE_ELSE)
self.OnQuit(None)
传递给EndModal
的参数从ShowModal
app = wx.App()
dlg = Busy(parent = None, msg=msg)
return_code = dlg.ShowModal()
作为旁注,您不必在对话框中调用Destroy。如果您想从中检索一些标记或其他信息,可以在之后调用Destroy
,即
app = wx.App()
dlg = Busy(parent = None, msg=msg)
return_value = dlg.ShowModal()
some_other_value = dlg.some_other_value
dlg.Destroy()
答案 1 :(得分:1)
感谢user2682863 EndModal()
import wx
class getUserInput(wx.Dialog):
def __init__(self, parent, msg):
wx.Dialog.__init__(self, parent, wx.ID_ANY, "Message", size=(420, 200))
self.panel = wx.Panel(self, wx.ID_ANY)
self.label = wx.StaticText(self.panel, label=msg, pos=(20, 20))
self.gauge = wx.Gauge(self.panel, size=(300, 20), pos=(50, 50), style=wx.GA_HORIZONTAL)
self.livelabel = wx.StaticText(self.panel, label="Time to live:", pos=(50, 80))
self.lltime = wx.StaticText(self.panel, label="30", pos=(130, 80))
self.notProceedButton = wx.Button(self.panel, label="Don't proceed", pos=(50, 100))
self.timeoutButton = wx.Button(self.panel, label="Timer Off", pos=(250, 100))
self.notProceedButton.Bind(wx.EVT_BUTTON, self.notProceed)
self.timeoutButton.Bind(wx.EVT_BUTTON, self.OnNoTimeout)
self.Bind(wx.EVT_CLOSE, self.OnQuit)
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
self.lifetimer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnLifeTimer, self.lifetimer)
self.timer.Start(100)
self.lifetimer.Start(1000)
self.timeoutbutton_pressed = False
self.gauge.SetBackgroundColour(wx.Colour(0, 127, 255, 255)) # Slate Blue
self.gauge.SetRange(100)
self.gauge.SetValue(0)
self.life = 30
self.direction = 1
self.result_text = True
def OnTimer(self, evt): # Update gauge
x = int(self.gauge.GetValue())
if x == 0:
self.direction = 1
elif x == 100:
self.direction = -1
x += self.direction
self.gauge.SetValue(x)
def OnLifeTimer(self, evt): # Update time to live
if self.timeoutbutton_pressed == True:
return
self.life -= 1
self.lltime.SetLabelText(str(self.life))
if self.life < 1:
self.OnQuit(None)
def OnNoTimeout(self, evt): # toggle time to live
if self.timeoutbutton_pressed == False:
self.timeoutbutton_pressed = True
self.timeoutButton.SetLabel("Timer On")
else:
self.timeoutbutton_pressed = False
self.timeoutButton.SetLabel("Timer Off")
def OnQuit(self, event):
self.timer.Stop()
self.lifetimer.Stop()
self.EndModal(True)
def notProceed(self, event): # return input
self.result_text = False
self.timer.Stop()
self.lifetimer.Stop()
self.EndModal(False)
app = wx.App()
dlg = getUserInput(parent = None, msg="Do you want to porceed?")
ret = dlg.ShowModal()
if ret:
print "proceed"
else:
print "exit"