所以我在一个类中运行了两个python线程。我已经使用
进行了检查threading.active_count()
它说两个线程都在运行。第一个线程包括一个工作正常的tkinter窗口。我用作第一个窗口的事件管理器的第二个线程,它本身也可以正常工作。但是,当我在第一个线程旁边运行第二个线程时,第一个线程不起作用,即。窗口没有出现。即使首先执行第一个线程,这也是如此。当我从第二个线程中删除无限循环时,第一个线程再次起作用,有人可以向我解释这个吗?这是班级:
class Quiz(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def show(self, question):
self.question = quiz[question][0]
self.correct = quiz[question][1]
self.incorrectA = quiz[question][2]
self.incorrectB = quiz[question][3]
self.ref = quiz[question][4]
questionDisplay.config(text=self.question)
correctButton = "answer" + str(self.ref[0])
eval(correctButton).config(text=self.correct, command=lambda : check(True))
incorrect1 = "answer" + str(self.ref[1])
eval(incorrect1).config(text=self.incorrectA, command= lambda : check(False))
incorrect2 = "answer" + str(self.ref[2])
eval(incorrect2).config(text=self.incorrectB, command= lambda : check(False))
return self.correct
def run(self):
print("thread started")
print(threading.active_count())
while True:
print(questionQueue.qsize())
if questionQueue.qsize() >= 1:
pass
else:
pass
print("looped")
由于
答案 0 :(得分:1)
从目前显示的代码中,问题出在哪里并不明显。但请记住以下几点;
Tk是基本上所有GUI工具包的事件驱动。因此,要使GUI工作,您需要运行Tk' mainloop
。它在主循环中运行的代码中唯一的部分是附加到按钮,菜单和计时器等各种回调。
与大多数GUI工具包一样,由于需要的开销,Tk不是线程安全的。为了使其正常工作,您应该只从一个线程中调用Tk函数和方法。
Python的线程是操作系统线程。这意味着它们受操作系统调度的影响。操作系统有时会为繁忙的线程提供更多时间。因此,如果在繁忙循环中旋转的线程被抢占(如定期执行),则可能最终再次运行而不是GUI线程。