我有使用某些类的函数的线程,并且这些函数打印了很多东西,我想要在Text()小部件上显示。主线程和带线程的文本
所以我试图使该窗口的类为类变量和命令:主循环()似乎停止一切从持续....
是否有任何解决方案?
总体思路我想要做的:(控制台转换为图形用户界面。)
from tkinter import *
root = Tk()
textbox = Text(root)
textbox.pack()
def redirector(inputStr):
textbox.insert(INSERT, inputStr)
sys.stdout.write = redirector
root.mainloop()
整个代码:
import threading
from queue import Queue
from Spider import Spider
from domain import *
from general import *
from tkinter import *
def mmm(answer1,answer2,master): # answer1,answer2 are user inputs from the first GUI that gets info, master is the root so i can close it
master.destroy()
PROJECT_NAME = answer1
HOMEPAGE = answer2
DOMAIN_NAME = get_domain_name(HOMEPAGE)
QUEUE_FILE = PROJECT_NAME + '/queue.txt'
CRAWLED_FILE = PROJECT_NAME + '/crawled.txt'
NUMBER_OF_THREADS = 8
queue = Queue() # thread queue
Spider(PROJECT_NAME, HOMEPAGE, DOMAIN_NAME) # a class where the prints happen and some other functions.
root = Tk()
textbox = Text(root)
textbox.pack()
def redirector(inputStr):
textbox.insert(INSERT, inputStr)
sys.stdout.write = redirector
root.mainloop()
# create threads (will die when exit)
def create_threads():
for x in range(NUMBER_OF_THREADS):
t = threading.Thread(target=work)
t.daemon = True
t.start()
# do the next link in the queue
def work():
while True:
url = queue.get()
Spider.crawl_page(threading.current_thread().name, url)
queue.task_done()
# each link is a new job
def create_jobs():
for link in file_to_set(QUEUE_FILE):
queue.put(link) # put the link in the thread queue
queue.join() # block until all processed
crawl()
# if there are items in the queue, crawl them
def crawl():
queued_links = file_to_set(QUEUE_FILE)
if len(queued_links) > 0:
print(str(len(queued_links)) + ' links in the queue')
create_jobs()
create_threads()
crawl()
咋,所以我得到了这个错误,它需要在主线程中...这是什么意思? –
我无法用您提供的代码示例在这里重现您的问题......它运行并在tkinter窗口中显示一个空文本小部件。我相信它的行为与你编码的一样。现在,如果你想要的是有一个文本小部件实时显示无论在控制台中显示的任何内容,并且还对用户输入作出反应,它将是一个更复杂的任务。我不确定是否有可能,但可能有一些限制。 –
是我的坏我没有链接我的主代码....这只是例子虐待编辑它1秒 –