import os import time from pathlib import Path from subprocess import Popen from tkinter import ( BOTH, LEFT, RAISED, RIGHT, TOP, Button, Frame, Label, PhotoImage, StringVar, Tk, mainloop, messagebox, ) class ClickerGame: """Перед запуском проверьте и исправьте место установки AHK Св-во класса AHK_PATH должно содержать полный путь до запускаемого файла, если приложение установлено не в папки по умолчанию """ AHK_PATH = "<Введите сюда путь до приложения AutoHotKey>" def __init__(self): # Поиск места установки AutoHotKey self.is_ahk_path_set = False if os.path.isfile( app_exe := os.path.join( Path.home(), "AppData", "Local", "Programs", "AutoHotkey", "UX", "AutoHotkeyUX.exe", ) ): self.AHK_PATH = app_exe self.is_ahk_path_set = True elif os.path.isfile( app_exe := os.path.join( r"c:\\", "Program Files", "AutoHotkey", "UX", "AutoHotkeyUX.exe" ) ): self.AHK_PATH = app_exe self.is_ahk_path_set = True else: messagebox.showerror( "Can't find AutoHotKey", """Пропишите AHK_PATH До этого, автокликер работать не будет""", ) self.__root = Tk() self.__root.geometry("500x400") self.__root.minsize(500, 400) self.__root.title("Clicker Game") self.__root.bind("", self.key) self.process = None self.ahk_flag = False # Флаг запущен ли скрипт кликера self.frame = Frame(self.__root, relief=RAISED, borderwidth=5, bg="green") self.frame.pack(fill=BOTH, expand=True, padx=5, pady=5) self.label = Label( self.frame, text="Clicker Game", font=("Arial", 25), bg="green" ) self.label.pack(side=TOP) self.score = 0 self.message = StringVar() self.message.set(f"Ваш счет: {self.score}") self.label2 = Label( self.frame, textvariable=self.message, font=("Arial", 15), bg="green" ) self.label2.pack(side=TOP) self.timer = 0 self.start_time = time.time() self.timer_message = StringVar() self.timer_update() self.label3 = Label( self.frame, textvariable=self.timer_message, font=("Arial", 12), bg="green" ) self.label3.pack(side=LEFT) self.img = PhotoImage(file=os.path.join(os.curdir, "img.png")) self.clicker = Button( self.frame, text="clickme", image=self.img, command=self.increment ) self.clicker.place(relx=0.5, rely=0.5, anchor="center") self.ahk_button = Button( self.__root, text="Запустить AHK", command=self.switcher_ahk ) self.ahk_button.pack(side=LEFT, padx=10, pady=10) self.close_button = Button(self.__root, text="Выход", command=self.quit) self.close_button.pack(side=RIGHT, padx=10, pady=10) self.ahk_button = Button( self.__root, text="Сброс игры", command=self.clicker_reset ) self.ahk_button.pack(side=RIGHT, padx=10, pady=10) mainloop() def __del__(self): """Завершаем поток АНК ели он запущен при уничтожении игры. Можно было и в метод quit разместить, но правильнее добавить деструктор обекта""" if self.ahk_flag: self.switcher_ahk() def key(self, event): """Отлавливаем все event в игре, в т.ч и нажатия клавиш клавиатуры. Обрабатываем интересующие нас""" if event.keycode == 97: # Переключаем статус АНК по numpad1 self.switcher_ahk() if event.keycode == 73 or event.keycode == 17: # Инкремент счетчика по хот кею Ctrl-i или Ctrl-ш в RU раскладке self.increment() def increment(self, keys=None): if keys is not None: """Данный блок необходим, чтоб среда не ругалась на неиспользуемый аргумент keys. При связывании горячей клавиши методом bind, сюда передается инфо о нажатой комбинации. Тут она мне не нужна, поэтому ставим тупо заглушку""" pass self.score += 1 self.message.set(f"Ваш счет: {self.score}") def switcher_ahk(self): """Переключаем состояние кликера(вкл/выкл), если путь к нему установлен или выводим сообщение с предупреждением""" if not self.is_ahk_path_set: messagebox.showerror( "Can't find AutoHotKey", """Не могу запустить автокликер. Не указан путь к AutoHotKey""", ) elif self.ahk_flag: self.ahk_flag = False self.process.kill() else: self.ahk_flag = True self.process = Popen([self.AHK_PATH, "clicker.ahk"]) def timer_update(self): self.timer = int(time.time() - self.start_time) self.timer_message.set( f"Время игры:\n{self.timer // 60}мин. {self.timer % 60} сек." ) self.__root.after(1000, self.timer_update) def clicker_reset(self): if self.ahk_flag: self.switcher_ahk() self.score = 0 self.message.set(f"Ваш счет: {self.score}") self.timer = 0 self.start_time = time.time() self.timer_update() def quit(self): self.__root.destroy() if __name__ == "__main__": game = ClickerGame()