Using Queue with tkinter (and threading)(将队列与 tkinter(和线程)一起使用)
问题描述
我在 Python 3 中有一个脚本,我正在尝试使用 tkinter 为它制作一个 GUI.
I have a script in Python 3 and I'm trying to make a GUI for it using tkinter.
这是一个完整的工作代码示例:
Here is a complete example of working code:
您可以运行它并查看工作窗口.
You can run it and see the working window.
我有几个问题.
这个 GUI 的想法是有 3 个按钮 - 开始运行、停止运行和清除文本窗口.文本窗口 - 应该替代控制台 - 所有消息都应该在文本窗口中打印,而不是控制台.
The idea of this GUI - is that there are 3 buttons - start running, stop running, and clear text window. Text window - should be a substitute for a console - all messages should be printed in text window, instead of console.
现在我使用队列来打印消息.但我想我用错了——因为每次放东西后我都需要手动检查队列.
For now I'm using queue to print messages. But I guess I'm using it in a wrong way - because I need manually to check the queue every time after I put something there.
所以,问题:
有没有办法自动检查队列一直 - 并立即将进入队列的所有内容打印到文本窗口,无论它来自哪个线程?(每次放东西后我都可以忍受检查队列,但是会有几个函数无法预测他们将发送东西多少次到队列中 - 所以我将无法检查队列是否未知次数.)
Is there a way to check queue autamatically all the time - and instantly print to text window everything which gets to the queue, no matter from which thread it came there? (I can put up with checking queue every time after I put something there, but there will be couple of functions where it is impossible to predict how many times they will send something to queue - so I will not be able to check queue for unknown number of times.)
如果您回答第一个问题,我将考虑已回答的问题.
其他问题是可选的.
I will consider the question answered if you answer the first question.
Other questions are optional.
我是否正确启动了 GUI?它应该在 __init__()
还是其他地方?
Am I starting the GUI correctly? Should it be in the __init__()
or somewhere else?
如何隐藏控制台窗口?(尝试重命名为 .pyw - 控制台和 GUI 均未出现.尝试将 self.root.withdraw()
放在 self.root = Tk()
之后 - 结果:控制台出现了,GUI - 没有.)
how to hide the console window? (tried renaming to .pyw - neither console, nor GUI showed up. Tried putting self.root.withdraw()
after self.root = Tk()
- the result: console showed up, GUI - not.)
这段代码中是否有任何笨拙或愚蠢的地方(GUI、线程、队列)?我使用几本手册编写了这段代码,所以我可能会误解其中的部分或全部,并以错误的方式进行操作.
Is there any clumsy or stupid places in this code (GUI, threading, queue)? I wrote this code using several manuals, so I could be misunderstanding some or all of them and do it in a wrong way.
推荐答案
发现很简单:在这个函数中
It figured out to be quite simple: in this function
应该再添加一个对自身的调用 - 即使在成功打印之后也是如此.在此之后 - 我可以从任何地方将文本发送到队列,并且在将文本发送到队列后立即打印它而无需调用此函数.
should be added one more call to itself - even after successfull printing. After this - I can send text to queue from anywhere and it will be printed without calling this function right after sending text to queue.
那么现在
可以在任何线程中使用.而不是
can be used in any thread. Instead of
像以前一样双线.
这篇关于将队列与 tkinter(和线程)一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!