【问题标题】:wxPython return value from Wizard to calling FramewxPython 从向导返回值到调用 Frame
【发布时间】:2016-12-11 01:50:08
【问题描述】:

我的问题如下:

我正在设计一个向导,用于构造一个对象,该对象将添加到我的程序调用框架中的对象列表中。在向导结束时,我想将新创建的对象传回调用框架以插入到列表中。为了在抽象的基础上模拟这个基本功能,我构建了以下按比例缩小的应用程序:

mainframe.py

import wx
import wiz_test
class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,title="Main")
        panel = wx.Panel(self)
        callButton = wx.Button(panel, label = "Call Wizard")
        callButton.Bind(wx.EVT_BUTTON,self.launchWizard)
        self.Show()
    def launchWizard(self,event):
        wiz = wiz_test.WizObj(self)
        a = 0
        if wiz == wx.wizard.EVT_WIZARD_FINISHED:
            a = wiz.answer
        print a

if __name__ == '__main__':
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()

wiz_test.py

import wx
import wx.wizard as wiz

class WizPage(wiz.WizardPageSimple):
    def __init__(self, parent):
        self.answer = 3
        wiz.WizardPageSimple.__init__(self, parent)

        sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(sizer)

        title = wx.StaticText(self, -1, "Wizard Page")
        title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))

        sizer.Add(title, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
        sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.ALL, 5)


class WizObj(object):
    def __init__(self,parent):
        wizard = wx.wizard.Wizard(None, -1, "Simple Wizard")
        page1 = WizPage(wizard)
        wizard.FitToPage(page1)
        wizard.RunWizard(page1)
        wizard.Destroy()

if __name__ == "__main__":
    app = wx.App(False)
    main()
    app.MainLoop()

这个小例子的最终目标是在触发 wx.wizard.EVT_WIZARD_FINISHED 事件时让 MainFrame 实例输出从 WizObj 实例的 .answer 成员变量派生的值“3”。但是,由于当前代码仅返回“0”,因此显然此时无法正常工作。我以正确的方式接近这个吗?我是否应该绑定 EVT_WIZARD_FINISHED 事件,如果是,我将如何从 Mainframe 访问它?

【问题讨论】:

    标签: python events wxpython frame wizard


    【解决方案1】:

    我能够通过使用 wxPython 库中的“pubsub”功能来解决这个问题。具体来说,我在调用框架内的向导实例化之前添加了一个 pub.subscribe() 实例。在向导内部,我在销毁向导之前通过 pub.sendMessage() 传递值。请务必注意,必须指定 pass 值才能使 pubsub 发送有效工作。

    以下代码是原代码的修改版本,现在可以运行了。

    MainFrame.py

    import wx
    import wiz_test
    from wx.lib.pubsub import pub
    
    class MainFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self,None,title="Main")
            panel = wx.Panel(self)
            callButton = wx.Button(panel, label = "Call Wizard")
            callButton.Bind(wx.EVT_BUTTON,self.launchWizard)
            self.Show()
    
        def catch_stuff(self,a):
            print a
    
        def launchWizard(self,event):
            pub.subscribe(self.catch_stuff,'valPass')
            wiz = wiz_test.WizObj(self,a)
    
    
    
    if __name__ == '__main__':
        app = wx.App(False)
        frame = MainFrame()
        app.MainLoop()
    

    wiz_test.py

    import wx
    import wx.wizard as wiz
    from wx.lib.pubsub import pub
    
    class WizPage(wiz.WizardPageSimple):
        def __init__(self, parent):
            self.answer = 3
            wiz.WizardPageSimple.__init__(self, parent)
    
            sizer = wx.BoxSizer(wx.VERTICAL)
            self.SetSizer(sizer)
    
            title = wx.StaticText(self, -1, "Wizard Page")
            title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))
    
    
            sizer.Add(title, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
            sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.ALL, 5)
    
    #----------------------------------------------------------------------
    class WizObj(object):
        def __init__(self,parent,a):
            wizard = wx.wizard.Wizard(None, -1, "Simple Wizard")
            page1 = WizPage(wizard)
            wizard.FitToPage(page1)
            wizard.RunWizard(page1)
            pub.sendMessage('valPass',a = page1.answer)
            wizard.Destroy()
    
    #----------------------------------------------------------------------
    if __name__ == "__main__":
        app = wx.App(False)
        main()
        app.MainLoop()
    

    结果是控制台打印出从被调用向导中检索到的值 3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 2013-02-21
      相关资源
      最近更新 更多