9

TkInter を使用していくつかのダイアログを作成していますが、親のボタンをクリックすると子サブウィンドウ (モーダルまたはモードレス) を開くことができるようにする必要があります。次に、子はデータ レコードの作成を許可し、このデータ (レコードまたは操作がキャンセルされた場合) を親ウィンドウに戻す必要があります。これまでのところ、私は持っています:

import sel_company_dlg

from Tkinter import Tk

def main():
    root = Tk()
    myCmp = sel_company_dlg.SelCompanyDlg(root)
    root.mainloop()

if __name__ == '__main__':
    main()

これにより、ユーザーが会社を選択できるトップレベルのダイアログが呼び出されます。会社選択ダイアログは次のようになります。

class SelCompanyDlg(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent_ = parent
        self.frame_ = Frame( self.parent_ )
        // .. more init stuff ..
        self.btNew_ = Button( self.frame_, text="New ...", command=self.onNew )

    def onNew(self):
        root = Toplevel()
        myCmp = company_dlg.CompanyDlg(root)

[新規... ] ボタンをクリックすると、[会社の作成] ダイアログが表示され、ユーザーは会社の詳細を入力して [作成] または [キャンセル] をクリックできます。その冒頭部分は次のとおりです。

class CompanyDlg(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        // etc.

子ダイアログを呼び出す最良の方法に苦労していますonNew()-私が持っているものは機能しますが、それが最良のアプローチであるとは確信していません。

私はオンラインのチュートリアルや参考文献を見てみましたが、私が見つけたものは単純すぎるtkMessageBox.showinfo()か、私が望んでいるものではないようなことに焦点を当てています.

4

2 に答える 2

12

問題を解決するには、少なくとも2つの方法があります。ダイアログがメインアプリケーションに情報を直接送信するか、ダイアログがデータが実際にダイアログからプルされることをメインアプリケーションに通知するイベントを生成することができます。ダイアログが単に何かの外観を変更する場合(たとえば、フォントダイアログ)、私は通常、イベントを生成します。ダイアログがデータを作成または削除する場合、私は通常、情報をアプリケーションにプッシュバックします。

私は通常、GUI全体のコントローラーとして機能するアプリケーションオブジェクトを持っています。多くの場合、これはメインウィンドウと同じクラスであるか、別のクラスであるか、ミックスインとして定義されている場合があります。このアプリケーションオブジェクトには、ダイアログがデータをアプリケーションにフィードするために呼び出すことができるメソッドがあります。

例えば:

class ChildDialog(tk.Toplevel):
    def __init__(self, parent, app, ...)
        self.app = app
        ...
        self.ok_button = tk.Button(parent, ..., command=self.on_ok)
        ...
    def on_ok(self):
        # send the data to the parent
        self.app.new_data(... data from this dialog ...)

class MainApplication(tk.Tk):
    ...

    def on_show_dialog(self):
        dialog = ChildDialog(self)
        dialog.show()

    def new_data(self, data):
        ... process data that was passed in from a dialog ...

ダイアログを作成するときに、アプリケーションオブジェクトへの参照を渡します。次に、ダイアログは、このオブジェクトの特定のメソッドを呼び出して、データをアプリケーションに送り返すことを認識します。

モデル/ビュー/コントローラー全体に興味がない場合は、オブジェクトではなく関数を簡単に渡すことができ、「データを提供したいときにこの関数を呼び出す」というダイアログを効果的に伝えることができます。

于 2012-05-23T10:58:05.677 に答える