【问题标题】:Why is threading not showing Tkinter window?为什么线程不显示 Tkinter 窗口?
【发布时间】:2016-03-01 18:57:16
【问题描述】:

我在学习使用 Tkinter 时编写了一些代码,当我尝试线程化它时,它没有显示窗口,但是当它只运行主循环时它会显示。

import socket,threading,time
from Tkinter import *

class Chat(Frame):
    def __init__(self,root):
        Frame.__init__(self,root)
        self.text=Text(self, bg='black', fg='white')
        self.text.configure(state=DISABLED)
        self.text.configure(state=NORMAL)
        self.text.insert(END, 'hello\n'*40)
        self.text.configure(state=DISABLED)
        self.text.pack()

def main():
    root=Tk()
    root.configure(background='black')
    c=Chat(root)
    c.pack()
    root.mainloop()
    #t=threading.Thread(target=root.mainloop)
    #t.start()


if __name__=='__main__':
    main()

这似乎是文本小部件的问题,但我不知道它有什么问题。当我删除插入行时,该框会出现带有 trheading 但该行不会出现。它有什么问题?

【问题讨论】:

  • 在新线程中到底想做什么?
  • @cdonts 我想将主循环作为线程启动,这样我就可以在 tkinter 窗口启动时让程序执行其他操作。
  • 相反,您应该在主线程中运行 mainloop,并在程序需要执行其他操作时启动新线程。

标签: python multithreading tkinter


【解决方案1】:

我认为您的问题是您在主线程上初始化 Tkinter,然后在后台线程上调用 Chat 框架(使用主线程中的根)。我预计这可能会导致一些问题。在没有太多内部知识的情况下,我决定通过稍微不同的代码来测试这个理论。我已经重写了你的代码,所以 root 和 Chat 的初始化是在同一个线程上的,它可以解决问题。

import threading
from Tkinter import *

class Chat(Frame):
    def __init__(self,root):
        Frame.__init__(self,root)
        self.text=Text(self, bg='black', fg='white')
        self.text.configure(state=DISABLED)
        self.text.configure(state=NORMAL)
        self.text.insert(END, 'hello\n'*40)
        self.text.configure(state=DISABLED)
        self.text.pack()

def run():
    root=Tk()
    root.configure(background='black')
    c=Chat(root)
    c.pack()
    root.mainloop()

def main():
    t=threading.Thread(target=run)
    t.start()
    t.join()


if __name__=='__main__':
    main()

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 2014-08-06
    • 2017-07-11
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多