【问题标题】:wxpython-how to get return value from custom wx dialogwxpython-如何从自定义 wx 对话框中获取返回值
【发布时间】:2017-08-04 12:59:02
【问题描述】:

这是来自wxpython-can we add ok button on pybusyinfo dialog?的后续问题

我已经创建了自定义对话框。当我们从另一个函数调用一个函数并且如果用户单击对话框窗口上的“不继续”按钮时,它会弹出,我需要获取真/假值来提示是否按下特定按钮或不并将该值传递给函数调用以继续进行。

但是对于 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 

【问题讨论】:

    标签: python-2.7 wxpython wxwidgets


    【解决方案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()
    

    【讨论】:

    • 之前没遇到过EndModal。很好的例子!
    【解决方案2】:

    感谢 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"
    

    【讨论】:

    • 不错!..感谢 Rolf 的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多