Цикл задержки программы — tkinter

#python #tkinter

Вопрос:

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

Отправка цифр и нажатие на нужную позицию работают. Но цикл каждые 5 минут не совсем. У меня больше нет никаких идей. Я знаю, я могу использовать time.sleep() , но тогда вся программа спит.

 import time
import tkinter as tk
import time
from pynput.mouse import Button, Controller

def getTextInput():
    global ValueX
    global ValueY
    resultX = e1.get()
    ValueX = resultX
    X = float(ValueX)
    resultY = e2.get()
    ValueY = resultY
    Y = float(ValueY)
    print('Eingabe X: ', X)
    print('Eingabe Y: ', Y)
    KlickMouse(X, Y)

def KlickMouse(X, Y):
    print('Old Mouse Pos:{0}'.format(mouse.position))
    mouse.position = (X, Y)
    time.sleep(0.2)
    # mouse.click(Button.left, 1)
    # time.sleep(0.2)
    # mouse.click(Button.left, 1)
    print('New Mouse Pos:{0}'.format(mouse.position))

mouse = Controller()
master = tk.Tk()
tk.Label(master, text="X-Koordinate").grid(row=0)
tk.Label(master, text="Y-Koordinate").grid(row=1)
tk.Button(master, text="Submit", command=getTextInput).grid(row=2)
tk.Button(master, text="Beenden", command=master.destroy).grid(row=3)
e1 = tk.Entry(master)
e2 = tk.Entry(master)
e1.grid(row=0, column=1)
e2.grid(row=1, column=1)
master.mainloop()
 

Комментарии:

1. Вы не должны использовать time.sleep(...) при использовании tkinter . Посмотрите на .after сценарии.

2. Вот некоторая документация по этому after() методу.

Ответ №1:

Для этого вы можете использовать after метод Tkinter.

 def KlickMouse(X, Y):
    print('Old Mouse Pos:{0}'.format(mouse.position))
    mouse.position = (X, Y)
    print('New Mouse Pos:{0}'.format(mouse.position))
    master.after(5*60*1000, timedClick)

def timedClick():
    mouse.click(Button.left, 1)
    master.after(5*60*1000, timedClick)
 

Теперь, после установки координат, программа ждет 5 минут (задержка в миллисекундах, значит, 5 минут 5*60*1000 ) и запускается timedClick . Это щелкает мышью, затем ждет еще 5 минут, прежде чем снова позвонить самому себе.

Комментарии:

1. time.sleep У тебя там все еще есть «а».

2. Да, я просто оставил его там на случай, если он им понадобится по какой-то причине

3. Это все равно приведет к задержке графического интерфейса. Лучше его удалить.

4. Попробуйте разделить klickMouse на 2 функции и связать их цепочкой after()

5. Вызов sleep() приложения tkinter действительно что-то делает , оно блокирует mainloop() и заставляет приложение «зависать».