2016-07-21 5 views
0

私はtkinterからwxPythonに切り替えています。下のwxexampleクラスに似たテンプレートwxPythonスクリプトを使用すると、継承について混乱します。以下の3つのスクリプト(mainClass.py、wxexample.py、callbacks.py)が与えられた場合、どうすればいいですか?wxPythonの起動と別のクラスの拡張

1)mainClassからwxPythonウィンドウを適切に起動します。

2)以下の例のクラスでは、以下のコールバッククラスを拡張してください。

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:

callbacks.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) 

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

解決しよう:私は基本に戻って、この解決策を見つけました。私は私の実際の実装にmainClassがエラーをスローし、他の理由でwxexample.Exampleを拡張したため

import callbacks as clb 
import wxexample 

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

if __name__ == "__main__": 
    instance = mainClass() 
    instance.main() 
(拠点例、コールバックのための一貫性のある方法で解決順序(MRO)を作成することはできません)混乱していた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() 

答えて

1

すべてwxPythonのアプリケーションは最低限、次のことを必要とする:

  1. wx.Appのインスタンスまたはに由来サブクラス
  2. 例えばwx.FrameなどのトップレベルのUI要素のインスタンス、wx.Dialog又は
  3. イベントループが示されている派生クラスは、ほとんど常に、アプリケーション・オブジェクトのMainLoopメソッドを呼び出すことによって実現。そのリストの光で

、私は、メインイベントループを使用して、またはそれに戻ってから、コントロールをブロックしていないとして、あなたはmain方法で表示whileループを心配し、あなたがしたいよりも多くの問題につながりますツールキットを学ぶだけで対処する。あなたは置き換えることができ、その中に以下の、それは正しい軌道に乗ってあなたを置くようなものを持つループ:でも、イベントハンドラは、常にイベントオブジェクトを渡されたとして、あなたはまた、mycallback追加のパラメータを与える必要があります

彼らがそれを必要としないならば。

あなたがまだの場合は、私がこのサイトでチュートリアルを読んでお勧めします。

+0

http://zetcode.com/wxpython/は、あなたの答えをいただき、ありがとうございます。 whileループは実際には非常に悪い例でした。これは幸運にも私がやっていることではありません。問題の説明を更新します。 wxライブラリをmainClassでもインポートしなくても、wxを1つのクラスに保つことを望みますが、wx UIエレメントのコードを追加すると、 私はまだ解決する必要がある方法2) – aless80

関連する問題