2016-03-01 63 views
0

我在学习使用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') 
     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但该行,它不会出现。它有什么问题?

+0

在新线程中究竟想做什么? – cdonts

+0

@crest我想将主循环作为一个线程来启动,这样我可以让程序在tkinter窗口启动时执行其他操作。 –

+0

相反,您应该在主线程中运行主循环,并在程序需要执行其他操作时启动新线程。 – cdonts

回答

0

我认为你的问题是你正在初始化主线程上的Tkinter,然后在后台线程上调用Chat帧(它使用来自mainthread的根)。我预计这可能会导致一些问题。在不了解内部知识的情况下,我决定用略微不同的方式编写代码来测试这个理论。我已经重新编写了你的​​代码,所以和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() 

希望有帮助。

相关问题