Tkinter GUI freezing, used Thread then encountered RuntimeError: threads can only be started once

MRAB python at mrabarnett.plus.com
Tue Jan 10 13:32:32 EST 2023


On 2023-01-10 14:57, Abhay Singh wrote:
> Here is the entire code snippet of the same.
> 
> Please help
> 
> 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)
> 
The formatting is messed up, which doesn't help.

Some points:

You have a 'bare' except, i.e. "except:". Don't do that. It swallows 
_all_ exceptions and can hide bugs.

I don't like how you're passing Thread...start as an argument. IMHO, it 
would be better/cleaner to pass a plain function, even if the only thing 
that function does is to start the thread.

I can't tell what 'change_flag' is doing because of the formatting 
issue. Is it doing GUI stuff? In a thread? If yes, don't do that. The 
GUI doesn't like that. Only the main thread should do GUI stuff.


More information about the Python-list mailing list