3

Tkinter メソッド "deiconify" は ubuntu(12.04、unity) では機能していないようですが、次のコードは Windows 7 で期待どおりに機能します。別のプロジェクトhttps://github. com/thinker3/youdao .

from time import sleep
from Tkinter import Tk

class GUI():
    def __init__(self):
        self.root = Tk()
        self.root.title("Test")
        self.root.protocol("WM_DELETE_WINDOW", self.close_handler)
        self.root.mainloop()

    def close_handler(self):
        self.root.iconify()
        sleep(1)
        self.root.deiconify()


if __name__ == '__main__':
    gui = GUI()
4

1 に答える 1

1

あなたが見ているのは、明らかに Windows と非 Windows の違いです。Windows の動作はバグのようです。少なくとも、これは予期された動作ではありません。あなたがubuntuで見ているのは、私が期待しているものです。

GUI が何かを行うには、イベント ループが実行されている必要があります。起こることはすべて、イベントへの応答です。画面上のウィンドウの描画は、イベントへの応答です。ボタンのクリックは、イベントへの応答です。ボタンが押されたときの視覚効果は、イベントへの応答です。等々。

を呼び出すとiconify、「画面からウィンドウを削除する」というイベントがアプリに送信されます。イベント ループはイベントを認識し、ウィンドウを再描画 (または「描画解除」) します。呼び出すと逆のことが起こりますdeiconify。システムは再描画イベントを取得し、tkinter は画面上のウィンドウを再描画します。

コードでは、イベント ループにこれらのイベントに応答する機会を決して与えません。イベントループに応答する機会を与えずに、アイコン化するように要求し、スリープ状態にし、アイコン化を解除します。sleepコマンドの実行中は、イベントは処理されません。そのため、スリープから復帰すると、システムはウィンドウを非表示にし、マイクロ秒後にウィンドウを再描画します。

ウィンドウでおそらく起こっていることは、ウィンドウ マネージャーが iconfiy コマンドを取得し、tkinter の関与なしにウィンドウを削除していることです。言い換えれば、tkinter はそれをなくすために実際には何もしません。ただし、X11 ベースのシステムでは、これはすべてイベント ループによって管理されます。

ウィンドウを消し、2 秒後に再び表示する場合は、イベント ループを有利に使用します。イベント ループが画面を更新できるようにし、将来的に非アイコン化が行われるように調整します。例えば:

def close_handler(self):
    self.root.iconify()
    self.after(1000, self.root.deiconify)

これはすべてのプラットフォームで機能するはずです。これにより、イベント ループが iconify イベントに応答できるようになり、1 秒後に deiconify コマンドが実行されます。

于 2013-08-31T13:42:47.440 に答える