StudyRepo_Synergy/code_of_future/part1_basic/final_test/app.py

183 lines
6.4 KiB
Python
Raw Normal View History

2023-10-31 11:53:13 +03:00
import os
import time
2023-10-31 16:37:00 +03:00
from pathlib import Path
2023-10-31 14:57:54 +03:00
from subprocess import Popen
from tkinter import (
BOTH,
LEFT,
RAISED,
RIGHT,
TOP,
Button,
Frame,
Label,
PhotoImage,
StringVar,
Tk,
mainloop,
2023-10-31 16:08:22 +03:00
messagebox,
2023-10-31 14:57:54 +03:00
)
2023-10-31 11:53:13 +03:00
class ClickerGame:
2023-10-31 14:57:54 +03:00
"""Перед запуском проверьте и исправьте место установки AHK
2023-10-31 16:08:22 +03:00
Св-во класса AHK_PATH должно содержать полный путь до запускаемого файла,
если приложение установлено не в папки по умолчанию
2023-10-31 11:53:13 +03:00
"""
2023-10-31 16:37:00 +03:00
2023-10-31 16:08:22 +03:00
AHK_PATH = "<Введите сюда путь до приложения AutoHotKey>"
2023-10-31 11:53:13 +03:00
def __init__(self):
2023-10-31 16:08:22 +03:00
# Поиск места установки AutoHotKey
self.is_ahk_path_set = False
2023-10-31 16:37:00 +03:00
if os.path.isfile(
app_exe := os.path.join(
Path.home(),
"AppData",
"Local",
"Programs",
"AutoHotkey",
"UX",
"AutoHotkeyUX.exe",
)
):
2023-10-31 16:08:22 +03:00
self.AHK_PATH = app_exe
self.is_ahk_path_set = True
2023-10-31 16:37:00 +03:00
elif os.path.isfile(
app_exe := os.path.join(
r"c:\\", "Program Files", "AutoHotkey", "UX", "AutoHotkeyUX.exe"
)
):
2023-10-31 16:08:22 +03:00
self.AHK_PATH = app_exe
self.is_ahk_path_set = True
else:
messagebox.showerror(
"Can't find AutoHotKey",
2023-10-31 16:37:00 +03:00
"""Пропишите AHK_PATH До этого, автокликер работать не будет""",
2023-10-31 16:08:22 +03:00
)
2023-10-31 11:53:13 +03:00
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
2023-10-31 16:08:22 +03:00
self.ahk_flag = False # Флаг запущен ли скрипт кликера
2023-10-31 14:57:54 +03:00
self.frame = Frame(self.__root, relief=RAISED, borderwidth=5, bg="green")
2023-10-31 11:53:13 +03:00
self.frame.pack(fill=BOTH, expand=True, padx=5, pady=5)
2023-10-31 14:57:54 +03:00
self.label = Label(
self.frame, text="Clicker Game", font=("Arial", 25), bg="green"
)
2023-10-31 11:53:13 +03:00
self.label.pack(side=TOP)
self.score = 0
self.message = StringVar()
2023-10-31 16:37:00 +03:00
self.message.set(f"Ваш счет: {self.score}")
2023-10-31 14:57:54 +03:00
self.label2 = Label(
self.frame, textvariable=self.message, font=("Arial", 15), bg="green"
)
2023-10-31 11:53:13 +03:00
self.label2.pack(side=TOP)
self.timer = 0
self.start_time = time.time()
self.timer_message = StringVar()
self.timer_update()
2023-10-31 14:57:54 +03:00
self.label3 = Label(
2023-10-31 16:08:22 +03:00
self.frame, textvariable=self.timer_message, font=("Arial", 12), bg="green"
2023-10-31 14:57:54 +03:00
)
2023-10-31 11:53:13 +03:00
self.label3.pack(side=LEFT)
2023-10-31 14:57:54 +03:00
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")
2023-10-31 11:53:13 +03:00
2023-10-31 14:57:54 +03:00
self.ahk_button = Button(
2023-10-31 16:37:00 +03:00
self.__root, text="Запустить AHK", command=self.switcher_ahk
2023-10-31 14:57:54 +03:00
)
2023-10-31 11:53:13 +03:00
self.ahk_button.pack(side=LEFT, padx=10, pady=10)
2023-10-31 16:37:00 +03:00
self.close_button = Button(self.__root, text="Выход", command=self.quit)
2023-10-31 11:53:13 +03:00
self.close_button.pack(side=RIGHT, padx=10, pady=10)
2023-10-31 14:57:54 +03:00
self.ahk_button = Button(
2023-10-31 16:37:00 +03:00
self.__root, text="Сброс игры", command=self.clicker_reset
2023-10-31 14:57:54 +03:00
)
2023-10-31 11:53:13 +03:00
self.ahk_button.pack(side=RIGHT, padx=10, pady=10)
mainloop()
def __del__(self):
2023-10-31 16:37:00 +03:00
"""Завершаем поток АНК ели он запущен при
уничтожении игры.
Можно было и в метод quit разместить, но
правильнее добавить деструктор обекта"""
2023-10-31 11:53:13 +03:00
if self.ahk_flag:
self.switcher_ahk()
def key(self, event):
2023-10-31 16:37:00 +03:00
"""Отлавливаем все event в игре, в т.ч и
нажатия клавиш клавиатуры. Обрабатываем
интересующие нас"""
2023-10-31 11:53:13 +03:00
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, сюда
2023-10-31 14:57:54 +03:00
передается инфо о нажатой комбинации. Тут она мне не нужна, поэтому
ставим тупо заглушку"""
2023-10-31 11:53:13 +03:00
pass
self.score += 1
2023-10-31 16:37:00 +03:00
self.message.set(f"Ваш счет: {self.score}")
2023-10-31 11:53:13 +03:00
def switcher_ahk(self):
2023-10-31 16:37:00 +03:00
"""Переключаем состояние кликера(вкл/выкл),
если путь к нему установлен или выводим
сообщение с предупреждением"""
2023-10-31 16:08:22 +03:00
if not self.is_ahk_path_set:
messagebox.showerror(
"Can't find AutoHotKey",
2023-10-31 16:37:00 +03:00
"""Не могу запустить автокликер. Не указан путь к AutoHotKey""",
2023-10-31 16:08:22 +03:00
)
elif self.ahk_flag:
2023-10-31 11:53:13 +03:00
self.ahk_flag = False
self.process.kill()
else:
self.ahk_flag = True
2023-10-31 14:57:54 +03:00
self.process = Popen([self.AHK_PATH, "clicker.ahk"])
2023-10-31 11:53:13 +03:00
def timer_update(self):
self.timer = int(time.time() - self.start_time)
2023-10-31 14:57:54 +03:00
self.timer_message.set(
2023-10-31 16:37:00 +03:00
f"Время игры:\n{self.timer // 60}мин. {self.timer % 60} сек."
2023-10-31 14:57:54 +03:00
)
2023-10-31 11:53:13 +03:00
self.__root.after(1000, self.timer_update)
def clicker_reset(self):
if self.ahk_flag:
self.switcher_ahk()
self.score = 0
2023-10-31 16:37:00 +03:00
self.message.set(f"Ваш счет: {self.score}")
2023-10-31 11:53:13 +03:00
self.timer = 0
self.start_time = time.time()
self.timer_update()
def quit(self):
self.__root.destroy()
2023-10-31 16:37:00 +03:00
if __name__ == "__main__":
game = ClickerGame()