2015-06-24 85 views
3

我們有兩個應用程序,一個使用Tkinter界面開發,另一個使用wxPython構建。兩者都相當複雜。當完成運行Tkinter應用程序時,我希望在Tkinter應用程序中選擇一個按鈕後運行wxPython應用程序。是否有切換事件循環,以便Tkinter應用程序可以無縫切換到wxPython GUI?關閉Tkinter後運行wxPython

雖然下面做工作root.destroy後,在Tkinter的應用: os.system('python wxGUI.py')

最終方案需要被捆綁到了多個操作系統的獨立的應用程序,所以如果我創建一個單獨的py2app這一解決方案只會工作或用於wxPython應用程序的py2exe,並以此方式調用它(這不太理想)。

回答

0

可能最簡單的方法是將wxPython放入單獨的線程中,並在您想調用wxPython應用程序時隱藏Tkinter應用程序。我剛掀起這個例子在一起,它似乎爲我工作:

import Tkinter 
import wxapp 
import wx 

from threading import Thread 

######################################################################## 
class WxThread(Thread): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """""" 
     Thread.__init__(self) 
     self.start() 

    #---------------------------------------------------------------------- 
    def run(self): 
     """""" 
     app = wx.App(False) 
     frame = wxapp.MyFrame() 
     app.MainLoop() 


######################################################################## 
class MyApp(object): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     self.root = parent 
     self.root.title = "Tkinter App" 

     self.frame = Tkinter.Frame(parent) 
     self.frame.pack() 

     btn = Tkinter.Button(self.frame, text="Open wxPython App", 
          command=self.run_wx) 
     btn.pack() 

    def run_wx(self): 
     self.root.withdraw() 
     thread = WxThread() 
     thread.join() 
     self.root.deiconify() 

#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    root = Tkinter.Tk() 
    root.geometry("800x600") 
    app = MyApp(root) 
    root.mainloop() 

這是我有wxapp.py模塊:

import wx 

######################################################################## 
class MyFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title="wxPython App") 
     panel = wx.Panel(self) 
     self.Show() 

您可能需要做一些試驗的主要原因之一運行兩個不同的GUI工具包的問題是它們的主循環可能會相互干擾。您可能不得不使用多處理模塊而不是線程模塊來解決這個問題。我不太確定。但是這應該讓你開始。

+0

謝謝您提出的解決方案。此代碼成功加載Tkinter,但是當選擇「Wx」按鈕時,程序在Mac上使用Tcl_ServiceModelHook崩潰:Notifier未初始化中止陷阱:6錯誤。我嘗試了多處理來調用wxpython模塊,但得到以下警告:該程序需要訪問屏幕。 請使用python的Framework版本運行,並且只有當您在Mac的主顯示器上登錄到 時才運行。 – nateS

+0

我沒有一個Mac可以用來測試。這在我的Xubuntu盒子上工作得很好。我認爲框架構建錯誤可能來自wxPython。我認爲某些版本的wxPython沒有它或類似的東西就無法工作。 –