StudyRepo_Synergy/part1_basic/final_test/app.py

164 lines
5.7 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 subprocess import Popen
from tkinter import (
BOTH,
LEFT,
RAISED,
RIGHT,
TOP,
Button,
Frame,
Label,
PhotoImage,
StringVar,
Tk,
mainloop,
messagebox,
)
from pathlib import Path
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",
"""Set AHK_PATH in app.py Until then, the clicker will not work""",
)
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"Your score is: {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="Manual run AHK", command=self.switcher_ahk
)
self.ahk_button.pack(side=LEFT, padx=10, pady=10)
self.close_button = Button(self.__root, text="EXIT", command=self.quit)
self.close_button.pack(side=RIGHT, padx=10, pady=10)
self.ahk_button = Button(
self.__root, text="Clicker RESET", command=self.clicker_reset
)
self.ahk_button.pack(side=RIGHT, padx=10, pady=10)
mainloop()
def __del__(self):
"""Завершаем поток АНК ели он запущен при выходе"""
if self.ahk_flag:
self.switcher_ahk()
def key(self, 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"Your score is: {self.score}")
def switcher_ahk(self):
"""Переключаем состояние скрипта кликера, если путь к нему установлен"""
if not self.is_ahk_path_set:
messagebox.showerror(
"Can't find AutoHotKey",
"""Set AHK_PATH in app.py Until then, the clicker will not work""",
)
elif self.ahk_flag:
print("Stop clicker")
self.ahk_flag = False
self.process.kill()
else:
print("run clicker")
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"Elapsed time:\n{self.timer // 60}min. {self.timer % 60} sec."
)
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"Your score is: {self.score}")
self.timer = 0
self.start_time = time.time()
self.timer_update()
def quit(self):
self.__root.destroy()
game = ClickerGame()