Окно 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()
код может не иметь большого значения, но его достаточно, чтобы воспроизвести мой пример, вы заметите, что если вы нажмете на метку дисплея, а затем переместите окно, не вводя ничего в записи, окно будет глючить / зависать, почему?
Можете ли вы предоставить нам какой-нибудь код или хотя бы его минимальное воспроизведение? Должно быть что-то не так с кодом или что системной памяти недостаточно, чтобы он заморозил процесс. Пока вы делаете это правильно, вы можете заставить окно прыгать, как кролик, без каких-либо проблем.
Хорошо, я предоставлю код редактирования: это проблема, если я не работаю с классами?
Как мы вчера обсуждали. Ваши темы блокируют ваш mainloop
, вам нужно поместить блокирующий код вне mainloop
. Кроме того, вам нужно проявлять большую осторожность при взаимодействии с tkinter из-за пределов потока, в котором работает tkinters mainloop
.
но как поместить их вне mainloop()? редактировать: я попробую что-нибудь, я не уверен
Thingamabobs правы, это действительно проблема с потоками, но я не знаю, как ее решить.
Я немного поиграл с вашим кодом, и кажется, что проблема связана с вашими циклами 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
У вас больше шансов получить ответ, если вы предоставите пример кода и укажете, какую систему и версии вы используете.