У меня есть приложение, которое пытается генерировать текст при нажатии кнопки.Большую часть времени генерация текста происходит быстро, но есть одна функция, выполнение которой занимает около 20 секунд (в зависимости от объема текста).Во время этого процесса графический интерфейс пользователя зависал, поэтому я перенес эту функцию в отдельный поток, и в этом поле все нормально.
Теперь у меня проблема с кнопками.Когда функция, выполнение которой занимает некоторое время, пользователь все равно может нажать кнопку, и эта функция будет выполняться несколько раз, пока обрабатывается первый вызов.Я хотел бы предотвратить это, отключив все кнопки во время работы этой функции, но я не могу заставить потоков работать должным образом.
Вот код, который у меня есть:
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
, и поэтому он не отвечает.
Кто-нибудь знает способ преодоления этой проблемы?