-
Notifications
You must be signed in to change notification settings - Fork 3
/
主窗口.py
146 lines (146 loc) · 6.57 KB
/
主窗口.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
import tkinter as tk
import tkinter.scrolledtext as tkst
import tkinter.ttk as ttk
import async_tkinter_loop #async-tkinter-loop
import 窗口
import 日志
import 坐标
from 窗口 import c间距
class W主窗口(tk.Tk):
def __init__(self, a地址管理, a手机管理):
窗口.f开启高分屏适配()
tk.Tk.__init__(self)
self.tk.call("tk", "scaling", 窗口.fg窗口缩放())
self.title("Location17")
self.resizable(False, False)
窗口.f初始化样式()
#变量
self.m地址管理 = a地址管理
self.m手机管理 = a手机管理
self.m选择地址 = 0
self.m选择手机 = 0
#地址&手机
self.w地址框架 = ttk.LabelFrame(self, text = "虚拟定位", width = 400, height = 400)
self.w地址框架.grid(row = 0, rowspan = 1, column = 0, columnspan = 1, padx = c间距, pady = c间距)
self.w地址标签 = ttk.Label(self.w地址框架, text = "地址:")
self.w地址标签.grid(row = 0, rowspan = 1, column = 0, columnspan = 1, padx = c间距, pady = c间距, sticky = "E")
self.w地址 = ttk.Combobox(self.w地址框架, state = "readonly")
self.w地址.bind("<<ComboboxSelected>>", self.f事件_地址被选择)
self.w地址.grid(row = 0, rowspan = 1, column = 1, columnspan = 5, padx = c间距, pady = c间距, sticky = "EW")
self.w手机标签 = ttk.Label(self.w地址框架, text = "手机:")
self.w手机标签.grid(row = 1, rowspan = 1, column = 0, columnspan = 1, padx = c间距, pady = c间距, sticky = "E")
self.w手机 = ttk.Combobox(self.w地址框架, state = "readonly")
self.w手机.grid(row = 1, rowspan = 1, column = 1, columnspan = 5, padx = c间距, pady = c间距, sticky = "EW")
self.w地址管理 = ttk.Button(self.w地址框架, text = "地址管理", command = self.f按钮_地址管理)
self.w地址管理.grid(row = 2, rowspan = 1, column = 0, columnspan = 2, padx = c间距, pady = c间距)
self.w修改定位 = ttk.Button(self.w地址框架, text = "修改定位", command = self.f按钮_修改定位)
self.w修改定位.grid(row = 2, rowspan = 1, column = 2, columnspan = 2, padx = c间距, pady = c间距)
self.w还原定位 = ttk.Button(self.w地址框架, text = "还原定位", command = self.f按钮_还原定位)
self.w还原定位.grid(row = 2, rowspan = 1, column = 4, columnspan = 2, padx = c间距, pady = c间距)
#日志
self.w日志框架 = ttk.LabelFrame(self, text = "日志")
self.w日志框架.grid(row = 1, column = 0, padx = c间距, pady = c间距)
self.w清空日志 = ttk.Button(self.w日志框架, text = "清空日志", command = self.f按钮_清空日志)
self.w清空日志.pack(side = "top", padx = c间距, pady = c间距)
self.w日志 = tkst.ScrolledText(self.w日志框架, height = 20, width = 40)
self.w日志.pack(side = "top", fill = "both", padx = c间距, pady = c间距)
#子窗口
self.w子窗口 = None
#其他
self.m日志框处理器 = 日志.g文本框处理器
self.bind("<Visibility>", self.f事件_加载)
self.bind("<Destroy>", self.f事件_关闭)
self.f定时_更新日志()
def f定时_更新日志(self):
self.m日志框处理器.f更新()
self.m定时_更新日志 = self.after(10, self.f定时_更新日志)
def f定时_更新手机(self):
self.f刷新手机()
self.m定时_更新手机 = self.after(1000, self.f定时_更新手机)
def f事件_加载(self, e):
if e.widget == self:
日志.f调试("窗口加载")
self.unbind("<Visibility>")
窗口.f窗口居中(self)
self.m日志框处理器.f启用(self.w日志)
self.m地址管理.f打开文件()
self.f刷新地址()
self.f定时_更新手机()
def f事件_关闭(self, e):
if e.widget == self:
日志.f调试("窗口关闭")
self.m日志框处理器.f关闭()
self.after_cancel(self.m定时_更新日志)
self.after_cancel(self.m定时_更新手机)
def f按钮_地址管理(self):
import 地址管理窗口
if not self.w子窗口 or not self.w子窗口.winfo_exists():
self.w子窗口 = 地址管理窗口.W地址管理(self, self.m地址管理)
@async_tkinter_loop.async_handler
async def f按钮_修改定位(self):
v地址 = self.fg选择地址()
if not v地址:
日志.f告警("未选择地址")
return
v手机 = self.fg选择手机()
if not v手机:
日志.f告警("未选择手机")
return
v经度, v纬度 = 坐标.f随机偏移(v地址.m经度, v地址.m纬度, v地址.m偏移)
日志.f信息(f"修改定位: 手机={v手机.fg设备名称()}, 经度={v经度}, 纬度={v纬度}")
v结果 = await v手机.f修改定位(a经度 = v经度, a纬度 = v纬度)
if v结果:
日志.f信息("修改定位成功")
else:
日志.f信息("修改定位失败")
@async_tkinter_loop.async_handler
async def f按钮_还原定位(self):
v手机 = self.fg选择手机()
if not v手机:
日志.f告警("未选择手机")
return
日志.f信息(f"还原定位: 手机={v手机.fg设备名称()}")
v结果 = await v手机.f还原定位()
if v结果:
日志.f信息("还原定位成功")
else:
日志.f信息("还原定位失败")
def f按钮_清空日志(self):
self.w日志.delete(1.0, "end")
def fg选择手机(self):
v选择 = self.w手机.current()
if v选择 == -1:
return None
return self.m手机管理[v选择]
def fg选择地址(self):
v选择 = self.w地址.current()
if v选择 == -1:
return None
return self.m地址管理[v选择]
def f写入日志(self, a内容: str):
self.w日志.insert("end", "\r\n" + a内容)
def f刷新地址(self):
self.w地址["value"] = list(self.m地址管理.fe地址名称())
v地址数量 = self.m地址管理.fg地址数量()
if v地址数量 <= self.m选择地址: #刷新后的地址数量可能比选择索引小
self.m选择地址 = v地址数量 - 1
if self.m选择地址 == -1:
if v地址数量 > 0: #原本没地址没选择,刷新后有地址了,选择第一个
self.m选择地址 = 0
self.w地址.current(0)
else: #原本有地址有选择,刷新后没地址了,组合框变空白
self.w地址.set("")
else: #有选择
self.w地址.current(self.m选择地址)
def f刷新手机(self):
if not self.m手机管理.f刷新手机():
return
self.w手机["value"] = list(self.m手机管理.fe手机名称())
v手机数量 = self.m手机管理.fg手机数量()
if v手机数量 <= self.m选择手机: #刷新后的地址数量可能比选择索引小
self.m选择手机 = v手机数量 - 1
self.w手机.current(self.m选择手机)
def f事件_地址被选择(self, event):
w选择框 = event.widget
self.m选择地址 = v选择 = w选择框.current()
日志.f调试(f"选择地址: 选择={v选择}, 名称={self.m地址管理[v选择].m名称}")