5

http://effbot.org/tkinterbook/tkinter-dialog-windows.htmに基づくcustomDialogというクラスを使用しています。 標準コードは、サブクラスを作成するクラスを作成し、Toplevelモーダルダイアログを作成します。モードレスダイアログも作成できるようにコードを調整しようとしています。標準コードはToplevelコンストラクターを呼び出し、ダイアログを作成し self.wait_window(self)てから最後に実行します。これは、ダイアログウィンドウが閉じられるまで待機します。しかし、私は成功していません。

私の素朴な試みは、単にスキップすることでしたwait_window()(これは、以下に抜粋した私のコードの試みです)。他にもいくつか試しましたが、ダイアログはモーダルのままです。つまり、アプリケーションのメインウィンドウを操作できません。何がそれをモーダルにすることを強制していますか?ダイアログには、通常、ウィジェットといくつかのボタンが含まれています。

class Dialog(Toplevel):

    def __init__(self, parent, title = None,modal=True):
        Toplevel.__init__(self, parent)
        self.transient(parent)
        if title:
            self.title(title)
        self.parent = parent
        self.result = None
        body = Frame(self)
        #register validators
        self.validatePosInt = (body.register(self.OnValidatePosInt),
                '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')

        self.initial_focus = self.body(body)   #this calls the body function which is overridden, and which draws the dialog
        body.grid()
        self.buttonbox()
        self.grab_set()
        if not self.initial_focus:
            self.initial_focus = self
        self.protocol("WM_DELETE_WINDOW", self.cancel)
        self.geometry("+%d+%d" % (parent.winfo_rootx()+50,
                                  parent.winfo_rooty()+50))
        self.initial_focus.focus_set()

        if modal:
            self.wait_window(self)
4

1 に答える 1

6

を示す行を削除しますself.grab_set()。「グラブ」とは、すべてのイベントを取得して、不要なこのウィンドウに向けることを意味します。

コードを入手したWebページをもう少し深く読むと、この正確な行とその理由が記載されていることがわかります。

...次に、コンストラクターはダイアログ本体を作成し、grab_setを呼び出してダイアログをモーダルにします

于 2011-10-07T12:42:00.473 に答える