#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()
и заставляет приложение «зависать».