wxPython的 - 如何从自定义对话框WX

问题描述:

得到的返回值这是从wxpython-can we add ok button on pybusyinfo dialog?wxPython的 - 如何从自定义对话框WX

跟进的问题,我已经创建了定制dialog.It会弹出当我们从另一个函数调用的函数,如果用户点击“不要继续“按钮在对话框窗口我需要得到真/假值,以确定是否按下特定按钮,并将该值传递给函数调用以进一步处理。

但随着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 

当然。方法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后,即

app = wx.App() 

dlg = Busy(parent = None, msg=msg) 
return_value = dlg.ShowModal() 
some_other_value = dlg.some_other_value 
dlg.Destroy() 
+0

很好的例子礼貌前未穿过'EndModal'来。很好的例子! –

+0

其工作感谢user2682863 – Nithya

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" 
+0

不错!谢谢你的例子Rolf。 – Nithya