0

wxpython を使用して gui アプリを構築しています。2 つの異なるファイル、つまり app1.py と app2.py に 2 つの個別のウィンドウを作成しました。最初のウィンドウ (app1.パイ)。どうすればこれを達成できますか。誰かが助けてくれたら最高です、ありがとう!!

4

1 に答える 1

3

wxPython の "window" の定義 (つまり、GUI で実際に表示できるもの) を使用していると想定しています。通常の "物が入った別のボックスと隅に X ボタンがある" (wxPython は a を呼び出します) の定義ではありません。 "フレーム")

私が最初の wxPython GUI を書いていたとき、私は同様の問題に直面しました。あるパネルでのアクションが、別のパネルに表示されるデータに影響するようにしたかったのです。私の最初の解決策は、リクエストをパネルの親にやみくもに渡すメソッドを作成することでした。これは、トップ レベル (私の「メイン フレーム」) に到達するまで続きます。これはうまくいきましたが、明らかにひどい解決策です。

私の 2 番目の解決策は、wx.Panel のボタンの押下をキャッチするのと同じように、wxPython イベントを使用することでした。私のアイデアは、あるフレームでボタンを作成し、別のフレームで wx.EVT_BUTTON をそのボタンの ID にバインドすることでした。カスタム イベントと CommandEvents を作成しました。このソリューションを実装しようとしているときに、それが伝達されず、CommandEvents が親を介してのみ伝達されることを発見しました。そのため、CommandEvent をキャッチしないままにしておくと、最終的に「メイン フレーム」にヒットしますが、2 番目のパネルがたまたまイベントの発生元の親でない限り、2 番目のパネルにヒットすることはありません。親を非表示にすることはできませんが、子を表示できるため、これは明らかに機能しません。さらに、コマンドを委任するためのコードとメソッドでメイン フレームが雑然としたままになります。

最後に、私は答えを見つけました!wx.lib.pubsub! 基本的には、通常どおり app1.py でボタンの押下をバインドします。ここで、ハンドラーで pubsub を使用してカスタム メッセージを発行します。次に、app2.py の init で、pubsub を使用してカスタム メッセージをサブスクライブします (すべてのメッセージを定数として宣言する "message.py" を用意するのが好きです)。メッセージをサブスクライブするときは、イベントの場合と同様に、ハンドラー メソッドを割り当てます。\

これを読んでください:http://wiki.wxpython.org/WxLibPubSub

ウィンドウを APPEAR にしたいと言ったので、おそらく app2.py の init メソッドで Hide() メソッドを呼び出し、メッセージを受け取ったら Show() を呼び出します。

これをアプリケーションに実装したとき、wxPython2.8 を使用していました。私は現在 2.9 を使用しているので、これがまだ必要かどうかはわかりませんが、pubsub.subscribe() と pubsub.sendMessage() を呼び出すためにトップ インポートが必要であることがわかりました。そうしないと、エラーが発生し続けました。どうやってこれを見つけたのか覚えていません。コード サンプルでそれを見て、自分のコードを機能させるために必死になって追加したと思います。上記でリンクしたドキュメントを読み、最初にそのインポートなしでコードを実装することをお勧めします。

import wx
from wx.lib.pubsub import setupkwargs #I need this to force pubsub to work. I don't know why.
from wx.lib.pubsub import pub

ID_MYBUTTON = wx.NewId()

class App1(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init___(self, parent)

        button = wx.Button(self, ID_MYBUTTON, "Show App2")
        self.Bind(wx.EVT_BUTTON, self.handleButton, id=ID_MYBUTTON

    def handleButton(self, event):
        pubsub.sendMessage("mybutton.pressed") #send the message

class App2(wx.Window):
    def __init__(self, parent):
        wx.Window.__init__(self, parent)

        self.Hide() #I don't want to be seen yet

        pubsub.subscribe(self.gotMessage, "mybutton.pressed") #listen for the message

    def gotMessage(self):
        self.Show() #Now I want to be seen!

- - -編集 - - -

私は役立つかもしれないこのSOの質問を見つけました:wxPythonでメインフレームの子フレームを作成する

あなたがしようとしていることを詳しく教えてください。wxPython には「ダイアログ」もあります。これは、ユーザーにメッセージを表示したり、もう少し情報を求めたりするだけであれば、フレームよりも優れています。http://wxpython.org/docs/api/wx.Dialog-class.html

それは本当にあなたが達成しようとしていることに依存します。どのような問題を解決しようとしているのかを説明しない限り、私たちはあなたを助けることができません.

-----AGIAN編集-----

質問者は実際にwx.Dialogが欲しかったようです。チュートリアルについては、http://zetcode.com/wxpython/dialogs/を参照してください。Python WX - wx ダイアログからユーザー入力を返すも参照してください。

于 2012-05-19T13:02:51.877 に答える