9

私が tkinter を使用して構築している GUI の一部には、「プログラムの実行中はお待ちください」というポップアップ ウィンドウがあります。それが終了すると、ウィンドウは消えます。widget.after コマンドを使用して、ウィンドウを開いてコマンドを実行しています。ただし、引数を呼び出す関数を渡すと、ポップアップ ウィンドウは表示されません。次に例を示します。

def backupWindow
    self.restoreCB = Toplevel()

    message = "Please wait while backup runs"
    Label(self.restoreCB, text=message, padx=100, pady=20).pack()

    widget.after(10, self.runBackup)

def runBackup(self):
    <backup code>
    self.backupCB.destroy()

これは正常に実行され、やりたいことを実行します。バックアップの実行中にウィンドウがポップアップし、バックアップ後にウィンドウが閉じます。ただし、以下のコードのようにwidget.afterからand引数を渡すと、「しばらくお待ちください」というメッセージは表示されません。

def backupWindow
    self.restoreCB = Toplevel()

    message = "Please wait while backup runs"
    Label(self.restoreCB, text=message, padx=100, pady=20).pack()

    widget.after(10, self.runBackup(mybackup))

def runBackup(self,mybackup):
    <backup code using mybackup>
    self.backupCB.destroy()
4

3 に答える 3

34

これを行うとき:

widget.after(10, self.runBackup(mybackup))

...あなたはTkinterに「コマンドrunBackupを実行し、それが戻ってきたら、その結果を引数として使用する」と言っていますafterrunBackupを返すためNone、上記は次と同等です。

self.runBackup(mybackup)
widget.after(10, None)

代わりに、関数を呼び出すのではなく、関数への参照をafter指定する必要があります。コマンドに引数が必要な場合は、それらを追加の引数として指定できます。after

例えば:

widget.after(10, self.runBackup, mybackup)
于 2012-06-14T22:47:16.207 に答える
2

functools.partial を試して、次のように呼び出しをラップします。

widget.after(10, functools.partial(self.runBackup, mybackup))

または、引数を取らずにパラメーターを渡すローカル関数を定義することもできます (これは本質的に functools.partial が行うことです)。

于 2012-06-14T19:55:09.553 に答える
0

追加: Lambda 関数形式を使用すると、何度か再帰呼び出しを行っても関数が失敗しません。例えば:

Function abc(par):
           stat-1
           stat-2
           ...
           stat-n
           root.after(1000, lambda : abc(par))

    ...

(たとえば、ウィンドウの左上にあるタイムクロックを更新すると非常に便利です...)

于 2019-04-24T21:18:25.803 に答える