gui examples python loops events tkinter wxpython

examples - gui python 3



Ejecutando wxPython después de cerrar Tkinter (1)

Tenemos dos aplicaciones, una desarrollada con una interfaz Tkinter y otra desarrollada usando wxPython. Ambos son bastante sofisticados. Cuando termine de ejecutar la aplicación Tkinter, me gustaría que la aplicación wxPython se ejecute después de seleccionar un botón en la aplicación Tkinter. ¿Existe la posibilidad de cambiar los bucles de eventos para que la aplicación Tkinter pueda cambiar sin problemas a la GUI de wxPython?

Mientras que lo siguiente funciona después de root.destroy en la aplicación Tkinter: os.system(''python wxGUI.py'')

El programa final debe agruparse en una aplicación independiente para múltiples sistemas operativos, por lo que esta solución solo funcionaría si creo una py2app o py2exe separada para la aplicación wxPython y la llamo de esta manera (lo cual no es ideal).


Probablemente la forma más sencilla de lograr esto sería poner wxPython en un hilo separado y simplemente ocultar la aplicación Tkinter cuando desee llamar a la aplicación wxPython. Simplemente armé este ejemplo juntos y pareció funcionar para mí:

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()

Esto es lo que tenía en el módulo 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()

Puede que tenga que experimentar un poco ya que uno de los principales problemas con la ejecución de dos kits de herramientas GUI diferentes es que sus bucles principales pueden interferir entre sí. Puede que tenga que usar el módulo de multiprocesamiento en lugar del módulo de subprocesamiento para evitarlo. No estoy realmente seguro. Pero esto debería hacerte comenzar de todos modos.