Окно Tkinter полностью зависает при его перемещении

Окно Tkinter просто полностью зависает со всеми виджетами, когда я перемещаю окно Tkinter, и это моя проблема. Я тестировал его с другим кодом, и он всегда делает то же самое.

Проблема исключительно с tkinter?

просто переместите окно tkinter слева направо, вы увидите, что абсолютно все программы зависают, это невероятно

Кто-то сказал поместить main в отдельный поток, но как? Как без примера я даже не знаю, что это значит :(

как вы помещаете потоки за пределы mainloop()? Что это означает ? Я поставил root.mainloop() перед thread1 = threading.Thread(target= lambda : fct(), daemon=True) thread1.start() и ничего не происходит

from tkinter import *
from tkinter import ttk 
import time
import threading
import win32api
import pyautogui 



root = Tk()
root.geometry('800x438')
root.resizable(False,False)
root.configure(bg='gray')


label = Label(root, text='Display content', fg='yellow', bg='black', font=('Arial', 13), width=20)
label.place(relx=0.5,rely=0.3)




firstentryvar = StringVar()
secondentryvar = StringVar()



firstentry = Entry(root, textvariable=firstentryvar , justify=CENTER, font = ('Arial', 12))
secondentry = Entry(root, textvariable=secondentryvar, justify=CENTER, font = ('Arial', 12))





def displaycontent(*args): 

    firstentry.pack()
    secondentry.pack()
    label.bind('<Button-1>', hidecontent)



def hidecontent(*args): 

    firstentry.pack_forget()
    secondentry.pack_forget()
    label.bind('<Button-1>', displaycontent)

    


label.bind('<Button-1>', displaycontent)

def function1(*args): 
     count = 0
     bool = False
     while count < 10: 
         
            for i in firstentry.get(): 
                if bool == False: 
                    count +=1 
                    print(i)
                    bool = True
                else: 
                    bool = False
              


def function2(*args): 
   while True: 
    if win32api.GetKeyState(0x45) < 0: 
          
          print('you pressed e')
  
    

thread1 = threading.Thread(target = lambda : function1(), daemon=True)
thread1.start()

thread2 = threading.Thread(target = lambda : function2(), daemon=True)
thread2.start()


   
root.mainloop() 

код может не иметь большого значения, но его достаточно, чтобы воспроизвести мой пример, вы заметите, что если вы нажмете на метку дисплея, а затем переместите окно, не вводя ничего в записи, окно будет глючить / зависать, почему?

У вас больше шансов получить ответ, если вы предоставите пример кода и укажете, какую систему и версии вы используете.

Robin Andrews 20.11.2022 22:22

Можете ли вы предоставить нам какой-нибудь код или хотя бы его минимальное воспроизведение? Должно быть что-то не так с кодом или что системной памяти недостаточно, чтобы он заморозил процесс. Пока вы делаете это правильно, вы можете заставить окно прыгать, как кролик, без каких-либо проблем.

Vuong Duong 20.11.2022 22:22

Хорошо, я предоставлю код редактирования: это проблема, если я не работаю с классами?

Meme410 20.11.2022 22:24

Как мы вчера обсуждали. Ваши темы блокируют ваш mainloop, вам нужно поместить блокирующий код вне mainloop. Кроме того, вам нужно проявлять большую осторожность при взаимодействии с tkinter из-за пределов потока, в котором работает tkinters mainloop.

Thingamabobs 20.11.2022 22:24

но как поместить их вне mainloop()? редактировать: я попробую что-нибудь, я не уверен

Meme410 20.11.2022 22:31

Thingamabobs правы, это действительно проблема с потоками, но я не знаю, как ее решить.

Meme410 20.11.2022 23:26
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Анализ продукта магазина на Tokopedia
Анализ продукта магазина на Tokopedia
Tokopedia - это место, где продавцы могут продавать свои товары. Товар должен быть размещен на витрине, чтобы покупателям было легче найти товар...
0
6
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я немного поиграл с вашим кодом, и кажется, что проблема связана с вашими циклами while. Даже если вы использовали потоки правильно, использование циклов while таким образом заставляет вашу программу использовать все ресурсы для зацикливания. Я имею в виду, что когда вы запускали программу, даже до того, как вы нажмете метку, чтобы отобразить виджеты входа, ваши циклы просто повторялись тысячу раз, если не десятки тысяч. Однако, просто положив временной сон, вы можете легко остановить это экспоненциальное потребление ресурсов. Однако вы не должны использовать time.sleep с tkinter, если вы не используете внутренние потоки. Поскольку мы используем циклы внутри потоков, проблем нет.

Например:

def function1(*args): 
    count = 0
    bool = False
    while count < 10:
        time.sleep(0.1)
        for i in firstentry.get(): 
            if bool == False: 
                count +=1 
                print(i)
                bool = True
            else: 
                bool = False

Другие вопросы по теме