当加载图标并且tk.mainloop在线程中时,Tkinter锁定Python

当加载图标并且tk.mainloop在线程中时,Tkinter锁定Python,第1张

当加载图标并且tk.mainloop在线程中时,Tkinter锁定Python

我相信您不应该在其他线程上执行循环。AFAIK,主循环应在创建窗口小部件的同一线程上执行。

我熟悉的GUI工具包(Tkinter,.NET Windows窗体)就是这种方式:您只能从一个线程 *** 作GUI。

在Linux上,您的代码引发异常:

self.tk.mainloop(n)RuntimeError:从其他位置调用Tcl

以下之一将起作用(没有额外的线程):

if __name__ == '__main__':    t = tk.Tk()    t.iconbitmap('icon.ico')    b = tk.Button(text='test', command=exit)    b.grid(row=0)    t.mainloop()

带有额外的线程:

def threadmain():    t = tk.Tk()    t.iconbitmap('icon.ico')    b = tk.Button(text='test', command=exit)    b.grid(row=0)    t.mainloop()if __name__ == '__main__':    thread.start_new_thread(threadmain, ())    while 1:        sleep(1)

如果需要从tkinter线程外部与tkinter进行通信,建议您设置一个计时器来检查工作队列。

这是一个例子:

import Tkinter as tkimport threadfrom time import sleepimport Queuerequest_queue = Queue.Queue()result_queue = Queue.Queue()def submit_to_tkinter(callable, *args, **kwargs):    request_queue.put((callable, args, kwargs))    return result_queue.get()t = Nonedef threadmain():    global t    def timertick():        try: callable, args, kwargs = request_queue.get_nowait()        except Queue.Empty: pass        else: print "something in queue" retval = callable(*args, **kwargs) result_queue.put(retval)        t.after(500, timertick)    t = tk.Tk()    t.configure(width=640, height=480)    b = tk.Button(text='test', name='button', command=exit)    b.place(x=0, y=0)    timertick()    t.mainloop()def foo():    t.title("Hello world")def bar(button_text):    t.children["button"].configure(text=button_text)def get_button_text():    return t.children["button"]["text"]if __name__ == '__main__':    thread.start_new_thread(threadmain, ())    trigger = 0    while 1:        trigger += 1        if trigger == 3: submit_to_tkinter(foo)        if trigger == 5: submit_to_tkinter(bar, "changed")        if trigger == 7: print submit_to_tkinter(get_button_text)        sleep(1)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5647151.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存