Python 为什么线程不显示Tkinter窗口?

Python 为什么线程不显示Tkinter窗口?,python,multithreading,tkinter,Python,Multithreading,Tkinter,我在学习使用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')

我在学习使用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,但该行不显示。它有什么问题?

我认为您的问题在于您在主线程上初始化Tkinter,然后在后台线程上调用聊天框(使用主线程的root)。我想这可能会引起一些问题。在没有太多内部知识的情况下,我决定通过编写稍微不同的代码来测试这个理论。我已经重新编写了您的代码,因此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()

希望这能有所帮助。

我认为您的问题在于您在主线程上初始化Tkinter,然后在后台线程上调用聊天框(使用主线程的root)。我想这可能会引起一些问题。在没有太多内部知识的情况下,我决定通过编写稍微不同的代码来测试这个理论。我已经重新编写了您的代码,因此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()

希望这能有所帮助。

在新线程中到底想做什么?@cdonts我想以线程的形式启动mainloop,这样我就可以在tkinter窗口打开时让程序做其他事情。相反,你应该在主线程中运行mainloop,并在程序需要做其他事情时启动新线程。在新线程中到底想做什么新线程?@cdonts我想以线程的形式启动mainloop,以便在tkinter窗口打开时让程序执行其他操作。相反,您应该在主线程中运行mainloop,并在程序需要执行其他操作时启动新线程。