Tkinter GUI冻结,使用线程然后遇到RuntimeError:线程只能启动一次



请帮忙

def change_flag(top_frame, bottom_frame, button1, button2, button3, button4, controller):
global counter, canvas, my_image, chosen, flag, directory
canvas.delete('all')
button5['state'] = DISABLED
counter += 1
chosen, options_text = function_options()
right_answer_flag = get_right_answer_flag(chosen, options_text)
#pdb.set_trace()
try:
location = directory + chosen + format_image
except:
controller.show_frame(PlayAgainExit)

my_image = PhotoImage(file=location)
canvas.create_image(160, 100, anchor=CENTER, image=my_image)
button1["text"] = options_text[0]
button2["text"] = options_text[1]
button3["text"] = options_text[2]
button4["text"] = options_text[3]
button1['state'] = NORMAL
button2['state'] = NORMAL
button3['state'] = NORMAL
button4['state'] = NORMAL
##############
button5 = Button(
next_frame,
width=20,
text="next",
fg="black",
#command=lambda: change_flag(top_frame,bottom_frame,button1,button2,button3,button4,controller))
command=Thread(target=change_flag, args =(top_frame,bottom_frame,button1,button2,button3,button4,controller)).start)

button5.pack(side=RIGHT, padx=5, pady=5)

你好,

我不希望GUI冻结,所以我使用了button5的线程,但它给了我运行时错误你只能启动一个线程。这是正确的。但是我该如何解决这个问题呢?

谢谢你的帮助,Abhay

command=Thread(target=change_flag, args=(top_frame,bottom_frame,button1,button2,button3,button4,controller)).start

是创建线程对象的实例,并将该实例的start函数的引用传递给command选项。如下所示:

# create an instance of the thread object
t = Thread(target=change_flag, args=(top_frame,bottom_frame,button1,button2,button3,button4,controller))
# pass the start function of the thread object to command option
button5 = Button(..., command=t.start)

当按钮被点击时,它启动线程。当再次点击该按钮时,将再次启动相同的线程实例,这是不允许的。

您可以使用lambda,这样当按钮被点击时,线程对象的一个新实例被创建并启动:

button5 = Button(..., command=lambda: Thread(target=change_flag, args=(top_frame,bottom_frame,button1,button2,button3,button4,controller)).start())

相关内容

  • 没有找到相关文章

最新更新