Задать вопрос
Very_cool_programmer
@Very_cool_programmer
Я программист.

Как сделать бесконечный цикл в python tkinter, чтобы интерфейс не залагал?

Я пишу небольшую утилиту для закрытия процессов автоматически. И столкнулся с проблемой циклов. Так как весь графический интерфейс это и есть один большой бесконечный цикл, при включении дополнительного цикла вес интерфейс залагивает. Так вот, нужно, чтобы он не залагивал и работал дальше.

Вот код ( Я новичок в программировании и этот код может быть плохим. Знаю) :


print("Запуск...", end='')
from tkinter import *
import time
import os
import pyautogui as pg
import subprocess as sp
print('ok! ')

#Functions


def logicp(event):
    def_name=name.get()
    def_text=text.get()
    try:
        def_delay=delay.get()
        def_delay=int(def_delay)
    except:
        work['text']=''.join("Можно только число!")
        time.sleep(4)
        work['text']=''.join("Остановлено")
    if (def_name and def_text and def_delay):
        work['text']=''.join("Работа...")
        while 1:
            print("Проверка...")
            time.sleep(def_delay)
            tasks=sp.getoutput('tasklist');
            if 'Zoom.exe' in tasks:
                os.system('taskkill /f /im Zoom.exe')
                pg.alert(str(def_text), str(def_name))
    else:
        pass

root=Tk()

root.resizable(width=False, height=False)
root.geometry('400x300')
root.title('Zoom parser')

work=Label(text='Остановлено', font='Consolas 10')
start=Button(root, text='Начать')

#enters

text=Entry(root, width=30)
textl=Label(text='Текст', font='Consolas 10')
name=Entry(root, width=30)
namel=Label(text='Имя окна', font='Consolas 10')
delay=Entry(root, width=10)
delayl=Label(text='Задержка', font='Consolas 10')


#Packer

work.pack()
start.pack()
textl.pack()
text.pack()
namel.pack(side=RIGHT)
name.pack(side=RIGHT)
delayl.pack(side=LEFT)
delay.pack(side=LEFT)

#Binds

start.bind("<Button-1>", logicp)

root.mainloop()



Без цикла в функции logicp()не получится! А без root.mainloop() программа сразу будет закрываться.
  • Вопрос задан
  • 1931 просмотр
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
Тело цикла while вынести в отдельную функцию, допустим check_task
Вместо цикла while и последней строкой в check_task, root.after(def_delay, check_task)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы