2016-08-04 62 views
0

我的問題是:wxPython的返回值來調用框架

我設計了一個對象的建設嚮導被添加到我的程序的調用框架對象的列表。在嚮導的結尾處,我想將新創建的對象傳遞迴調用框架以插入到列表中。爲了一個抽象的基礎上模擬這一基本功能我已經建造以下,按比例縮小的應用程序:

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訪問它?

回答

0

我能夠通過在wxPython庫中使用「pubsub」功能來解決這個問題。具體而言,我在調用框架內實例化嚮導之前添加了一個pub.subscribe()實例。在嚮導內部,我在銷燬嚮導之前通過pub.sendMessage()傳遞值。需要注意的是,必須指定傳遞值才能使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() 

其結果是,控制檯打印其從被叫嚮導檢索到的值。