Как создать бесконечный цикл python tkinter, если mainloop() не даёт ему исполняться?
Мне нужно сделать цикл (или что-то другое), который будет каждые 100 мс проверять, какой элемент Listbox сейчас выделен.
Если поставить бесконечный цикл перед mainloop(), то окно не покажется, пока не завершится цикл (а он бесконечный), но если поставить его после mainloop(), то он запустится после выполнения mainloop() (этот метод тоже имеет внутри бесконечный цикл).
Я пробовал запускать разные потоки с помощью Thread из библиотеки threading, но почему то он не захотел запускать два потока одновременно и ждал, когда закончится первый цикл, чтобы запустить второй, который я сделал в другом потоке.
У меня получился вот такой отрывок из кода:
from tkinter import *
from tkinter import ttk
import os
import time
from threading import Thread
SMAS = Tk()
SMAS.geometry('300x300')
'Дальше шёл код, для создания виджетов в окне'
os.chdir('/')
lvar = os.listdir(/) #Просто путь к каталогу
Slvar = StringVar(value = lvar)
systems = Listbox(listvariable = Slvar)
systems.place(relheight = 1.0, relwidth = 0.25, relx = 0.0, rely = 0.0, anchor = (NW))
state = system.curselection()
def check():
global state
while True:
if state != systems.curselection():
print(systems.curselection())
state = systems.curselection()
time.sleep(0.1)
flow = Tread(target = check())
flow.start()
SMAS.mainloop()
Но почему-то вывод был такой:
()
()
()
()
()#И так до бесконечности
Ответы (2 шт):
Цикл у Вас запустился нормально, но переменная state не связана с виджетом.
Её нужно обновлять при изменении значений. А также (если уже обновляете её) стоит указать что эта переменная глобальная и там где вы её обновляете.
Я не уверен, что правильно понимая то, что вы хотите делать.
Я полностью согласен с комментарием @CrazyElf
Мне кажется в вашем случае привязка ListBox к <<ListBoxSelect>>
является лучшим событием.
import os
from tkinter import *
from tkinter import ttk
root = Tk()
root.geometry('420x400')
path = 'D:/_Qt/__Qt/img' # путь к каталогу
os.chdir(path)
lvar = os.listdir(path)
Slvar = StringVar(value = lvar)
systems = Listbox(listvariable = Slvar)
systems.place(relheight = 1.0, relwidth = 0.25,
relx = 0.0, rely = 0.0, anchor = (NW))
def check(event):
global image
w = event.widget
ind = int(w.curselection()[0])
image = PhotoImage(file=w.get(ind))
label = Label(root, bg="white", image=image)
label.place(x=110, y=10, width=300, height=300)
systems.bind("<<ListboxSelect>>", check) # +++
root.mainloop()
