1

Tkinterでwithdraw()/deiconify()を使用してアプリケーションの非表示/表示を実行しようとしていますが、deiconify()メソッドを呼び出した後、アプリがハングします。このコードを Win7 で実行します。私は何を間違っていますか?

import Tkinter as tk
import threading


class MyApp(object):
    def __init__(self, parent):
        self.root = parent
        self.root.geometry('400x300')
        self.root.title('My Application')

        btn = tk.Button(parent, text='Hide', command=self.onClick)
        btn.pack()

    def onClick(self):
        self.hide()
        self.t = threading.Timer(3, self.show)
        self.t.start()

    def hide(self):
        print 'hide()'
        print 'state: ', self.root.state()
        print 'withdraw()'
        self.root.withdraw()
        print 'state: ', self.root.state()

    def show(self):
        print 'show()'
        print 'state: ', self.root.state()
        print 'deiconify()'
        self.root.deiconify()
        print 'state: ', self.root.state()
        print 'show end'

if __name__ == '__main__':
    root = tk.Tk()
    app = MyApp(root)
    root.mainloop()

UPD: 作業サンプルがあります:

import Tkinter as tk
import sched
import time


class MyApp(object):
    def __init__(self, parent):
        self.root = parent
        self.root.geometry('400x300')

        btn = tk.Button(parent, text='Hide', command=self.onClick)
        btn.pack()

        self.scheduler = sched.scheduler(time.time, time.sleep)

    def onClick(self):
        self.hide()
        self.scheduler.enter(3, 1, self.show, ())
        self.scheduler.run()

    def hide(self):
        self.root.withdraw()

    def show(self):
        self.root.deiconify()

if __name__ == '__main__':
    root = tk.Tk()
    app = MyApp(root)
    root.mainloop()
4

1 に答える 1

1

Tkinter はスレッド セーフではなくself.root.deiconify()、スレッドから呼び出しています。それがあなたの問題の原因である可能性が最も高いです。スレッドがスレッド セーフ キューを使用してメイン ループが Tkinter を呼び出すように要求するには、ソリューションを再設計する必要があります。

スレッドを使用せずに Tkinter でできることはたくさんあります。それらが必要だと確信していますか?

于 2012-10-29T11:16:23.317 に答える