我有一些线程使用一些类的函数,这些函数打印很多我想在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()
整个代码:
^{pr2}$
一旦启动
mainloop()
,就会得到一个循环运行的事件驱动应用程序。行后的任何代码根.mainloop()将仅在GUI终止后运行。您的GUI应该或多或少是自包含的。用tkinter小部件填充它,这些小部件将绑定一些事件,每个事件都有适当的回调函数。在但是请注意,tkinter不是线程安全的。例如,您需要很好地分离编码代码,确保它不会调用任何GUI小部件。在this page中,您可以找到一个Python2示例,介绍如何使用tkinter执行线程。在
但也许你根本不需要线程。例如,您可以使用
after()
来计划每X秒运行一次函数,它可以读取更新的日志文件或从数据库中获取更新的值,并相应地更新GUI。您可以在this page中找到一些示例和说明。在@Victor Domingos的提到对您的情况非常有用,但是您真正的问题是您自己的代码!首先,看看你的应用程序的结构,明白它很弱,没有冒犯性(你甚至把一个
master
传递给一个函数来destroy
它)。所以我建议您阅读Python中的类和继承(如果您还没有),然后看看here。在下一站-你的重定向器。您重新分配了
sys.stdout.write
,但从未保留它-因此它是另一个弱点。好吧,假设现在您保留了它,但是如果我们保持面向对象的方法-我更喜欢this选项。在另外,真的有必要} while ^{} is active 。太棒了,不是吗?在
destroy
这个master
?对于输出,您可以使用一个Toplevel
小部件,如果您删除master
只是为了避免两个mainloop
。You can even hide ^{最后,回答你关于解决方案的问题。没有直接的解决办法,只有一个:阅读并尝试。你已经回答了为什么为什么
mainloop
停止一切,但是你的问题非常广泛。在我试着复制你的完整程序(2窗口应用程序,第一个用户输入,第二个类似控制台和线程的打印任务示例),下面是一个代码:
如你所见-我从不在
mainloop
中被绊倒(当我不需要它的时候),因为我在事件上创建线程:Spawner的__init__
(多亏了继承)和一个按钮点击事件。当然,这只是许多方法中的一种,但我希望现在你的问题对你更清楚些。在相关问题 更多 >
编程相关推荐