2016-07-21 5 views
0

Ich bin von Tkinter zu WxPython wechseln und ich bin verwirrt bei der Vererbung bei der Verwendung von Vorlage WxPython-Skripten ähnlich wie die Wxexample-Klasse unten. Gegeben meine drei Skripte (mainClass.py, wxexample.py, callbacks.py), wie mache ich:Starten von WxPython und Erweitern einer anderen Klasse

1) ordnungsgemäß starten Sie das WxPython-Fenster von der mainClass;

2) Lassen Sie die Example-Klasse die Callback-Klasse weiter unten erweitern.

mainClass.py:

from time import sleep 
import callbacks as clb 
import wxexample 

class mainClass(clb.callbacks): #, wxexample.Example): 
    def main(self): 
     #Here start the wxPython UI in wxexample! 
     ... 
     #while 1: Edited 
     # sleep(0.5) 

if __name__ == "__main__": 
    instance = mainClass() 
    instance.main() 

wxexample.py:

import wx 
class Example(wx.Frame): 
    def __init__(self, *args, **kw): 
     super(Example, self).__init__(*args, **kw)   
     self.InitUI() 

    def InitUI(self): 
     pnl = wx.Panel(self) 
     btn=wx.Button(pnl, label='Button', pos=(20, 30)) 
     #Here I would like to call callbacks.mycallback as self.mycallback: 
     btn.Bind(wx.EVT_BUTTON, self.mycallback) 
     self.Show(True) 

callbacks.py:

class callbacks(): 
    def mycallback(self, e): #EDITED 
     print("callbacks.mycallback") 

GELÖST: Ich Fundamental ging zurück und fand diese Lösung . Ich war verwirrt, weil in meiner realen Implementierung Mainclass wxexample.Example aus anderen Gründen wurde erstreckt, die einen Fehler wirft (kann nicht eine konsistente Methode Auflösung um (MRO) für Basen Beispiel, Rückrufe erstellen)

import callbacks as clb 
import wxexample 

class mainClass(clb.Callbacks): #, wxexample.Example): 
    def main(self): 
     wxexample.main() 

if __name__ == "__main__": 
    instance = mainClass() 
    instance.main() 

wxexample.py:

import wx 
import callbacks as clb 
class Example(wx.Frame, clb.Callbacks): 
    def __init__(self, *args, **kw): 
     super(Example, self).__init__(*args, **kw)   
     self.InitUI() 

    def InitUI(self): 
     pnl = wx.Panel(self) 
     btn=wx.Button(pnl, label='Button', pos=(20, 30)) 
     #Here I would like to call callbacks.mycallback as self.mycallback: 
     btn.Bind(wx.EVT_BUTTON, self.mycallback) 
     self.Show(True) 

def main():  
    ex = wx.App() 
    Example(None) 
    ex.MainLoop()  

if __name__ == '__main__': 
    main() 

Antwort

1

Alle wxPython Anwendungen erfordern die folgende, auf ein Minimum:

  1. eine Instanz wx.App oder eine Unterklasse, abgeleitet von wx.App
  2. Eine Instanz eines Oberflächenelements auf oberster Ebene, wie beispielsweise ein wx.Frame, wx.Dialog oder eine abgeleitete Klasse, die
  3. Ein Ereignis-Schleife gezeigt worden ist, fast immer durch einen Aufruf der Methode des Objekts MainLoop Anwendung implementiert.

In Anbetracht dieser Liste, bin ich sehr besorgt über die while-Schleife Sie in Ihrem main Verfahren zeigen, wie nicht das Hauptereignisschleife, oder Steuerung blockiert, um sie von der Rückkehr zu mehr Problemen führen, als Sie wollen beschäftigen Sie sich mit dem Erlernen des Toolkits. Sie könnten ersetzen, dass while-Schleife mit so etwas wie die folgenden, und das würde man auf dem richtigen Weg:

Sie auch mycallback einen zusätzlichen Parameter als Event-Handler benötigen, geben immer ein Event-Objekt übergeben, auch wenn sie es nicht brauchen.

Wenn Sie nicht bereits haben, empfehle ich das Tutorial an dieser Stelle zu lesen: http://zetcode.com/wxpython/

+0

Dank für Ihre Antwort danken. Die while-Schleife war in der Tat ein sehr schlechtes Beispiel, das ist glücklicherweise nicht das, was ich mache. Ich aktualisiere meine Problembeschreibung. Ich würde es vorziehen, Wx in einer Klasse zu halten, ohne die WX-Bibliothek auch in mainClass importieren zu müssen, aber wenn ich Ihren Code hinzufügen, mein WX-UI-Element. I Weg zu ich muss immer noch Punkt 2 lösen) – aless80

Verwandte Themen