gpt4 book ai didi

python - 主循环和带有线程的文本

转载 作者:行者123 更新时间:2023-12-01 03:01:26 25 4
gpt4 key购买 nike

我有一些线程使用某些类的函数,这些函数打印很多我想在 Text() 小部件上显示的内容。

所以我尝试将类中的窗口作为类变量,并且命令:mainloop() 似乎阻止了一切继续......

有什么解决办法吗?

我想做的总体想法:(将控制台转换为 GUI..)

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

最佳答案

一旦启动mainloop(),您就会得到一个循环运行的事件驱动应用程序。放置在 root.mainloop() 行之后的任何代码将仅在 GUI 终止后运行。您的 GUI 应该或多或少是独立的。您用 tkinter 小部件填充它,这些小部件将绑定(bind)一些事件,每个事件都有其适当的回调函数。

但是请注意,tkinter 不是线程安全的。您需要很好地分离主题代码,例如确保它不会调用任何 GUI 小部件。在 this page您可以找到有关如何使用 tkinter 进行线程处理的 Python2 示例。

但也许您甚至不需要线程。例如,您可以使用 after() 安排一个函数每 X 秒运行一次,它可以读取更新的日志文件或从数据库获取更新的值,并相应地更新 GUI。您可以在 this page 中找到一些示例和说明。 .

关于python - 主循环和带有线程的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43781334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com