-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathui.py
205 lines (162 loc) · 9.15 KB
/
ui.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# -*- encoding=UTF-8 -*-
import tkinter as tk
import tkinter.ttk as ttk
from typing import Literal, Optional
import thread
class MainWindow(tk.Tk):
def __init__(self, scale_factor: float = 100, *args, **kwargs):
super().__init__(*args, **kwargs)
self.tk.call("tk", "scaling", scale_factor / 75)
self.geometry("644x400+512+512")
self.title("PyAutoClicker")
self.resizable(False, False)
self.deiconify()
# Threads
self.left_thread: Optional[thread.LeftClickThread] = None
self.right_thread: Optional[thread.LeftClickThread] = None
# Variables
self.button_text = tk.StringVar(value="开始")
# Setup UI
self.style = ttk.Style()
self.style.theme_use("vista")
self.click_interval_frame = ClickIntervalFrame(self, width=300, height=300)
self.click_interval_frame.place(x=16, y=12)
self.settings_frame = SettingFrame(self, width=312, height=300)
self.settings_frame.place(x=324, y=12)
self.control_button = ttk.Button(self, textvariable=self.button_text, command=self.control, width=8)
self.control_button.place(x=420, y=348)
# ttk.Button(self, text="?", command=self.expand_hint, width=2).place(x=556, y=348)
self.auto_tap1 = self.settings_frame.auto_tap1
self.auto_tap2 = self.settings_frame.auto_tap2
self.add_rand_bias = self.settings_frame.add_rand_bias
self.seperate_control = self.click_interval_frame.seperate_control
self.all_interval = self.click_interval_frame.all_interval
self.left_interval = self.click_interval_frame.left_interval
self.right_interval = self.click_interval_frame.right_interval
self.updater = thread.UpdaterThread(self, 0.05)
self.updater.start()
# def expand_hint(self):
# if "644x400+" in self.geometry():
# self.geometry("968x400")
# elif "968x400+" in self.geometry():
# self.geometry("644x400")
# else:
# raise RuntimeError(f"Bad geometry: {self.geometry()}")
def _create_thread(self):
if self.seperate_control.get():
self.left_thread = thread.LeftClickThread(self.left_interval.get() / 1000, self.auto_tap1.get(),
self.add_rand_bias.get())
self.right_thread = thread.RightClickThread(self.right_interval.get() / 1000, self.auto_tap2.get(),
self.add_rand_bias.get())
else:
self.left_thread = thread.LeftClickThread(self.all_interval.get() / 1000, self.auto_tap1.get(),
self.add_rand_bias.get())
self.right_thread = thread.RightClickThread(self.all_interval.get() / 1000, self.auto_tap2.get(),
self.add_rand_bias.get())
self.left_thread.start()
self.right_thread.start()
def _terminate_thread(self):
if self.left_thread is not None:
self.left_thread.terminate()
if self.right_thread is not None:
self.right_thread.terminate()
def control(self):
if self.button_text.get() == "开始":
self._create_thread()
self.button_text.set("停止")
self.click_interval_frame.set_state(tk.DISABLED)
self.settings_frame.set_state(tk.DISABLED)
else:
self._terminate_thread()
self.button_text.set("开始")
self.click_interval_frame.set_state(tk.NORMAL)
self.settings_frame.set_state(tk.NORMAL)
class ClickIntervalFrame(ttk.LabelFrame):
def __init__(self, master, *, width, height, labelwidget=None):
if labelwidget is None:
super().__init__(master, width=width, height=height, text="点击间隔")
else:
super().__init__(master, width=width, height=height, labelwidget=labelwidget)
# Variables
self.seperate_control = tk.BooleanVar(value=False)
self.all_interval = tk.IntVar(value=100)
self.left_interval = tk.IntVar(value=100)
self.right_interval = tk.IntVar(value=100)
# Define widgets
self.all_desc_label = ttk.Label(self, text="间隔:")
self.sep_checkbox = ttk.Checkbutton(self, variable=self.seperate_control, text="分别控制")
self.all_spinbox = ttk.Spinbox(self, from_=0, to=5000, increment=5, textvariable=self.all_interval, width=7)
self.interval_frame = ttk.LabelFrame(self, width=272, height=160, labelwidget=self.sep_checkbox)
self.left_spinbox = ttk.Spinbox(self.interval_frame, from_=0, to=5000, increment=5,
state=tk.NORMAL if self.seperate_control.get() else tk.DISABLED,
textvariable=self.left_interval, width=7)
self.right_spinbox = ttk.Spinbox(self.interval_frame, from_=0, to=5000, increment=5,
state=tk.NORMAL if self.seperate_control.get() else tk.DISABLED,
textvariable=self.right_interval, width=7)
self.all_unit_label = ttk.Label(self, text="ms")
self.left_unit_label = ttk.Label(self.interval_frame, text="ms",
state=tk.NORMAL if self.seperate_control.get() else tk.DISABLED)
self.right_unit_label = ttk.Label(self.interval_frame, text="ms",
state=tk.NORMAL if self.seperate_control.get() else tk.DISABLED)
self.left_desc_label = ttk.Label(self.interval_frame, text="左键:",
state=tk.NORMAL if self.seperate_control.get() else tk.DISABLED)
self.right_desc_label = ttk.Label(self.interval_frame, text="右键:",
state=tk.NORMAL if self.seperate_control.get() else tk.DISABLED)
self.hint_label = ttk.Label(self, text="过低的点击间隔(0)可能导致鼠标卡顿")
# Place widgets
self.all_desc_label.place(x=12, y=12)
self.all_spinbox.place(x=64, y=12)
self.interval_frame.place(x=12, y=68)
self.left_spinbox.place(x=96, y=0)
self.right_spinbox.place(x=96, y=32)
self.all_unit_label.place(x=160, y=12)
self.left_unit_label.place(x=192, y=0)
self.right_unit_label.place(x=192, y=32)
self.left_desc_label.place(x=32, y=0)
self.right_desc_label.place(x=32, y=32)
self.hint_label.place(x=0, y=240)
def set_state(self, state: Literal["normal", "disabled", "active"]) -> None:
self.all_desc_label["state"] = state
self.all_spinbox["state"] = state
self.all_unit_label["state"] = state
self.set_interval_frame_state(state if self.seperate_control.get() else tk.DISABLED)
self.sep_checkbox["state"] = state
self.hint_label["state"] = state
def set_interval_frame_state(self, state: Literal["normal", "disabled", "active"]) -> None:
self.left_desc_label["state"] = state
self.left_spinbox["state"] = state
self.left_unit_label["state"] = state
self.right_desc_label["state"] = state
self.right_spinbox["state"] = state
self.right_unit_label["state"] = state
class SettingFrame(ttk.LabelFrame):
def __init__(self, master, *, width, height, labelwidget=None):
if labelwidget is None:
super().__init__(master, width=width, height=height, text="设置")
else:
super().__init__(master, width=width, height=height, labelwidget=labelwidget)
# Variables
self.auto_tap1 = tk.BooleanVar(value=True)
self.auto_tap2 = tk.BooleanVar(value=False)
self.add_rand_bias = tk.BooleanVar(value=True)
# Define widgets
self.auto_tap1_checkbox = ttk.Checkbutton(self, variable=self.auto_tap1, text="自动切换武器")
self.auto_tap2_checkbox = ttk.Checkbutton(self, variable=self.auto_tap2, text="自动切换方块")
self.auto_tap1_desc_label = ttk.Label(self, text="在左键时自动切换到武器(按下\"1\")")
self.auto_tap2_desc_label = ttk.Label(self, text="在右键时自动切换到方块(按下\"2\")")
self.add_rand_bias_checkbox = ttk.Checkbutton(self, variable=self.add_rand_bias, text="向点击添加随机间隔")
self.add_rand_bias_label = ttk.Label(self, text="向点击间隔添加一个数学期望为点击\n间隔,方差为5的正态分布")
# Place widgets
self.auto_tap1_checkbox.place(x=12, y=0)
self.auto_tap2_checkbox.place(x=12, y=64)
self.auto_tap1_desc_label.place(x=12, y=28)
self.auto_tap2_desc_label.place(x=12, y=92)
self.add_rand_bias_checkbox.place(x=12, y=128)
self.add_rand_bias_label.place(x=12, y=156)
def set_state(self, state: Literal["normal", "disabled", "active"]) -> None:
self.auto_tap1_checkbox["state"] = state
self.auto_tap1_desc_label["state"] = state
self.auto_tap2_checkbox["state"] = state
self.auto_tap2_desc_label["state"] = state
self.add_rand_bias_label["state"] = state
self.add_rand_bias_checkbox["state"] = state