admin_program.py 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207
  1. import abc
  2. import tkinter as tk
  3. import tkinter.ttk as ttk
  4. from tkinter.filedialog import askdirectory
  5. from tool.type_ import *
  6. from tool.tk import make_font, set_tk_disable_from_list
  7. from tool.login import creat_uid
  8. import conf
  9. import admin
  10. import admin_event as tk_event
  11. from core.garbage import GarbageType
  12. class AdminProgram(metaclass=abc.ABCMeta):
  13. def __init__(self, station: admin.AdminStation, win: Union[tk.Frame, tk.Toplevel, tk.Tk], color: str, title: str):
  14. self.station = station
  15. self.win = win
  16. self.color = color
  17. self.frame = tk.Frame(self.win)
  18. self.frame['bg'] = color
  19. self.program_title = title
  20. @abc.abstractmethod
  21. def set_disable(self):
  22. ...
  23. @abc.abstractmethod
  24. def reset_disable(self):
  25. ...
  26. @abc.abstractmethod
  27. def conf_gui(self, n: int = 1):
  28. ...
  29. def get_program_frame(self) -> Tuple[str, tk.Frame]:
  30. return self.program_title, self.frame
  31. class WelcomeProgram(AdminProgram):
  32. def __init__(self, station, win, color):
  33. super().__init__(station, win, color, "Welcome")
  34. self.title = tk.Label(self.frame)
  35. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)]
  36. self.__conf_font()
  37. def __conf_font(self, n: int = 1):
  38. self.title_font_size = int(25 * n)
  39. self.btn_font_size = int(14 * n)
  40. def conf_gui(self, n: int = 1):
  41. self.__conf_font(n)
  42. title_font = make_font(size=self.title_font_size, weight="bold")
  43. btn_font = make_font(size=self.btn_font_size)
  44. for btn, text in zip(self.btn, ["TestMSG", "TestProgress"]):
  45. btn['font'] = btn_font
  46. btn['text'] = text
  47. btn['bg'] = '#d3d7d4'
  48. self.title['text'] = 'Welcome to HGSSystem Manager'
  49. self.title['font'] = title_font
  50. self.title['bg'] = self.color
  51. self.btn[0]['command'] = lambda: self.test_msg()
  52. self.btn[1]['command'] = lambda: self.test_progress()
  53. self.title.place(relx=0.1, rely=0.3, relwidth=0.8, relheight=0.2)
  54. self.btn[0].place(relx=0.2, rely=0.7, relwidth=0.2, relheight=0.1)
  55. self.btn[1].place(relx=0.6, rely=0.7, relwidth=0.2, relheight=0.1)
  56. def test_progress(self):
  57. event = tk_event.TestProgressEvent(self.station)
  58. self.station.push_event(event)
  59. def test_msg(self):
  60. self.station.show_msg("Test Msg", "test msg")
  61. def set_disable(self):
  62. set_tk_disable_from_list(self.btn)
  63. def reset_disable(self):
  64. set_tk_disable_from_list(self.btn, flat='normal')
  65. class CreatUserProgramBase(AdminProgram):
  66. def __init__(self, station, win, color, title: str):
  67. super().__init__(station, win, color, title)
  68. self.enter_frame = tk.Frame(self.frame)
  69. self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(3)]
  70. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame) for _ in range(3)]
  71. self.var: List[tk.Variable] = [tk.StringVar() for _ in range(3)]
  72. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)] # creat(生成用户) try(计算uid)
  73. self._conf("#FA8072", False) # 默认颜色
  74. self.__conf_font()
  75. def _conf(self, bg_color, is_manager: bool):
  76. self.bg_color = bg_color
  77. self.is_manager = is_manager
  78. return self
  79. def __conf_font(self, n: int = 1):
  80. self.title_font_size = int(16 * n)
  81. self.btn_font_size = int(14 * n)
  82. def conf_gui(self, n: int = 1):
  83. self.__conf_font(n)
  84. title_font = make_font(size=self.title_font_size)
  85. btn_font = make_font(size=self.btn_font_size)
  86. self.enter_frame['bg'] = self.bg_color
  87. self.enter_frame['bd'] = 5
  88. self.enter_frame['relief'] = "ridge"
  89. self.enter_frame.place(relx=0.2, rely=0.3, relwidth=0.6, relheight=0.30)
  90. height = 0.1
  91. for lb, text, enter, var in zip(self.title, ["UserName:", "PassWord:", "Phone:"], self.enter, self.var):
  92. lb['font'] = title_font
  93. lb['text'] = text
  94. lb['bg'] = self.bg_color
  95. lb['anchor'] = 'e'
  96. enter['font'] = title_font
  97. enter['textvariable'] = var
  98. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.17)
  99. enter.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.17)
  100. height += 0.30
  101. for btn, text, x, func in zip(self.btn,
  102. ["Creat", "GetUID"],
  103. [0.2, 0.6],
  104. [lambda: self.creat_by_name(), lambda: self.get_uid()]):
  105. btn['font'] = btn_font
  106. btn['text'] = text
  107. btn['bg'] = conf.tk_btn_bg
  108. btn['command'] = func
  109. btn.place(relx=x, rely=0.7, relwidth=0.2, relheight=0.08)
  110. def __get_info(self) -> Optional[Tuple[uname_t, passwd_t, str]]:
  111. name: uname_t = self.var[0].get()
  112. passwd: passwd_t = self.var[1].get()
  113. phone: str = self.var[2].get()
  114. if len(name) == 0 or len(passwd) == 0 or len(phone) != 11:
  115. self.station.show_msg("UserInfoError", "Please, enter UserName/Passwd/Phone(11)")
  116. return None
  117. return name, passwd, phone
  118. def creat_by_name(self):
  119. res = self.__get_info()
  120. if res is None:
  121. return
  122. name, passwd, phone = res
  123. event = tk_event.CreatUserEvent(self.station).start(name, passwd, phone, self.is_manager)
  124. self.station.push_event(event)
  125. def get_uid(self):
  126. res = self.__get_info()
  127. if res is None:
  128. return
  129. name, passwd, phone = res
  130. uid = creat_uid(name, passwd, phone)
  131. self.station.show_msg("UserID", f"UserName: {name}\nUserID: {uid}")
  132. def set_disable(self):
  133. set_tk_disable_from_list(self.btn)
  134. set_tk_disable_from_list(self.enter)
  135. def reset_disable(self):
  136. set_tk_disable_from_list(self.btn, flat='normal')
  137. set_tk_disable_from_list(self.enter, flat='normal')
  138. class CreatNormalUserProgram(CreatUserProgramBase):
  139. def __init__(self, station, win, color):
  140. super(CreatNormalUserProgram, self).__init__(station, win, color, "CreatNormalUser")
  141. class CreatManagerUserProgram(CreatUserProgramBase):
  142. def __init__(self, station, win, color):
  143. super(CreatManagerUserProgram, self).__init__(station, win, color, "CreatManagerUser")
  144. self._conf("#4b5cc4", True)
  145. class CreatAutoNormalUserProgram(AdminProgram):
  146. def __init__(self, station, win, color):
  147. super().__init__(station, win, color, "CreatAutoNormalUser")
  148. self.enter_frame = tk.Frame(self.frame)
  149. self.title: tk.Label = tk.Label(self.enter_frame)
  150. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  151. self.var: tk.Variable = tk.StringVar()
  152. self.btn: tk.Button = tk.Button(self.frame) # creat(生成用户) try(计算uid)
  153. self.__conf_font()
  154. def __conf_font(self, n: int = 1):
  155. self.title_font_size = int(16 * n)
  156. self.btn_font_size = int(14 * n)
  157. def conf_gui(self, n: int = 1):
  158. self.__conf_font(n)
  159. title_font = make_font(size=self.title_font_size)
  160. btn_font = make_font(size=self.btn_font_size)
  161. self.enter_frame['bg'] = "#bce672"
  162. self.enter_frame['bd'] = 5
  163. self.enter_frame['relief'] = "ridge"
  164. self.enter_frame.place(relx=0.2, rely=0.3, relwidth=0.6, relheight=0.10)
  165. self.title['font'] = title_font
  166. self.title['text'] = "Phone:"
  167. self.title['bg'] = "#bce672"
  168. self.title['anchor'] = 'e'
  169. self.enter['font'] = title_font
  170. self.enter['textvariable'] = self.var
  171. self.title.place(relx=0.02, rely=0.2, relwidth=0.25, relheight=0.48)
  172. self.enter.place(relx=0.30, rely=0.2, relwidth=0.60, relheight=0.48)
  173. self.btn['font'] = btn_font
  174. self.btn['text'] = "Creat"
  175. self.btn['bg'] = conf.tk_btn_bg
  176. self.btn['command'] = lambda: self.creat_user()
  177. self.btn.place(relx=0.4, rely=0.7, relwidth=0.2, relheight=0.08)
  178. def creat_user(self):
  179. phone = self.var.get()
  180. if len(phone) != 11:
  181. self.station.show_msg("UserInfoError", "Please, enter Phone(11)")
  182. event = tk_event.CreatUserEvent(self.station).start(None, None, phone, False)
  183. self.station.push_event(event)
  184. def set_disable(self):
  185. self.btn['state'] = 'disable'
  186. self.enter['state'] = 'disable'
  187. def reset_disable(self):
  188. self.btn['state'] = 'normal'
  189. self.enter['state'] = 'normal'
  190. class CreatGarbageProgram(AdminProgram):
  191. def __init__(self, station, win, color):
  192. super().__init__(station, win, color, "CreatGarbage")
  193. self.enter_frame = tk.Frame(self.frame)
  194. self.title: List[tk.Label] = [tk.Label(self.enter_frame), tk.Label(self.enter_frame)]
  195. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame), tk.Entry(self.enter_frame)]
  196. self.var: List[tk.Variable] = [tk.StringVar(), tk.StringVar()]
  197. self.creat_btn: tk.Button = tk.Button(self.frame)
  198. self.file_btn: tk.Button = tk.Button(self.frame)
  199. self.__conf_font()
  200. def __conf_font(self, n: int = 1):
  201. self.title_font_size = int(16 * n)
  202. self.btn_font_size = int(14 * n)
  203. def conf_gui(self, n: int = 1):
  204. self.__conf_font(n)
  205. title_font = make_font(size=self.title_font_size)
  206. btn_font = make_font(size=self.btn_font_size)
  207. self.enter_frame['bg'] = "#b69968"
  208. self.enter_frame['bd'] = 5
  209. self.enter_frame['relief'] = "ridge"
  210. self.enter_frame.place(relx=0.2, rely=0.3, relwidth=0.6, relheight=0.17)
  211. height = 0.1
  212. for lb, text, enter, var in zip(self.title, ["Count:", "Export:"], self.enter, self.var):
  213. lb['font'] = title_font
  214. lb['text'] = text
  215. lb['bg'] = "#b69968"
  216. lb['anchor'] = 'e'
  217. enter['font'] = title_font
  218. enter['textvariable'] = var
  219. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.35)
  220. enter.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.35)
  221. height += 0.43
  222. for btn, text, x, func in zip([self.creat_btn, self.file_btn],
  223. ["Creat", "ChoosePath"],
  224. [0.2, 0.6],
  225. [lambda: self.creat_garbage(), lambda: self.choose_file()]):
  226. btn['font'] = btn_font
  227. btn['text'] = text
  228. btn['bg'] = conf.tk_btn_bg
  229. btn['command'] = func
  230. btn.place(relx=x, rely=0.7, relwidth=0.2, relheight=0.08)
  231. def choose_file(self):
  232. path = askdirectory(title='path to save qr code')
  233. self.var[1].set(path)
  234. def creat_garbage(self):
  235. try:
  236. count = int(self.var[0].get())
  237. if count <= 0:
  238. raise ValueError
  239. except (ValueError, TypeError):
  240. self.station.show_msg("TypeError", "Count must be number > 1")
  241. else:
  242. path = self.var[1].get()
  243. if len(path) == 0:
  244. path = None
  245. event = tk_event.CreatGarbageEvent(self.station).start(path, count)
  246. self.station.push_event(event)
  247. def set_disable(self):
  248. self.creat_btn['state'] = 'disable'
  249. self.file_btn['state'] = 'disable'
  250. set_tk_disable_from_list(self.enter)
  251. def reset_disable(self):
  252. self.creat_btn['state'] = 'normal'
  253. self.file_btn['state'] = 'normal'
  254. set_tk_disable_from_list(self.enter, flat='normal')
  255. class DeleteUserProgram(AdminProgram):
  256. def __init__(self, station, win, color):
  257. super().__init__(station, win, color, "DeleteUser")
  258. self.uid_frame = tk.Frame(self.frame)
  259. self.uid_title: tk.Label = tk.Label(self.uid_frame)
  260. self.uid_enter: tk.Entry = tk.Entry(self.uid_frame)
  261. self.uid_var: tk.Variable = tk.StringVar()
  262. self.name_frame = tk.Frame(self.frame)
  263. self.name_title: List[tk.Label] = [tk.Label(self.name_frame) for _ in range(2)]
  264. self.name_enter: List[tk.Entry] = [tk.Entry(self.name_frame) for _ in range(2)]
  265. self.name_var: List[tk.Variable] = [tk.StringVar() for _ in range(2)]
  266. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)] # uid-del, name-passwd-del
  267. self.__conf_font()
  268. def __conf_font(self, n: int = 1):
  269. self.title_font_size = int(16 * n)
  270. self.btn_font_size = int(14 * n)
  271. def conf_gui(self, n: int = 1):
  272. self.__conf_font(n)
  273. title_font = make_font(size=self.title_font_size)
  274. btn_font = make_font(size=self.btn_font_size)
  275. self.uid_frame['bg'] = "#FA8072"
  276. self.uid_frame['bd'] = 5
  277. self.uid_frame['relief'] = "ridge"
  278. self.uid_frame.place(relx=0.2, rely=0.20, relwidth=0.6, relheight=0.10)
  279. self.name_frame['bg'] = "#FA8072"
  280. self.name_frame['bd'] = 5
  281. self.name_frame['relief'] = "ridge"
  282. self.name_frame.place(relx=0.2, rely=0.48, relwidth=0.6, relheight=0.25)
  283. height = 0.17
  284. for lb, text, enter, var in zip(self.name_title, ["UserName:", "PassWord:"], self.name_enter, self.name_var):
  285. lb['font'] = title_font
  286. lb['text'] = text
  287. lb['bg'] = "#FA8072"
  288. lb['anchor'] = 'e'
  289. enter['font'] = title_font
  290. enter['textvariable'] = var
  291. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.20)
  292. enter.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.20)
  293. height += 0.45
  294. self.uid_title['font'] = title_font
  295. self.uid_title['text'] = "UserID:"
  296. self.uid_title['bg'] = "#FA8072"
  297. self.uid_title['anchor'] = 'e'
  298. self.uid_enter['font'] = title_font
  299. self.uid_enter['textvariable'] = self.uid_var
  300. self.uid_title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  301. self.uid_enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  302. for btn, text, func in zip(self.btn,
  303. ["Delete By Uid", "Delete By Name"],
  304. [lambda: self.del_by_uid(), lambda: self.del_by_name()]):
  305. btn['font'] = btn_font
  306. btn['text'] = text
  307. btn['bg'] = conf.tk_btn_bg
  308. btn['command'] = func
  309. self.btn[0].place(relx=0.6, rely=0.32, relwidth=0.2, relheight=0.08)
  310. self.btn[1].place(relx=0.6, rely=0.75, relwidth=0.2, relheight=0.08)
  311. def del_by_uid(self):
  312. uid = self.uid_var.get()
  313. if len(uid) != 32:
  314. self.station.show_msg("UserID Error", "Len of UserID must be 32", "Error")
  315. return
  316. event = tk_event.DelUserEvent(self.station).start(uid)
  317. self.station.push_event(event)
  318. def del_by_name(self):
  319. name = self.name_var[0].get()
  320. passwd = self.name_var[1].get()
  321. if len(name) == 0 or len(passwd) == 0:
  322. self.station.show_msg("UserName/Password Error", "You should enter UserName and Password", "Error")
  323. return
  324. uid = creat_uid(name, passwd)
  325. event = tk_event.DelUserEvent(self.station).start(uid)
  326. self.station.push_event(event)
  327. def set_disable(self):
  328. set_tk_disable_from_list(self.btn)
  329. set_tk_disable_from_list(self.name_enter)
  330. self.uid_enter['state'] = 'disable'
  331. def reset_disable(self):
  332. set_tk_disable_from_list(self.btn, flat='normal')
  333. set_tk_disable_from_list(self.name_enter, flat='normal')
  334. self.uid_enter['state'] = 'normal'
  335. class DeleteUsersProgram(AdminProgram):
  336. def __init__(self, station, win, color):
  337. super().__init__(station, win, color, "DeleteUsers")
  338. self.enter_frame = tk.Frame(self.frame)
  339. self.title: tk.Label = tk.Label(self.enter_frame)
  340. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  341. self.var: tk.Variable = tk.StringVar()
  342. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)] # del, scan
  343. self.__conf_font()
  344. def __conf_font(self, n: int = 1):
  345. self.title_font_size = int(16 * n)
  346. self.btn_font_size = int(14 * n)
  347. def conf_gui(self, n: int = 1):
  348. self.__conf_font(n)
  349. title_font = make_font(size=self.title_font_size)
  350. btn_font = make_font(size=self.btn_font_size)
  351. self.enter_frame['bg'] = "#48c0a3"
  352. self.enter_frame['bd'] = 5
  353. self.enter_frame['relief'] = "ridge"
  354. self.enter_frame.place(relx=0.2, rely=0.30, relwidth=0.6, relheight=0.10)
  355. self.title['font'] = title_font
  356. self.title['text'] = "Where:"
  357. self.title['anchor'] = 'e'
  358. self.title['bg'] = "#48c0a3"
  359. self.enter['font'] = title_font
  360. self.enter['textvariable'] = self.var
  361. self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  362. self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  363. for btn, text, x, func in zip(self.btn,
  364. ["Delete", "Scan"],
  365. [0.2, 0.6],
  366. [lambda: self.delete_user(), lambda: self.scan_user()]):
  367. btn['font'] = btn_font
  368. btn['text'] = text
  369. btn['bg'] = conf.tk_btn_bg
  370. btn['command'] = func
  371. btn.place(relx=x, rely=0.6, relwidth=0.2, relheight=0.08)
  372. def delete_user(self):
  373. where = self.var.get()
  374. if len(where) == 0:
  375. self.station.show_msg("`Where`Error", "`Where` must be SQL", "Warning")
  376. return
  377. event = tk_event.DelUserFromWhereEvent(self.station).start(where)
  378. self.station.push_event(event)
  379. def scan_user(self):
  380. where = self.var.get()
  381. if len(where) == 0:
  382. self.station.show_msg("`Where`Error", "`Where` must be SQL", "Warning")
  383. return
  384. event = tk_event.DelUserFromWhereScanEvent(self.station).start(where)
  385. self.station.push_event(event)
  386. def set_disable(self):
  387. set_tk_disable_from_list(self.btn)
  388. self.enter['state'] = 'disable'
  389. def reset_disable(self):
  390. set_tk_disable_from_list(self.btn, flat='normal')
  391. self.enter['state'] = 'normal'
  392. class DeleteGarbageProgramBase(AdminProgram):
  393. def __init__(self, station, win, color, title: str):
  394. super().__init__(station, win, color, title)
  395. self.enter_frame = tk.Frame(self.frame)
  396. self.title: tk.Label = tk.Label(self.enter_frame)
  397. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  398. self.var: tk.Variable = tk.StringVar()
  399. self.int_var: tk.Variable = tk.IntVar()
  400. self.int_var.set(0)
  401. self.radio: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(4)] # del, scan
  402. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)] # del, scan
  403. self.__conf_font()
  404. self._conf()
  405. def _conf(self, title: str = "GarbageID:", color: str = "#b69968"):
  406. self.frame_title = title
  407. self.frame_color = color
  408. def __conf_font(self, n: int = 1):
  409. self.title_font_size = int(16 * n)
  410. self.btn_font_size = int(14 * n)
  411. def conf_gui(self, n: int = 1):
  412. self.__conf_font(n)
  413. title_font = make_font(size=self.title_font_size)
  414. btn_font = make_font(size=self.btn_font_size)
  415. self.enter_frame['bg'] = self.frame_color
  416. self.enter_frame['bd'] = 5
  417. self.enter_frame['relief'] = "ridge"
  418. self.enter_frame.place(relx=0.2, rely=0.30, relwidth=0.6, relheight=0.10)
  419. self.title['font'] = title_font
  420. self.title['text'] = self.frame_title
  421. self.title['bg'] = self.frame_color
  422. self.title['anchor'] = 'e'
  423. self.enter['font'] = title_font
  424. self.enter['textvariable'] = self.var
  425. self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  426. self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  427. for i in range(4):
  428. radio = self.radio[i]
  429. radio['font'] = btn_font
  430. radio['text'] = ['From-All', 'From-NotUse', 'From-Waiting', 'From-Used'][i]
  431. radio['bg'] = self.color
  432. radio['value'] = i
  433. radio['variable'] = self.int_var
  434. radio['anchor'] = 'w'
  435. self.radio[0].place(relx=0.20, rely=0.43, relwidth=0.20, relheight=0.1)
  436. self.radio[1].place(relx=0.60, rely=0.43, relwidth=0.20, relheight=0.1)
  437. self.radio[2].place(relx=0.20, rely=0.55, relwidth=0.20, relheight=0.1)
  438. self.radio[3].place(relx=0.60, rely=0.55, relwidth=0.20, relheight=0.1)
  439. for btn, text, x in zip(self.btn, ["Delete", "Scan"], [0.2, 0.6]):
  440. btn['font'] = btn_font
  441. btn['text'] = text
  442. btn['bg'] = conf.tk_btn_bg
  443. btn.place(relx=x, rely=0.68, relwidth=0.2, relheight=0.08)
  444. def set_disable(self):
  445. set_tk_disable_from_list(self.btn)
  446. self.enter['state'] = 'disable'
  447. def reset_disable(self):
  448. set_tk_disable_from_list(self.btn, flat='normal')
  449. self.enter['state'] = 'normal'
  450. class DeleteAllGarbageProgram(AdminProgram):
  451. def __init__(self, station, win, color):
  452. super().__init__(station, win, color, "DeleteAllGarbage")
  453. self.dangerous: tk.Label = tk.Label(self.frame)
  454. self.enter_frame = tk.Frame(self.frame)
  455. self.title: tk.Label = tk.Label(self.enter_frame)
  456. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  457. self.var: tk.Variable = tk.StringVar()
  458. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)] # del, scan
  459. self.__conf_font()
  460. def __conf_font(self, n: int = 1):
  461. self.danger_font_size = int(20 * n)
  462. self.title_font_size = int(16 * n)
  463. self.btn_font_size = int(14 * n)
  464. def conf_gui(self, n: int = 1):
  465. self.__conf_font(n)
  466. danger_font = make_font(size=self.danger_font_size, weight="bold", underline=1)
  467. title_font = make_font(size=self.title_font_size)
  468. btn_font = make_font(size=self.btn_font_size)
  469. danger_btn_font = make_font(size=self.btn_font_size, weight="bold", overstrike=1)
  470. self.dangerous['bg'] = self.color
  471. self.dangerous['font'] = danger_font
  472. self.dangerous['fg'] = "#f20c00"
  473. self.dangerous['text'] = ("Delete all garbage from database?\n"
  474. "Please enter the admin-passwd to\n"
  475. "continue.\n"
  476. "Dangerous operation.\n"
  477. "The database may not be restored.\n"
  478. "SuperHuan is not responsible for\n"
  479. "the consequences.")
  480. self.dangerous.place(relx=0.05, rely=0.03, relwidth=0.9, relheight=0.43)
  481. self.enter_frame['bg'] = "#f20c00"
  482. self.enter_frame['bd'] = 5
  483. self.enter_frame['relief'] = "ridge"
  484. self.enter_frame.place(relx=0.2, rely=0.50, relwidth=0.6, relheight=0.10)
  485. self.title['font'] = title_font
  486. self.title['text'] = "Password:"
  487. self.title['bg'] = "#f20c00"
  488. self.title['anchor'] = 'e'
  489. self.enter['font'] = title_font
  490. self.enter['textvariable'] = self.var
  491. self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  492. self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  493. for btn, text, x in zip(self.btn, ["Delete", "Scan"], [0.2, 0.6]):
  494. btn['text'] = text
  495. btn.place(relx=x, rely=0.68, relwidth=0.2, relheight=0.08)
  496. self.btn[0]['font'] = danger_btn_font
  497. self.btn[0]['bg'] = "#f20c00"
  498. self.btn[1]['font'] = btn_font
  499. self.btn[1]['bg'] = conf.tk_btn_bg
  500. def set_disable(self):
  501. set_tk_disable_from_list(self.btn)
  502. self.enter['state'] = 'disable'
  503. def reset_disable(self):
  504. set_tk_disable_from_list(self.btn, flat='normal')
  505. self.enter['state'] = 'normal'
  506. class DeleteGarbageProgram(DeleteGarbageProgramBase):
  507. def __init__(self, station, win, color):
  508. super(DeleteGarbageProgram, self).__init__(station, win, color, "DeleteGarbage")
  509. class DeleteGarbageMoreProgram(DeleteGarbageProgramBase):
  510. def __init__(self, station, win, color):
  511. super(DeleteGarbageMoreProgram, self).__init__(station, win, color, "DeleteGarbageMore")
  512. self._conf("Where:", "#f58f98")
  513. class SearchBaseProgram(AdminProgram, metaclass=abc.ABCMeta):
  514. def __init__(self, station, win, color, title: str):
  515. super().__init__(station, win, color, title)
  516. self.view_frame = tk.Frame(self.frame)
  517. self.view = ttk.Treeview(self.view_frame)
  518. self.y_scroll = tk.Scrollbar(self.view_frame)
  519. self.x_scroll = tk.Scrollbar(self.view_frame)
  520. def conf_view_gui(self, columns: list, relx, rely, relwidth, relheight,
  521. x_scroll=0.05, y_scroll=0.02, color: str = "#FA8072"):
  522. self.view_frame['bg'] = color
  523. self.view_frame['bd'] = 2
  524. self.view_frame['relief'] = "ridge"
  525. self.view_frame.place(relx=relx, rely=rely, relwidth=relwidth, relheight=relheight)
  526. self.view['columns'] = columns
  527. self.view['show'] = 'headings'
  528. self.view['selectmode'] = 'none'
  529. for i in columns:
  530. self.view.column(i, anchor="c")
  531. self.view.heading(i, text=i)
  532. self.y_scroll['orient'] = 'vertical'
  533. self.y_scroll['command'] = self.view.yview
  534. self.view['yscrollcommand'] = self.y_scroll.set
  535. self.x_scroll['orient'] = 'horizontal'
  536. self.x_scroll['command'] = self.view.xview
  537. self.view['xscrollcommand'] = self.x_scroll.set
  538. self.view.place(relx=0.0, rely=0.0, relwidth=1 - y_scroll, relheight=1 - x_scroll)
  539. self.y_scroll.place(relx=0.98, rely=0.0, relwidth=y_scroll, relheight=1.0)
  540. self.x_scroll.place(relx=0.0, rely=1 - x_scroll, relwidth=1 - y_scroll, relheight=x_scroll)
  541. class SearchUserProgram(SearchBaseProgram):
  542. def __init__(self, station, win, color):
  543. super().__init__(station, win, color, "SearchUser")
  544. self.enter_frame = tk.Frame(self.frame)
  545. self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(3)]
  546. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame) for _ in range(3)]
  547. self.var: List[tk.Variable] = [tk.StringVar() for _ in range(3)]
  548. self.check: List[Tuple[tk.Checkbutton, tk.Variable]] = [(tk.Checkbutton(self.enter_frame), tk.IntVar())
  549. for _ in range(3)]
  550. self.btn: tk.Button = tk.Button(self.frame)
  551. self.__conf_font()
  552. def __conf_font(self, n: int = 1):
  553. self.title_font_size = int(16 * n)
  554. self.btn_font_size = int(14 * n)
  555. def conf_gui(self, n: int = 1):
  556. self.__conf_font(n)
  557. title_font = make_font(size=self.title_font_size)
  558. btn_font = make_font(size=self.btn_font_size)
  559. self.enter_frame['bg'] = "#FA8072"
  560. self.enter_frame['bd'] = 5
  561. self.enter_frame['relief'] = "ridge"
  562. self.enter_frame.place(relx=0.2, rely=0.0, relwidth=0.6, relheight=0.30)
  563. height = 0.1
  564. for lb, text, enter, var, check in zip(self.title,
  565. ["UserID:", "UserName:", "Phone:"],
  566. self.enter, self.var, self.check):
  567. lb['font'] = title_font
  568. lb['text'] = text
  569. lb['bg'] = "#FA8072"
  570. lb['anchor'] = 'e'
  571. enter['font'] = title_font
  572. enter['textvariable'] = var
  573. check[0]['font'] = title_font
  574. check[0]['text'] = ''
  575. check[0]['bg'] = "#FA8072"
  576. check[0]['variable'] = check[1]
  577. check[1].set(1)
  578. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.17)
  579. enter.place(relx=0.35, rely=height, relwidth=0.55, relheight=0.17)
  580. check[0].place(relx=0.92, rely=height, relwidth=0.04, relheight=0.17)
  581. height += 0.30
  582. self.btn['font'] = btn_font
  583. self.btn['text'] = "Search"
  584. self.btn['bg'] = conf.tk_btn_bg
  585. self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
  586. columns = ["UserID", "UserName", "Phone", "Score", "Reputation", "Rubbish"]
  587. self.conf_view_gui(columns, relx=0.05, rely=0.32, relwidth=0.9, relheight=0.55)
  588. def set_disable(self):
  589. self.btn['state'] = 'disable'
  590. set_tk_disable_from_list(self.enter)
  591. def reset_disable(self):
  592. self.btn['state'] = 'normal'
  593. set_tk_disable_from_list(self.enter, flat='normal')
  594. class SearchUserAdvancedProgramBase(SearchBaseProgram, metaclass=abc.ABCMeta):
  595. def __init__(self, station, win, color, title: str):
  596. super().__init__(station, win, color, title)
  597. self.enter_frame = tk.Frame(self.frame)
  598. self.title: tk.Label = tk.Label(self.enter_frame)
  599. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  600. self.var: tk.Variable = tk.StringVar()
  601. self.btn: tk.Button = tk.Button(self.frame)
  602. self._conf([], "#FA8072") # 默认颜色
  603. self.__conf_font()
  604. def _conf(self, columns: list, bg_color):
  605. self.bg_color = bg_color
  606. self._columns = columns
  607. return self
  608. def __conf_font(self, n: int = 1):
  609. self.title_font_size = int(16 * n)
  610. self.btn_font_size = int(14 * n)
  611. def conf_gui(self, n: int = 1):
  612. self.__conf_font(n)
  613. title_font = make_font(size=self.title_font_size)
  614. btn_font = make_font(size=self.btn_font_size)
  615. self.enter_frame['bg'] = self.bg_color
  616. self.enter_frame['bd'] = 5
  617. self.enter_frame['relief'] = "ridge"
  618. self.enter_frame.place(relx=0.2, rely=0.00, relwidth=0.6, relheight=0.10)
  619. self.title['font'] = title_font
  620. self.title['bg'] = self.bg_color
  621. self.title['text'] = "Where:"
  622. self.title['anchor'] = 'e'
  623. self.enter['font'] = title_font
  624. self.enter['textvariable'] = self.var
  625. self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  626. self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  627. self.btn['text'] = "Search"
  628. self.btn['font'] = btn_font
  629. self.btn['bg'] = conf.tk_btn_bg
  630. self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
  631. self.conf_view_gui(self._columns, relx=0.05, rely=0.12, relwidth=0.9, relheight=0.76)
  632. def set_disable(self):
  633. self.btn['state'] = 'disable'
  634. self.enter['state'] = 'disable'
  635. def reset_disable(self):
  636. self.btn['state'] = 'normal'
  637. self.enter['state'] = 'normal'
  638. class SearchUserAdvancedProgram(SearchUserAdvancedProgramBase):
  639. def __init__(self, station, win, color):
  640. super(SearchUserAdvancedProgram, self).__init__(station, win, color, "SearchUserAdvanced")
  641. columns = ["UserID", "UserName", "Phone", "Score", "Reputation", "Rubbish"]
  642. self._conf(columns, '#48c0a3')
  643. class SearchGarbageProgram(SearchBaseProgram):
  644. def __init__(self, station, win, color):
  645. super().__init__(station, win, color, "SearchGarbage")
  646. self.enter_frame = tk.Frame(self.frame)
  647. self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(7)]
  648. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame) for _ in range(7)]
  649. self.var: List[tk.Variable] = [tk.StringVar() for _ in range(7)]
  650. self.check: List[Tuple[tk.Checkbutton, tk.Variable]] = [(tk.Checkbutton(self.enter_frame), tk.IntVar())
  651. for _ in range(7)]
  652. self.btn: tk.Button = tk.Button(self.frame)
  653. self.__conf_font()
  654. def __conf_font(self, n: int = 1):
  655. self.title_font_size = int(16 * n)
  656. self.btn_font_size = int(14 * n)
  657. def conf_gui(self, n: int = 1):
  658. self.__conf_font(n)
  659. title_font = make_font(size=self.title_font_size)
  660. btn_font = make_font(size=self.btn_font_size)
  661. self.enter_frame['bg'] = "#7bbfea"
  662. self.enter_frame['bd'] = 5
  663. self.enter_frame['relief'] = "ridge"
  664. self.enter_frame.place(relx=0.2, rely=0.0, relwidth=0.6, relheight=0.45)
  665. height = 0.02
  666. for lb, text, enter, var, check in zip(self.title,
  667. ["GarbageID:", "UserID:", "CheckerID:", "UseTime:",
  668. "Location:", "GarbageType:", "CheckResult:"],
  669. self.enter, self.var, self.check):
  670. lb['font'] = title_font
  671. lb['text'] = text
  672. lb['bg'] = "#7bbfea"
  673. lb['anchor'] = 'e'
  674. enter['font'] = title_font
  675. enter['textvariable'] = var
  676. check[0]['font'] = title_font
  677. check[0]['bg'] = "#7bbfea"
  678. check[0]['text'] = ''
  679. check[0]['variable'] = check[1]
  680. check[1].set(1)
  681. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.12)
  682. enter.place(relx=0.35, rely=height, relwidth=0.55, relheight=0.12)
  683. check[0].place(relx=0.92, rely=height, relwidth=0.04, relheight=0.12)
  684. height += 0.14
  685. self.btn['font'] = btn_font
  686. self.btn['bg'] = conf.tk_btn_bg
  687. self.btn['text'] = "Search"
  688. self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
  689. columns = ["GarbageID", "UserID", "CheckerID", "UseTime", "Location", "GarbageType", "CheckResult"]
  690. self.conf_view_gui(columns, relx=0.05, rely=0.47, relwidth=0.9, relheight=0.40, x_scroll=0.07)
  691. def set_disable(self):
  692. self.btn['state'] = 'disable'
  693. set_tk_disable_from_list(self.enter)
  694. def reset_disable(self):
  695. self.btn['state'] = 'normal'
  696. set_tk_disable_from_list(self.enter, flat='normal')
  697. class SearchGarbageAdvancedProgram(SearchUserAdvancedProgramBase):
  698. def __init__(self, station, win, color):
  699. super(SearchGarbageAdvancedProgram, self).__init__(station, win, color, "SearchGarbageAdvanced")
  700. columns = ["GarbageID", "UserID", "CheckerID", "UseTime", "Location", "GarbageType", "CheckResult"]
  701. self._conf(columns, '#d1923f')
  702. class SearchAdvancedProgram(SearchUserAdvancedProgramBase):
  703. def __init__(self, station, win, color):
  704. super(SearchAdvancedProgram, self).__init__(station, win, color, "SearchAdvanced")
  705. columns = ["GarbageID", "UserID", "UserName", "Phone", "Score", "Reputation", "Rubbish",
  706. "CheckerID", "CheckerName", "CheckerPhone", "UseTime", "Location", "GarbageType", "CheckResult"]
  707. self._conf(columns, '#426ab3')
  708. class UpdateUserProgramBase(AdminProgram):
  709. def __init__(self, station, win, color, title: str):
  710. super().__init__(station, win, color, title)
  711. self.enter_frame = tk.Frame(self.frame)
  712. self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(2)]
  713. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame) for _ in range(2)]
  714. self.var: List[tk.Variable] = [tk.StringVar() for _ in range(2)]
  715. self.where_frame = tk.Frame(self.frame)
  716. self.where_title: List[tk.Label] = [tk.Label(self.where_frame) for _ in range(2)]
  717. self.where_enter: List[tk.Entry] = [tk.Entry(self.where_frame) for _ in range(2)]
  718. self.where_var: List[tk.Variable] = [tk.StringVar() for _ in range(2)]
  719. self.btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  720. self._conf(["", ""], "#FA8072")
  721. self.__conf_font()
  722. def _conf(self, title: List[str], bg_color: str):
  723. self.bg_color = bg_color
  724. self.bg_color_where = bg_color
  725. self.enter_title = title
  726. def __conf_font(self, n: int = 1):
  727. self.title_font_size = int(16 * n)
  728. self.btn_font_size = int(14 * n)
  729. def conf_gui(self, n: int = 1):
  730. self.__conf_font(n)
  731. title_font = make_font(size=self.title_font_size)
  732. btn_font = make_font(size=self.btn_font_size)
  733. self.where_frame['bg'] = self.bg_color_where
  734. self.where_frame['bd'] = 5
  735. self.where_frame['relief'] = "ridge"
  736. self.where_frame.place(relx=0.2, rely=0.20, relwidth=0.6, relheight=0.17)
  737. self.enter_frame['bg'] = self.bg_color
  738. self.enter_frame['bd'] = 5
  739. self.enter_frame['relief'] = "ridge"
  740. self.enter_frame.place(relx=0.2, rely=0.58, relwidth=0.6, relheight=0.17)
  741. height = 0.1
  742. for lb, text, enter, var, lb_w, text_w, enter_w, var_w in (
  743. zip(self.title, self.enter_title, self.enter, self.var,
  744. self.where_title, ["Where:", self.enter_title[1]], self.where_enter, self.where_var)):
  745. lb['font'] = title_font
  746. lb['text'] = text
  747. lb['bg'] = self.bg_color
  748. lb['anchor'] = 'e'
  749. lb_w['font'] = title_font
  750. lb_w['text'] = text_w
  751. lb_w['bg'] = self.bg_color_where
  752. lb_w['anchor'] = 'e'
  753. enter['font'] = title_font
  754. enter['textvariable'] = var
  755. enter_w['font'] = title_font
  756. enter_w['textvariable'] = var_w
  757. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.35)
  758. enter.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.35)
  759. lb_w.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.35)
  760. enter_w.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.35)
  761. height += 0.43
  762. for btn, text in zip(self.btn, ["Update Advanced", "Update By UserID"]):
  763. btn['font'] = btn_font
  764. btn['text'] = text
  765. btn['bg'] = conf.tk_btn_bg
  766. self.btn[0].place(relx=0.55, rely=0.40, relwidth=0.25, relheight=0.08)
  767. self.btn[1].place(relx=0.55, rely=0.78, relwidth=0.25, relheight=0.08)
  768. def set_disable(self):
  769. set_tk_disable_from_list(self.btn)
  770. set_tk_disable_from_list(self.enter)
  771. def reset_disable(self):
  772. set_tk_disable_from_list(self.btn, flat='normal')
  773. set_tk_disable_from_list(self.enter, flat='normal')
  774. class UpdateUserScoreBase(UpdateUserProgramBase):
  775. def __init__(self, station, win, color):
  776. super(UpdateUserScoreBase, self).__init__(station, win, color, "UpdateScore")
  777. self._conf(["UserID:", "Score:"], "#afdfe4")
  778. class UpdateUserReputationBase(UpdateUserProgramBase):
  779. def __init__(self, station, win, color):
  780. super(UpdateUserReputationBase, self).__init__(station, win, color, "UpdateReputation")
  781. self._conf(["UserID:", "Reputation:"], "#f8aba6")
  782. class UpdateGarbageTypeProgram(AdminProgram):
  783. def __init__(self, station, win, color):
  784. super().__init__(station, win, color, "UpdateGarbageType")
  785. self.enter_frame = tk.Frame(self.frame)
  786. self.title: tk.Label = tk.Label(self.enter_frame)
  787. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  788. self.type: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(4)]
  789. self.var: List[tk.Variable] = [tk.StringVar, tk.IntVar()]
  790. self.where_frame = tk.Frame(self.frame)
  791. self.where_title: tk.Label = tk.Label(self.where_frame)
  792. self.where_enter: tk.Entry = tk.Entry(self.where_frame)
  793. self.where_type: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(4)]
  794. self.where_var: List[tk.Variable] = [tk.StringVar, tk.IntVar()]
  795. self.btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  796. self.__conf_font()
  797. def __conf_font(self, n: int = 1):
  798. self.title_font_size = int(16 * n)
  799. self.btn_font_size = int(14 * n)
  800. def conf_gui(self, n: int = 1):
  801. self.__conf_font(n)
  802. title_font = make_font(size=self.title_font_size)
  803. btn_font = make_font(size=self.btn_font_size)
  804. self.where_frame['bg'] = "#fdb933"
  805. self.where_frame['bd'] = 5
  806. self.where_frame['relief'] = "ridge"
  807. self.where_frame.place(relx=0.2, rely=0.20, relwidth=0.6, relheight=0.10)
  808. self.enter_frame['bg'] = "#fdb933"
  809. self.enter_frame['bd'] = 5
  810. self.enter_frame['relief'] = "ridge"
  811. self.enter_frame.place(relx=0.2, rely=0.60, relwidth=0.6, relheight=0.10)
  812. for lb, enter, radios, var, y, text in zip([self.title, self.where_title],
  813. [self.enter, self.where_enter],
  814. [self.type, self.where_type],
  815. [self.var, self.where_var],
  816. [0.32, 0.72],
  817. ["GarbageID:", "Where:"]):
  818. lb['font'] = title_font
  819. lb['text'] = text
  820. lb['bg'] = "#fdb933"
  821. lb['anchor'] = 'e'
  822. enter['font'] = title_font
  823. enter['textvariable'] = var[0]
  824. for i, radio in enumerate(radios):
  825. radio['font'] = btn_font
  826. radio['bg'] = self.color
  827. radio['text'] = GarbageType.GarbageTypeStrList[i + 1]
  828. radio['value'] = i + 1
  829. radio['variable'] = var[1]
  830. radio['anchor'] = 'w'
  831. var[1].set(1)
  832. radios[0].place(relx=0.20, rely=y + 0.00, relwidth=0.20, relheight=0.04)
  833. radios[1].place(relx=0.60, rely=y + 0.00, relwidth=0.20, relheight=0.04)
  834. radios[2].place(relx=0.20, rely=y + 0.05, relwidth=0.20, relheight=0.04)
  835. radios[3].place(relx=0.60, rely=y + 0.05, relwidth=0.20, relheight=0.04)
  836. lb.place(relx=0.02, rely=0.2, relwidth=0.25, relheight=0.48)
  837. enter.place(relx=0.30, rely=0.2, relwidth=0.60, relheight=0.48)
  838. for btn, text in zip(self.btn, ["Update Advanced", "Update By GarbageID"]):
  839. btn['font'] = btn_font
  840. btn['text'] = text
  841. btn['bg'] = conf.tk_btn_bg
  842. self.btn[0].place(relx=0.55, rely=0.43, relwidth=0.25, relheight=0.08)
  843. self.btn[1].place(relx=0.55, rely=0.83, relwidth=0.25, relheight=0.08)
  844. def set_disable(self):
  845. set_tk_disable_from_list(self.btn)
  846. self.enter['state'] = 'disable'
  847. self.where_enter['state'] = 'normal'
  848. def reset_disable(self):
  849. set_tk_disable_from_list(self.btn, flat='normal')
  850. self.enter['state'] = 'normal'
  851. self.where_enter['state'] = 'normal'
  852. class UpdateGarbageCheckResultProgram(AdminProgram):
  853. def __init__(self, station, win, color):
  854. super().__init__(station, win, color, "UpdateGarbageCheckResult")
  855. self.enter_frame = tk.Frame(self.frame)
  856. self.title: tk.Label = tk.Label(self.enter_frame)
  857. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  858. self.type: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(2)]
  859. self.var: List[tk.Variable] = [tk.StringVar, tk.IntVar()]
  860. self.where_frame = tk.Frame(self.frame)
  861. self.where_title: tk.Label = tk.Label(self.where_frame)
  862. self.where_enter: tk.Entry = tk.Entry(self.where_frame)
  863. self.where_type: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(2)]
  864. self.where_var: List[tk.Variable] = [tk.StringVar, tk.IntVar()]
  865. self.btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  866. self.__conf_font()
  867. def __conf_font(self, n: int = 1):
  868. self.title_font_size = int(16 * n)
  869. self.btn_font_size = int(14 * n)
  870. def conf_gui(self, n: int = 1):
  871. self.__conf_font(n)
  872. title_font = make_font(size=self.title_font_size)
  873. btn_font = make_font(size=self.btn_font_size)
  874. self.where_frame['bg'] = "#abc88b"
  875. self.where_frame['bd'] = 5
  876. self.where_frame['relief'] = "ridge"
  877. self.where_frame.place(relx=0.2, rely=0.20, relwidth=0.6, relheight=0.10)
  878. self.enter_frame['bg'] = "#abc88b"
  879. self.enter_frame['bd'] = 5
  880. self.enter_frame['relief'] = "ridge"
  881. self.enter_frame.place(relx=0.2, rely=0.60, relwidth=0.6, relheight=0.10)
  882. for lb, enter, radios, var, y, text in zip([self.title, self.where_title],
  883. [self.enter, self.where_enter],
  884. [self.type, self.where_type],
  885. [self.var, self.where_var],
  886. [0.32, 0.72],
  887. ["GarbageID:", "Where:"]):
  888. lb['font'] = title_font
  889. lb['text'] = text
  890. lb['bg'] = "#abc88b"
  891. lb['anchor'] = 'e'
  892. enter['font'] = title_font
  893. enter['textvariable'] = var[0]
  894. for i, radio in enumerate(radios):
  895. radio['font'] = btn_font
  896. radio['bg'] = self.color
  897. radio['text'] = ["Fail", "Pass"][i]
  898. radio['value'] = i
  899. radio['variable'] = var[1]
  900. radio['anchor'] = 'w'
  901. var[1].set(1)
  902. radios[0].place(relx=0.20, rely=y + 0.00, relwidth=0.20, relheight=0.04)
  903. radios[1].place(relx=0.60, rely=y + 0.00, relwidth=0.20, relheight=0.04)
  904. lb.place(relx=0.02, rely=0.2, relwidth=0.25, relheight=0.48)
  905. enter.place(relx=0.30, rely=0.2, relwidth=0.60, relheight=0.48)
  906. for btn, text in zip(self.btn, ["Update Advanced", "Update By GarbageID"]):
  907. btn['font'] = btn_font
  908. btn['bg'] = conf.tk_btn_bg
  909. btn['text'] = text
  910. self.btn[0].place(relx=0.55, rely=0.38, relwidth=0.25, relheight=0.08)
  911. self.btn[1].place(relx=0.55, rely=0.78, relwidth=0.25, relheight=0.08)
  912. def set_disable(self):
  913. set_tk_disable_from_list(self.btn)
  914. self.enter['state'] = 'disable'
  915. self.where_enter['state'] = 'normal'
  916. def reset_disable(self):
  917. set_tk_disable_from_list(self.btn, flat='normal')
  918. self.enter['state'] = 'normal'
  919. self.where_enter['state'] = 'normal'
  920. all_program = [WelcomeProgram, CreatNormalUserProgram, CreatManagerUserProgram, CreatAutoNormalUserProgram,
  921. CreatGarbageProgram, DeleteUserProgram, DeleteUsersProgram, DeleteGarbageProgram,
  922. DeleteGarbageMoreProgram, DeleteAllGarbageProgram, SearchUserProgram, SearchUserAdvancedProgram,
  923. SearchGarbageProgram, SearchGarbageAdvancedProgram, SearchAdvancedProgram, UpdateUserScoreBase,
  924. UpdateUserReputationBase, UpdateGarbageTypeProgram, UpdateGarbageCheckResultProgram]