StudyRepo_Synergy/part1_basic/final_test/app.py

183 lines
6.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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("<Key>", 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()