我有一个应用程序,当按下按钮时尝试生成文本。大多数情况下,文本生成速度很快,但有一个函数需要大约 20 秒才能执行(取决于文本量)。在此过程中,GUI 经常冻结,因此我将该函数转移到一个单独的线程上,并且该字段上的一切都很好。
现在我遇到了按钮问题。当需要一些时间执行的函数正在运行时,用户仍然可以单击该按钮,并且该函数将在第一次调用仍在处理时执行多次。
我想通过在该函数运行时禁用所有按钮来防止这种情况,但我无法让线程正常工作。
这是我的代码:
def generate_text():
choice = dropdown_choice.get()
if context_obj.context_text.get() == '':
if choice == 'OpenAI':
context = 'Some random context text'
else:
context = ' '
else:
context = context_obj.context_text.get()
if choice == 'OpenAI':
progress.start(50)
progress_bar_text = Label(text='Please wait while the text is being generated',
background='#E5F2FF',
font=("Helvetica", 12))
progress_bar_text.place(relx=.2,
rely=.66,
anchor="c")
# multithreading for the OpenAI text generation
q = queue.Queue()
thread1 = Thread(target=openAI_generator.sample, args=[text_amount.get(), temperature.get(), context, q])
thread1.start()
def display_AI_text(q):
openAI_text = q.get()
generated_text.configure(state='normal')
generated_text.delete(1.0,END)
generated_text.insert(tk.END, openAI_text)
generated_text.configure(state='disabled')
progress.stop()
progress_bar_text.place_forget()
thread2 = Thread(target=display_AI_text, args=[q])
thread2.start()
在这段代码中,thread1
正在执行该函数并且thread2
正在从该函数获取输入并显示它。
我想做的是,同时thread2
正在执行时,所有按钮都将被禁用,当线程完成时,按钮将再次启用。
我尝试添加:
thread2 = Thread(target=display_AI_text, args=[q])
generate_button.config(state="disabled")
thread2.start()
进而:
thread2.join()
generate_button.config(state="normal")
但这段代码会冻结应用程序。我假设主线程正在等待thread2
完成,这就是它没有响应的原因。
有谁知道解决这个问题的方法?