2016-03-01 2 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() 

Кажется, проблема с текстовым виджетам, но я не знаю, что с этим не так. Когда я удаляю строку вставки, поле появляется с заголовком, но с этой строкой оно не появляется. В чем проблема?

+0

Что именно вы хотите сделать в новой теме? – cdonts

+0

@cdonts Я хочу запустить mainloop как нить, поэтому я могу заставить программу делать другие вещи, пока окно tkinter не работает. –

+0

Вместо этого вы должны запустить mainloop в основном потоке и запустить новые потоки, когда программе нужно делать другие вещи. – cdonts

ответ

0

Я думаю, что ваша проблема заключается в том, что вы инициализируете Tkinter на mainthread, а затем ссылаетесь на кадр Chat (который использует корень из mainthread) в фоновом потоке. Я ожидал, что это может вызвать некоторые проблемы. Не имея большого знания внутренних органов, я решил проверить эту теорию, написав код немного по-другому. Я переписал ваш код, поэтому инициализация root и чат в той же теме, и это делает трюк.

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() 

Надеюсь, что это поможет.

Смежные вопросы