admin_program.py 65 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727
  1. import abc
  2. import tkinter as tk
  3. import tkinter.ttk as ttk
  4. from tkinter.filedialog import askdirectory, askopenfilename
  5. from tool.type_ import *
  6. from tool.tk import make_font, set_tk_disable_from_list
  7. from tool.login import create_uid
  8. import conf
  9. import admin
  10. import admin_event as tk_event
  11. from sql.user import find_user_by_name
  12. from core.garbage import GarbageType
  13. class AdminProgram(metaclass=abc.ABCMeta):
  14. def __init__(self, station: admin.AdminStation, win: Union[tk.Frame, tk.Toplevel, tk.Tk], color: str, title: str):
  15. self.station = station
  16. self.win = win
  17. self.color = color
  18. self.frame = tk.Frame(self.win)
  19. self.frame['bg'] = color
  20. self.program_title = title
  21. @abc.abstractmethod
  22. def set_disable(self):
  23. ...
  24. @abc.abstractmethod
  25. def reset_disable(self):
  26. ...
  27. @abc.abstractmethod
  28. def conf_gui(self, n: int = 1):
  29. ...
  30. def get_program_frame(self) -> Tuple[str, tk.Frame]:
  31. return self.program_title, self.frame
  32. class WelcomeProgram(AdminProgram):
  33. def __init__(self, station, win, color):
  34. super().__init__(station, win, color, "Welcome")
  35. self.title = tk.Label(self.frame)
  36. self.info = tk.Label(self.frame)
  37. self.__conf_font()
  38. def __conf_font(self, n: int = 1):
  39. self.title_font_size = int(25 * n)
  40. self.info_font_size = int(14 * n)
  41. def conf_gui(self, n: int = 1):
  42. self.__conf_font(n)
  43. title_font = make_font(size=self.title_font_size, weight="bold")
  44. info_font = make_font(size=self.info_font_size)
  45. self.title['font'] = title_font
  46. self.title['bg'] = self.color
  47. self.title['text'] = 'Welcome to HGSSystem Manager\n[Help Page]'
  48. self.info['bg'] = self.color
  49. self.info['font'] = info_font
  50. self.info['anchor'] = 'nw'
  51. self.info['justify'] = 'left'
  52. self.info['text'] = (f'''
  53. HGSSystem 管理者界面:
  54. 1) 点击菜单按钮进入子菜单或程序
  55. 2) Creat 菜单包含创建类的程序
  56. 3) Delete 菜单包含删除类的程序
  57. 4) Search 菜单包含数据分析类的程序
  58. 5) Update 菜单包含数据更新类的程序
  59. 6)当离开操作系统时请退出登录以确保安全
  60. 7)只能使用具有管理员权限的账号登陆系统
  61. 8)只有admin用户可以完成危险操作(例如删除所有垃圾袋数据)
  62. 程序的运行:
  63. 1) 在菜单中选中程序后,根据程序界面提示完成操作
  64. 2) 操作过程通常会显示进度条,除非任务执行迅速
  65. 3) 结果通常会被反馈, 且不会自动消失
  66. 系统登录:
  67. 1) 仅Manager用户可以登录
  68. 关于彩蛋: 存在
  69. '''.strip())
  70. self.title.place(relx=0.1, rely=0.0, relwidth=0.8, relheight=0.2)
  71. self.info.place(relx=0.05, rely=0.21, relwidth=0.90, relheight=0.75)
  72. def set_disable(self):
  73. pass
  74. def reset_disable(self):
  75. pass
  76. class AboutProgram(AdminProgram):
  77. def __init__(self, station, win, color):
  78. super().__init__(station, win, color, "About")
  79. self.title = tk.Label(self.frame)
  80. self.info = tk.Label(self.frame)
  81. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)]
  82. self.__conf_font()
  83. def __conf_font(self, n: int = 1):
  84. self.title_font_size = int(25 * n)
  85. self.info_font_size = int(14 * n)
  86. def conf_gui(self, n: int = 1):
  87. self.__conf_font(n)
  88. title_font = make_font(size=self.title_font_size, weight="bold")
  89. info_font = make_font(size=self.info_font_size)
  90. self.title['font'] = title_font
  91. self.title['bg'] = self.color
  92. self.title['text'] = 'About HGSSystem Manager\n[About Page]'
  93. self.info['bg'] = self.color
  94. self.info['font'] = info_font
  95. self.info['anchor'] = 'nw'
  96. self.info['justify'] = 'left'
  97. self.info['text'] = conf.about_info
  98. self.title.place(relx=0.1, rely=0.0, relwidth=0.8, relheight=0.2)
  99. self.info.place(relx=0.05, rely=0.21, relwidth=0.90, relheight=0.75)
  100. def test_progress(self):
  101. event = tk_event.TestProgressEvent(self.station)
  102. self.station.push_event(event)
  103. def test_msg(self):
  104. self.station.show_msg("Test Msg", "test msg")
  105. def set_disable(self):
  106. set_tk_disable_from_list(self.btn)
  107. def reset_disable(self):
  108. set_tk_disable_from_list(self.btn, flat='normal')
  109. class CreateUserProgramBase(AdminProgram):
  110. def __init__(self, station, win, color, title: str):
  111. super().__init__(station, win, color, title)
  112. self.enter_frame = tk.Frame(self.frame)
  113. self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(3)]
  114. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame) for _ in range(3)]
  115. self.var: List[tk.Variable] = [tk.StringVar() for _ in range(3)]
  116. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)] # create(生成用户) try(计算uid)
  117. self._conf("#FA8072", False) # 默认颜色
  118. self.__conf_font()
  119. def _conf(self, bg_color, is_manager: bool):
  120. self.bg_color = bg_color
  121. self.is_manager = is_manager
  122. return self
  123. def __conf_font(self, n: int = 1):
  124. self.title_font_size = int(16 * n)
  125. self.btn_font_size = int(14 * n)
  126. def conf_gui(self, n: int = 1):
  127. self.__conf_font(n)
  128. title_font = make_font(size=self.title_font_size)
  129. btn_font = make_font(size=self.btn_font_size)
  130. self.enter_frame['bg'] = self.bg_color
  131. self.enter_frame['bd'] = 5
  132. self.enter_frame['relief'] = "ridge"
  133. self.enter_frame.place(relx=0.2, rely=0.3, relwidth=0.6, relheight=0.30)
  134. height = 0.1
  135. for lb, text, enter, var in zip(self.title, ["UserName:", "PassWord:", "Phone:"], self.enter, self.var):
  136. lb['font'] = title_font
  137. lb['text'] = text
  138. lb['bg'] = self.bg_color
  139. lb['anchor'] = 'e'
  140. enter['font'] = title_font
  141. enter['textvariable'] = var
  142. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.17)
  143. enter.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.17)
  144. height += 0.30
  145. for btn, text, x, func in zip(self.btn,
  146. ["Create", "GetUID"],
  147. [0.2, 0.6],
  148. [lambda: self.create_by_name(), lambda: self.get_uid()]):
  149. btn['font'] = btn_font
  150. btn['text'] = text
  151. btn['bg'] = conf.tk_btn_bg
  152. btn['command'] = func
  153. btn.place(relx=x, rely=0.7, relwidth=0.2, relheight=0.08)
  154. def __get_info(self) -> Optional[Tuple[uname_t, passwd_t, str]]:
  155. name: uname_t = self.var[0].get()
  156. passwd: passwd_t = self.var[1].get()
  157. phone: str = self.var[2].get()
  158. if len(name) == 0 or len(passwd) == 0 or len(phone) != 11:
  159. self.station.show_msg("UserInfoError", "Please, enter UserName/Passwd/Phone(11)")
  160. return None
  161. return name, passwd, phone
  162. def create_by_name(self):
  163. res = self.__get_info()
  164. if res is None:
  165. return
  166. name, passwd, phone = res
  167. event = tk_event.CreateUserEvent(self.station).start(name, passwd, phone, self.is_manager)
  168. self.station.push_event(event)
  169. def get_uid(self):
  170. res = self.__get_info()
  171. if res is None:
  172. return
  173. name, passwd, phone = res
  174. uid = create_uid(name, passwd, phone)
  175. self.station.show_msg("UserID", f"UserName: {name}\nUserID: {uid}")
  176. def set_disable(self):
  177. set_tk_disable_from_list(self.btn)
  178. set_tk_disable_from_list(self.enter)
  179. def reset_disable(self):
  180. set_tk_disable_from_list(self.btn, flat='normal')
  181. set_tk_disable_from_list(self.enter, flat='normal')
  182. class CreateNormalUserProgram(CreateUserProgramBase):
  183. def __init__(self, station, win, color):
  184. super(CreateNormalUserProgram, self).__init__(station, win, color, "CreateNormalUser")
  185. class CreateManagerUserProgram(CreateUserProgramBase):
  186. def __init__(self, station, win, color):
  187. super(CreateManagerUserProgram, self).__init__(station, win, color, "CreateManagerUser")
  188. self._conf("#4b5cc4", True)
  189. class CreateAutoNormalUserProgram(AdminProgram):
  190. def __init__(self, station, win, color):
  191. super().__init__(station, win, color, "CreateAutoNormalUser")
  192. self.enter_frame = tk.Frame(self.frame)
  193. self.title: tk.Label = tk.Label(self.enter_frame)
  194. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  195. self.var: tk.Variable = tk.StringVar()
  196. self.btn: tk.Button = tk.Button(self.frame) # create(生成用户) try(计算uid)
  197. self.__conf_font()
  198. def __conf_font(self, n: int = 1):
  199. self.title_font_size = int(16 * n)
  200. self.btn_font_size = int(14 * n)
  201. def conf_gui(self, n: int = 1):
  202. self.__conf_font(n)
  203. title_font = make_font(size=self.title_font_size)
  204. btn_font = make_font(size=self.btn_font_size)
  205. self.enter_frame['bg'] = "#bce672"
  206. self.enter_frame['bd'] = 5
  207. self.enter_frame['relief'] = "ridge"
  208. self.enter_frame.place(relx=0.2, rely=0.3, relwidth=0.6, relheight=0.12)
  209. self.title['font'] = title_font
  210. self.title['text'] = "Phone:"
  211. self.title['bg'] = "#bce672"
  212. self.title['anchor'] = 'e'
  213. self.enter['font'] = title_font
  214. self.enter['textvariable'] = self.var
  215. self.title.place(relx=0.02, rely=0.25, relwidth=0.25, relheight=0.50)
  216. self.enter.place(relx=0.30, rely=0.25, relwidth=0.60, relheight=0.50)
  217. self.btn['font'] = btn_font
  218. self.btn['text'] = "Create"
  219. self.btn['bg'] = conf.tk_btn_bg
  220. self.btn['command'] = lambda: self.create_user()
  221. self.btn.place(relx=0.4, rely=0.7, relwidth=0.2, relheight=0.08)
  222. def create_user(self):
  223. phone = self.var.get()
  224. if len(phone) != 11:
  225. self.station.show_msg("UserInfoError", "Please, enter Phone(11)")
  226. event = tk_event.CreateUserEvent(self.station).start(None, None, phone, False)
  227. self.station.push_event(event)
  228. def set_disable(self):
  229. self.btn['state'] = 'disable'
  230. self.enter['state'] = 'disable'
  231. def reset_disable(self):
  232. self.btn['state'] = 'normal'
  233. self.enter['state'] = 'normal'
  234. class CreateGarbageProgram(AdminProgram):
  235. def __init__(self, station, win, color):
  236. super().__init__(station, win, color, "CreateGarbage")
  237. self.enter_frame = tk.Frame(self.frame)
  238. self.title: List[tk.Label] = [tk.Label(self.enter_frame), tk.Label(self.enter_frame)]
  239. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame), tk.Entry(self.enter_frame)]
  240. self.var: List[tk.Variable] = [tk.StringVar(), tk.StringVar()]
  241. self.create_btn: tk.Button = tk.Button(self.frame)
  242. self.file_btn: tk.Button = tk.Button(self.frame)
  243. self.__conf_font()
  244. def __conf_font(self, n: int = 1):
  245. self.title_font_size = int(16 * n)
  246. self.btn_font_size = int(14 * n)
  247. def conf_gui(self, n: int = 1):
  248. self.__conf_font(n)
  249. title_font = make_font(size=self.title_font_size)
  250. btn_font = make_font(size=self.btn_font_size)
  251. self.enter_frame['bg'] = "#b69968"
  252. self.enter_frame['bd'] = 5
  253. self.enter_frame['relief'] = "ridge"
  254. self.enter_frame.place(relx=0.2, rely=0.3, relwidth=0.6, relheight=0.17)
  255. height = 0.1
  256. for lb, text, enter, var in zip(self.title, ["Count:", "Export:"], self.enter, self.var):
  257. lb['font'] = title_font
  258. lb['text'] = text
  259. lb['bg'] = "#b69968"
  260. lb['anchor'] = 'e'
  261. enter['font'] = title_font
  262. enter['textvariable'] = var
  263. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.35)
  264. enter.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.35)
  265. height += 0.43
  266. for btn, text, x, func in zip([self.create_btn, self.file_btn],
  267. ["Create", "ChoosePath"],
  268. [0.2, 0.6],
  269. [lambda: self.create_garbage(), lambda: self.choose_file()]):
  270. btn['font'] = btn_font
  271. btn['text'] = text
  272. btn['bg'] = conf.tk_btn_bg
  273. btn['command'] = func
  274. btn.place(relx=x, rely=0.7, relwidth=0.2, relheight=0.08)
  275. def choose_file(self):
  276. path = askdirectory(title='path to save qr code')
  277. self.var[1].set(path)
  278. def create_garbage(self):
  279. try:
  280. count = int(self.var[0].get())
  281. if count <= 0:
  282. raise ValueError
  283. except (ValueError, TypeError):
  284. self.station.show_msg("TypeError", "Count must be number > 1")
  285. else:
  286. path = self.var[1].get()
  287. if len(path) == 0:
  288. path = None
  289. event = tk_event.CreateGarbageEvent(self.station).start(path, count)
  290. self.station.push_event(event)
  291. def set_disable(self):
  292. self.create_btn['state'] = 'disable'
  293. self.file_btn['state'] = 'disable'
  294. set_tk_disable_from_list(self.enter)
  295. def reset_disable(self):
  296. self.create_btn['state'] = 'normal'
  297. self.file_btn['state'] = 'normal'
  298. set_tk_disable_from_list(self.enter, flat='normal')
  299. class ExportProgramBase(AdminProgram):
  300. def __init__(self, station, win, color, title: str):
  301. super().__init__(station, win, color, title)
  302. self.gid_frame = tk.Frame(self.frame)
  303. self.gid_title: List[tk.Label] = [tk.Label(self.gid_frame), tk.Label(self.gid_frame)]
  304. self.gid_enter: List[tk.Entry] = [tk.Entry(self.gid_frame), tk.Entry(self.gid_frame)]
  305. self.gid_var: List[tk.Variable] = [tk.StringVar(), tk.StringVar()]
  306. self.where_frame = tk.Frame(self.frame)
  307. self.where_title: List[tk.Label] = [tk.Label(self.where_frame), tk.Label(self.where_frame)]
  308. self.where_enter: List[tk.Entry] = [tk.Entry(self.where_frame), tk.Entry(self.where_frame)]
  309. self.where_var: List[tk.Variable] = [tk.StringVar(), tk.StringVar()]
  310. self.create_btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  311. self.file_btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  312. self._conf("", [], [], [])
  313. self.__conf_font()
  314. def _conf(self, bg_color: str, title_id, title_where, title_command):
  315. self.bg_color = bg_color
  316. self.title_id = title_id
  317. self.title_where = title_where
  318. self.title_command = title_command
  319. def __conf_font(self, n: int = 1):
  320. self.title_font_size = int(16 * n)
  321. self.btn_font_size = int(14 * n)
  322. def conf_gui(self, n: int = 1):
  323. self.__conf_font(n)
  324. title_font = make_font(size=self.title_font_size)
  325. btn_font = make_font(size=self.btn_font_size)
  326. self.where_frame['bg'] = self.bg_color
  327. self.where_frame['bd'] = 5
  328. self.where_frame['relief'] = "ridge"
  329. self.where_frame.place(relx=0.2, rely=0.2, relwidth=0.6, relheight=0.17)
  330. self.gid_frame['bg'] = self.bg_color
  331. self.gid_frame['bd'] = 5
  332. self.gid_frame['relief'] = "ridge"
  333. self.gid_frame.place(relx=0.2, rely=0.6, relwidth=0.6, relheight=0.17)
  334. height = 0.1
  335. for lb, text, enter, var, lb_w, text_w, enter_w, var_w in zip(
  336. self.gid_title, self.title_id, self.gid_enter, self.gid_var,
  337. self.where_title, self.title_where, self.where_enter, self.where_var):
  338. lb['font'] = title_font
  339. lb['text'] = text
  340. lb['bg'] = self.bg_color
  341. lb['anchor'] = 'e'
  342. lb_w['font'] = title_font
  343. lb_w['text'] = text_w
  344. lb_w['bg'] = self.bg_color
  345. lb_w['anchor'] = 'e'
  346. enter['textvariable'] = var
  347. enter['font'] = title_font
  348. enter_w['textvariable'] = var_w
  349. enter_w['font'] = title_font
  350. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.35)
  351. enter.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.35)
  352. lb_w.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.35)
  353. enter_w.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.35)
  354. height += 0.43
  355. for btn, text in zip(self.create_btn + self.file_btn, self.title_command):
  356. btn['font'] = btn_font
  357. btn['text'] = text
  358. btn['bg'] = conf.tk_btn_bg
  359. self.create_btn[1]['command'] = self.export_where
  360. self.create_btn[0]['command'] = self.export_id
  361. self.create_btn[1].place(relx=0.2, rely=0.39, relwidth=0.25, relheight=0.08)
  362. self.create_btn[0].place(relx=0.2, rely=0.79, relwidth=0.25, relheight=0.08)
  363. self.file_btn[1]['command'] = self.choose_file_where
  364. self.file_btn[0]['command'] = self.choose_file_id
  365. self.file_btn[1].place(relx=0.6, rely=0.39, relwidth=0.2, relheight=0.08)
  366. self.file_btn[0].place(relx=0.6, rely=0.79, relwidth=0.2, relheight=0.08)
  367. def choose_file_id(self):
  368. path = askdirectory(title='path to save qr code')
  369. self.gid_var[1].set(path)
  370. def choose_file_where(self):
  371. path = askdirectory(title='path to save qr code')
  372. self.where_var[1].set(path)
  373. def export_id(self):
  374. ...
  375. def export_where(self):
  376. ...
  377. def set_disable(self):
  378. set_tk_disable_from_list(self.gid_enter)
  379. set_tk_disable_from_list(self.create_btn)
  380. set_tk_disable_from_list(self.file_btn)
  381. def reset_disable(self):
  382. set_tk_disable_from_list(self.gid_enter, flat='normal')
  383. set_tk_disable_from_list(self.create_btn, flat='normal')
  384. set_tk_disable_from_list(self.file_btn, flat='normal')
  385. class ExportGarbageProgram(ExportProgramBase):
  386. def __init__(self, station, win, color):
  387. super().__init__(station, win, color, "ExportGarbage")
  388. self._conf("#afdfe4", ["GarbageID:", "Export:"], ["Where:", "Export:"],
  389. ["Export By GarbageID", "Export Advanced", "ChoosePath", "ChoosePath"])
  390. def export_id(self):
  391. gid = self.gid_var[0].get()
  392. path = self.gid_var[1].get()
  393. event = tk_event.ExportGarbageByIDEvent(self.station).start(path, gid)
  394. self.station.push_event(event)
  395. def export_where(self):
  396. where = self.where_var[0].get()
  397. path = self.where_var[1].get()
  398. event = tk_event.ExportGarbageAdvancedEvent(self.station).start(path, where)
  399. self.station.push_event(event)
  400. class ExportUserProgram(ExportProgramBase):
  401. def __init__(self, station, win, color):
  402. super().__init__(station, win, color, "ExportUser")
  403. self._conf("#f69c9f", ["UserID:", "Export:"], ["Where:", "Export:"],
  404. ["Export By UserID", "Export Advanced", "ChoosePath", "ChoosePath"])
  405. def export_id(self):
  406. uid = self.gid_var[0].get()
  407. path = self.gid_var[1].get()
  408. event = tk_event.ExportUserByIDEvent(self.station).start(path, uid)
  409. self.station.push_event(event)
  410. def export_where(self):
  411. where = self.where_var[0].get()
  412. path = self.where_var[1].get()
  413. event = tk_event.ExportUserAdvancedEvent(self.station).start(path, where)
  414. self.station.push_event(event)
  415. class CreateUserFromCSVProgram(AdminProgram):
  416. def __init__(self, station, win, color):
  417. super().__init__(station, win, color, "CreateUserFromCSV")
  418. self.auto_frame = tk.Frame(self.frame)
  419. self.auto_title: tk.Label = tk.Label(self.auto_frame)
  420. self.auto_enter: tk.Entry = tk.Entry(self.auto_frame)
  421. self.auto_var: tk.Variable = tk.StringVar()
  422. self.enter_frame = tk.Frame(self.frame)
  423. self.path_title: tk.Label = tk.Label(self.enter_frame)
  424. self.path_enter: tk.Entry = tk.Entry(self.enter_frame)
  425. self.path_var: tk.Variable = tk.StringVar()
  426. self.create_btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  427. self.file_btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  428. self.__conf_font()
  429. def __conf_font(self, n: int = 1):
  430. self.title_font_size = int(16 * n)
  431. self.btn_font_size = int(14 * n)
  432. def conf_gui(self, n: int = 1):
  433. self.__conf_font(n)
  434. title_font = make_font(size=self.title_font_size)
  435. btn_font = make_font(size=self.btn_font_size)
  436. self.enter_frame['bg'] = "#EEE8AA"
  437. self.enter_frame['bd'] = 5
  438. self.enter_frame['relief'] = "ridge"
  439. self.enter_frame.place(relx=0.2, rely=0.2, relwidth=0.6, relheight=0.12)
  440. self.auto_frame['bg'] = "#EEE8AA"
  441. self.auto_frame['bd'] = 5
  442. self.auto_frame['relief'] = "ridge"
  443. self.auto_frame.place(relx=0.2, rely=0.6, relwidth=0.6, relheight=0.12)
  444. self.auto_title['font'] = title_font
  445. self.auto_title['text'] = "Path:"
  446. self.auto_title['bg'] = "#EEE8AA"
  447. self.auto_title['anchor'] = 'e'
  448. self.path_title['font'] = title_font
  449. self.path_title['text'] = "Path:"
  450. self.path_title['bg'] = "#EEE8AA"
  451. self.path_title['anchor'] = 'e'
  452. self.auto_enter['textvariable'] = self.auto_var
  453. self.auto_enter['font'] = title_font
  454. self.path_enter['textvariable'] = self.path_var
  455. self.path_enter['font'] = title_font
  456. self.auto_title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  457. self.auto_enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  458. self.path_title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  459. self.path_enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  460. for btn, text in zip(self.create_btn + self.file_btn,
  461. ["Create User", "Create Auto User", "Choose CSV", "Choose CSV"]):
  462. btn['font'] = btn_font
  463. btn['text'] = text
  464. btn['bg'] = conf.tk_btn_bg
  465. self.create_btn[0]['command'] = self.create
  466. self.create_btn[1]['command'] = self.create_auto
  467. self.create_btn[0].place(relx=0.2, rely=0.34, relwidth=0.25, relheight=0.08)
  468. self.create_btn[1].place(relx=0.2, rely=0.74, relwidth=0.25, relheight=0.08)
  469. self.file_btn[0]['command'] = self.choose_file
  470. self.file_btn[1]['command'] = self.choose_file_auto
  471. self.file_btn[0].place(relx=0.6, rely=0.34, relwidth=0.2, relheight=0.08)
  472. self.file_btn[1].place(relx=0.6, rely=0.74, relwidth=0.2, relheight=0.08)
  473. def choose_file_auto(self):
  474. path = askopenfilename(title='path of csv', filetypes=[("CSV", ".csv")])
  475. self.auto_var.set(path)
  476. def choose_file(self):
  477. path = askopenfilename(title='path of csv', filetypes=[("CSV", ".csv")])
  478. self.path_var.set(path)
  479. def create_auto(self):
  480. path = self.auto_var.get()
  481. event = tk_event.CreateAutoUserFromCSVEvent(self.station).start(path)
  482. self.station.push_event(event)
  483. def create(self):
  484. path = self.path_var.get()
  485. event = tk_event.CreateUserFromCSVEvent(self.station).start(path)
  486. self.station.push_event(event)
  487. def set_disable(self):
  488. self.auto_enter['state'] = 'disable'
  489. self.path_enter['state'] = 'disable'
  490. set_tk_disable_from_list(self.create_btn)
  491. set_tk_disable_from_list(self.file_btn)
  492. def reset_disable(self):
  493. self.auto_enter['state'] = 'normal'
  494. self.path_enter['state'] = 'normal'
  495. set_tk_disable_from_list(self.create_btn, flat='normal')
  496. set_tk_disable_from_list(self.file_btn, flat='normal')
  497. class DeleteUserProgram(AdminProgram):
  498. def __init__(self, station, win, color):
  499. super().__init__(station, win, color, "DeleteUser")
  500. self.uid_frame = tk.Frame(self.frame)
  501. self.uid_title: tk.Label = tk.Label(self.uid_frame)
  502. self.uid_enter: tk.Entry = tk.Entry(self.uid_frame)
  503. self.uid_var: tk.Variable = tk.StringVar()
  504. self.name_frame = tk.Frame(self.frame)
  505. self.name_title: List[tk.Label] = [tk.Label(self.name_frame) for _ in range(2)]
  506. self.name_enter: List[tk.Entry] = [tk.Entry(self.name_frame) for _ in range(2)]
  507. self.name_var: List[tk.Variable] = [tk.StringVar() for _ in range(2)]
  508. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)] # uid-del, name-passwd-del
  509. self.__conf_font()
  510. def __conf_font(self, n: int = 1):
  511. self.title_font_size = int(16 * n)
  512. self.btn_font_size = int(14 * n)
  513. def conf_gui(self, n: int = 1):
  514. self.__conf_font(n)
  515. title_font = make_font(size=self.title_font_size)
  516. btn_font = make_font(size=self.btn_font_size)
  517. self.uid_frame['bg'] = "#FA8072"
  518. self.uid_frame['bd'] = 5
  519. self.uid_frame['relief'] = "ridge"
  520. self.uid_frame.place(relx=0.2, rely=0.20, relwidth=0.6, relheight=0.10)
  521. self.name_frame['bg'] = "#FA8072"
  522. self.name_frame['bd'] = 5
  523. self.name_frame['relief'] = "ridge"
  524. self.name_frame.place(relx=0.2, rely=0.48, relwidth=0.6, relheight=0.25)
  525. height = 0.17
  526. for lb, text, enter, var in zip(self.name_title, ["UserName:", "PassWord:"], self.name_enter, self.name_var):
  527. lb['font'] = title_font
  528. lb['text'] = text
  529. lb['bg'] = "#FA8072"
  530. lb['anchor'] = 'e'
  531. enter['font'] = title_font
  532. enter['textvariable'] = var
  533. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.20)
  534. enter.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.20)
  535. height += 0.45
  536. self.uid_title['font'] = title_font
  537. self.uid_title['text'] = "UserID:"
  538. self.uid_title['bg'] = "#FA8072"
  539. self.uid_title['anchor'] = 'e'
  540. self.uid_enter['font'] = title_font
  541. self.uid_enter['textvariable'] = self.uid_var
  542. self.uid_title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  543. self.uid_enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  544. for btn, text, func in zip(self.btn,
  545. ["Delete By Uid", "Delete By Name"],
  546. [lambda: self.del_by_uid(), lambda: self.del_by_name()]):
  547. btn['font'] = btn_font
  548. btn['text'] = text
  549. btn['bg'] = conf.tk_btn_bg
  550. btn['command'] = func
  551. self.btn[0].place(relx=0.6, rely=0.32, relwidth=0.2, relheight=0.08)
  552. self.btn[1].place(relx=0.6, rely=0.75, relwidth=0.2, relheight=0.08)
  553. def del_by_uid(self):
  554. uid = self.uid_var.get()
  555. if len(uid) != 32:
  556. self.station.show_msg("UserID Error", "Len of UserID must be 32", "Error")
  557. return
  558. event = tk_event.DelUserEvent(self.station).start(uid)
  559. self.station.push_event(event)
  560. def del_by_name(self):
  561. name = self.name_var[0].get()
  562. passwd = self.name_var[1].get()
  563. if len(name) == 0 or len(passwd) == 0:
  564. self.station.show_msg("UserName/Password Error", "You should enter UserName and Password", "Error")
  565. return
  566. uid = create_uid(name, passwd)
  567. event = tk_event.DelUserEvent(self.station).start(uid)
  568. self.station.push_event(event)
  569. def set_disable(self):
  570. set_tk_disable_from_list(self.btn)
  571. set_tk_disable_from_list(self.name_enter)
  572. self.uid_enter['state'] = 'disable'
  573. def reset_disable(self):
  574. set_tk_disable_from_list(self.btn, flat='normal')
  575. set_tk_disable_from_list(self.name_enter, flat='normal')
  576. self.uid_enter['state'] = 'normal'
  577. class DeleteUsersProgram(AdminProgram):
  578. def __init__(self, station, win, color):
  579. super().__init__(station, win, color, "DeleteUsers")
  580. self.enter_frame = tk.Frame(self.frame)
  581. self.title: tk.Label = tk.Label(self.enter_frame)
  582. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  583. self.var: tk.Variable = tk.StringVar()
  584. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)] # del, scan
  585. self.__conf_font()
  586. def __conf_font(self, n: int = 1):
  587. self.title_font_size = int(16 * n)
  588. self.btn_font_size = int(14 * n)
  589. def conf_gui(self, n: int = 1):
  590. self.__conf_font(n)
  591. title_font = make_font(size=self.title_font_size)
  592. btn_font = make_font(size=self.btn_font_size)
  593. self.enter_frame['bg'] = "#48c0a3"
  594. self.enter_frame['bd'] = 5
  595. self.enter_frame['relief'] = "ridge"
  596. self.enter_frame.place(relx=0.2, rely=0.30, relwidth=0.6, relheight=0.10)
  597. self.title['font'] = title_font
  598. self.title['text'] = "Where:"
  599. self.title['anchor'] = 'e'
  600. self.title['bg'] = "#48c0a3"
  601. self.enter['font'] = title_font
  602. self.enter['textvariable'] = self.var
  603. self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  604. self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  605. for btn, text, x, func in zip(self.btn,
  606. ["Delete", "Scan"],
  607. [0.2, 0.6],
  608. [lambda: self.delete_user(), lambda: self.scan_user()]):
  609. btn['font'] = btn_font
  610. btn['text'] = text
  611. btn['bg'] = conf.tk_btn_bg
  612. btn['command'] = func
  613. btn.place(relx=x, rely=0.6, relwidth=0.2, relheight=0.08)
  614. def delete_user(self):
  615. where = self.var.get()
  616. if len(where) == 0:
  617. self.station.show_msg("`Where`Error", "`Where` must be SQL", "Warning")
  618. return
  619. event = tk_event.DelUserFromWhereEvent(self.station).start(where)
  620. self.station.push_event(event)
  621. def scan_user(self):
  622. where = self.var.get()
  623. if len(where) == 0:
  624. self.station.show_msg("`Where`Error", "`Where` must be SQL", "Warning")
  625. return
  626. event = tk_event.DelUserFromWhereScanEvent(self.station).start(where)
  627. self.station.push_event(event)
  628. def set_disable(self):
  629. set_tk_disable_from_list(self.btn)
  630. self.enter['state'] = 'disable'
  631. def reset_disable(self):
  632. set_tk_disable_from_list(self.btn, flat='normal')
  633. self.enter['state'] = 'normal'
  634. class DeleteGarbageProgramBase(AdminProgram):
  635. def __init__(self, station, win, color, title: str):
  636. super().__init__(station, win, color, title)
  637. self.enter_frame = tk.Frame(self.frame)
  638. self.title: tk.Label = tk.Label(self.enter_frame)
  639. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  640. self.var: tk.Variable = tk.StringVar()
  641. self.int_var: tk.Variable = tk.IntVar()
  642. self.int_var.set(0)
  643. self.radio: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(4)]
  644. self.btn: tk.Button = tk.Button(self.frame)
  645. self.__conf_font()
  646. self._conf()
  647. def _conf(self, title: str = "GarbageID:", color: str = "#b69968", support_del_all: bool = True):
  648. self.frame_title = title
  649. self.frame_color = color
  650. self.support_del_all = support_del_all
  651. def __conf_font(self, n: int = 1):
  652. self.title_font_size = int(16 * n)
  653. self.btn_font_size = int(14 * n)
  654. def conf_gui(self, n: int = 1):
  655. self.__conf_font(n)
  656. title_font = make_font(size=self.title_font_size)
  657. btn_font = make_font(size=self.btn_font_size)
  658. self.enter_frame['bg'] = self.frame_color
  659. self.enter_frame['bd'] = 5
  660. self.enter_frame['relief'] = "ridge"
  661. self.enter_frame.place(relx=0.2, rely=0.30, relwidth=0.6, relheight=0.10)
  662. self.title['font'] = title_font
  663. self.title['text'] = self.frame_title
  664. self.title['bg'] = self.frame_color
  665. self.title['anchor'] = 'e'
  666. self.enter['font'] = title_font
  667. self.enter['textvariable'] = self.var
  668. self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  669. self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  670. for i in range(4):
  671. radio = self.radio[i]
  672. radio['font'] = btn_font
  673. radio['text'] = ['From-All', 'From-NotUse', 'From-Waiting', 'From-Used'][i]
  674. radio['bg'] = self.color
  675. radio['value'] = i
  676. radio['variable'] = self.int_var
  677. radio['anchor'] = 'w'
  678. if not self.support_del_all:
  679. self.int_var.set(1)
  680. self.radio[0]['state'] = 'disable'
  681. self.radio[0].place(relx=0.20, rely=0.43, relwidth=0.20, relheight=0.1)
  682. self.radio[1].place(relx=0.60, rely=0.43, relwidth=0.20, relheight=0.1)
  683. self.radio[2].place(relx=0.20, rely=0.55, relwidth=0.20, relheight=0.1)
  684. self.radio[3].place(relx=0.60, rely=0.55, relwidth=0.20, relheight=0.1)
  685. self.btn['font'] = btn_font
  686. self.btn['text'] = 'Delete'
  687. self.btn['bg'] = conf.tk_btn_bg
  688. self.btn['command'] = lambda: self.delete_garbage()
  689. self.btn.place(relx=0.4, rely=0.68, relwidth=0.2, relheight=0.08)
  690. def delete_garbage(self):
  691. ...
  692. def set_disable(self):
  693. self.enter['state'] = 'disable'
  694. self.btn['state'] = 'disable'
  695. def reset_disable(self):
  696. self.enter['state'] = 'normal'
  697. self.btn['state'] = 'normal'
  698. class DeleteGarbageProgram(DeleteGarbageProgramBase):
  699. def __init__(self, station, win, color):
  700. super(DeleteGarbageProgram, self).__init__(station, win, color, "DeleteGarbage")
  701. def delete_garbage(self):
  702. where = self.int_var.get()
  703. assert where in [0, 1, 2, 3]
  704. gid = self.var.get()
  705. if len(gid) == 0:
  706. self.station.show_msg("GarbageID Error", "You should enter the garbage id", "Warning")
  707. return
  708. event = tk_event.DelGarbageEvent(self.station).start(gid, where)
  709. self.station.push_event(event)
  710. class DeleteGarbageMoreProgram(DeleteGarbageProgramBase):
  711. def __init__(self, station, win, color):
  712. super(DeleteGarbageMoreProgram, self).__init__(station, win, color, "DeleteGarbageMore")
  713. self.scan_btn = tk.Button(self.frame)
  714. self._conf("Where:", "#f58f98", False)
  715. def conf_gui(self, n: int = 1):
  716. super(DeleteGarbageMoreProgram, self).conf_gui(n)
  717. self.btn.place_forget()
  718. self.btn.place(relx=0.2, rely=0.68, relwidth=0.2, relheight=0.08)
  719. self.scan_btn['font'] = make_font(size=self.btn_font_size)
  720. self.scan_btn['text'] = 'Scan'
  721. self.scan_btn['bg'] = conf.tk_btn_bg
  722. self.scan_btn['command'] = lambda: self.delete_garbage(True)
  723. self.scan_btn.place(relx=0.6, rely=0.68, relwidth=0.2, relheight=0.08)
  724. def set_disable(self):
  725. super(DeleteGarbageMoreProgram, self).set_disable()
  726. self.scan_btn['state'] = 'disable'
  727. def reset_disable(self):
  728. super(DeleteGarbageMoreProgram, self).reset_disable()
  729. self.scan_btn['state'] = 'normal'
  730. def delete_garbage(self, is_scan: bool = False):
  731. where = self.int_var.get()
  732. assert where in [1, 2, 3]
  733. where_sql = self.var.get()
  734. if len(where_sql) == 0:
  735. self.station.show_msg("`Where`Error", "`Where` must be SQL", "Warning")
  736. return
  737. if is_scan:
  738. event = tk_event.DelGarbageWhereScanEvent(self.station).start(where, where_sql)
  739. else:
  740. event = tk_event.DelGarbageWhereEvent(self.station).start(where, where_sql)
  741. self.station.push_event(event)
  742. class DeleteAllGarbageProgram(AdminProgram):
  743. def __init__(self, station, win, color):
  744. super().__init__(station, win, color, "DeleteAllGarbage")
  745. self.dangerous: tk.Label = tk.Label(self.frame)
  746. self.enter_frame = tk.Frame(self.frame)
  747. self.title: tk.Label = tk.Label(self.enter_frame)
  748. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  749. self.var: tk.Variable = tk.StringVar()
  750. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)] # del, scan
  751. self.__conf_font()
  752. def __conf_font(self, n: int = 1):
  753. self.danger_font_size = int(20 * n)
  754. self.title_font_size = int(16 * n)
  755. self.btn_font_size = int(14 * n)
  756. def conf_gui(self, n: int = 1):
  757. self.__conf_font(n)
  758. danger_font = make_font(size=self.danger_font_size, weight="bold", underline=1)
  759. title_font = make_font(size=self.title_font_size)
  760. btn_font = make_font(size=self.btn_font_size)
  761. danger_btn_font = make_font(size=self.btn_font_size, weight="bold", overstrike=1)
  762. self.dangerous['bg'] = self.color
  763. self.dangerous['font'] = danger_font
  764. self.dangerous['fg'] = "#f20c00"
  765. self.dangerous['text'] = ("Delete all garbage from database?\n"
  766. "Please enter the admin-passwd to\n"
  767. "continue.\n"
  768. "Dangerous operation.\n"
  769. "The database may not be restored.\n"
  770. "SuperHuan is not responsible for\n"
  771. "the consequences.")
  772. self.dangerous.place(relx=0.05, rely=0.03, relwidth=0.9, relheight=0.43)
  773. self.enter_frame['bg'] = "#f20c00"
  774. self.enter_frame['bd'] = 5
  775. self.enter_frame['relief'] = "ridge"
  776. self.enter_frame.place(relx=0.2, rely=0.50, relwidth=0.6, relheight=0.10)
  777. self.title['font'] = title_font
  778. self.title['text'] = "Password:"
  779. self.title['bg'] = "#f20c00"
  780. self.title['anchor'] = 'e'
  781. self.enter['font'] = title_font
  782. self.enter['textvariable'] = self.var
  783. self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  784. self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  785. for btn, text, x in zip(self.btn, ["Delete", "Scan"], [0.2, 0.6]):
  786. btn['text'] = text
  787. btn.place(relx=x, rely=0.68, relwidth=0.2, relheight=0.08)
  788. self.btn[0]['font'] = danger_btn_font
  789. self.btn[0]['bg'] = "#f20c00"
  790. self.btn[0]['command'] = lambda: self.delete_garbage()
  791. self.btn[1]['font'] = btn_font
  792. self.btn[1]['bg'] = conf.tk_btn_bg
  793. self.btn[1]['command'] = lambda: self.scan_garbage()
  794. def scan_garbage(self):
  795. event = tk_event.DelAllGarbageScanEvent(self.station) # 不需要start
  796. self.station.push_event(event)
  797. def delete_garbage(self):
  798. passwd = self.var.get()
  799. if len(passwd) == 0:
  800. self.station.show_msg("PassWordError", "Password error", "Warning")
  801. user = find_user_by_name('admin', passwd, self.station.get_db())
  802. if user is None or not user.is_manager():
  803. self.station.show_msg("PassWordError", "Password error", "Warning")
  804. return
  805. event = tk_event.DelAllGarbageEvent(self.station) # 不需要start
  806. self.station.push_event(event)
  807. def set_disable(self):
  808. set_tk_disable_from_list(self.btn)
  809. self.enter['state'] = 'disable'
  810. def reset_disable(self):
  811. set_tk_disable_from_list(self.btn, flat='normal')
  812. self.enter['state'] = 'normal'
  813. class SearchBaseProgram(AdminProgram, metaclass=abc.ABCMeta):
  814. def __init__(self, station, win, color, title: str):
  815. super().__init__(station, win, color, title)
  816. self.view_frame = tk.Frame(self.frame)
  817. self.view = ttk.Treeview(self.view_frame)
  818. self.y_scroll = tk.Scrollbar(self.view_frame)
  819. self.x_scroll = tk.Scrollbar(self.view_frame)
  820. def conf_view_gui(self, columns: list, relx, rely, relwidth, relheight,
  821. x_scroll=0.05, y_scroll=0.02, color: str = "#FA8072"):
  822. self.view_frame['bg'] = color
  823. self.view_frame['bd'] = 2
  824. self.view_frame['relief'] = "ridge"
  825. self.view_frame.place(relx=relx, rely=rely, relwidth=relwidth, relheight=relheight)
  826. self.view['columns'] = columns
  827. self.view['show'] = 'headings'
  828. self.view['selectmode'] = 'none'
  829. for i in columns:
  830. self.view.column(i, anchor="c")
  831. self.view.heading(i, text=i)
  832. self.y_scroll['orient'] = 'vertical'
  833. self.y_scroll['command'] = self.view.yview
  834. self.view['yscrollcommand'] = self.y_scroll.set
  835. self.x_scroll['orient'] = 'horizontal'
  836. self.x_scroll['command'] = self.view.xview
  837. self.view['xscrollcommand'] = self.x_scroll.set
  838. self.view.place(relx=0.0, rely=0.0, relwidth=1 - y_scroll, relheight=1 - x_scroll)
  839. self.y_scroll.place(relx=0.98, rely=0.0, relwidth=y_scroll, relheight=1.0)
  840. self.x_scroll.place(relx=0.0, rely=1 - x_scroll, relwidth=1 - y_scroll, relheight=x_scroll)
  841. class SearchUserProgram(SearchBaseProgram):
  842. def __init__(self, station, win, color):
  843. super().__init__(station, win, color, "SearchUser")
  844. self.enter_frame = tk.Frame(self.frame)
  845. self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(3)]
  846. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame) for _ in range(3)]
  847. self.var: List[tk.Variable] = [tk.StringVar() for _ in range(3)]
  848. self.check: List[Tuple[tk.Checkbutton, tk.Variable]] = [(tk.Checkbutton(self.enter_frame), tk.IntVar())
  849. for _ in range(3)]
  850. self.btn: tk.Button = tk.Button(self.frame)
  851. self._columns = ["UserID", "Name", "Phone", "Score", "Reputation", "IsManager"]
  852. self.__conf_font()
  853. def __conf_font(self, n: int = 1):
  854. self.title_font_size = int(16 * n)
  855. self.btn_font_size = int(14 * n)
  856. def conf_gui(self, n: int = 1):
  857. self.__conf_font(n)
  858. title_font = make_font(size=self.title_font_size)
  859. btn_font = make_font(size=self.btn_font_size)
  860. self.enter_frame['bg'] = "#FA8072"
  861. self.enter_frame['bd'] = 5
  862. self.enter_frame['relief'] = "ridge"
  863. self.enter_frame.place(relx=0.2, rely=0.0, relwidth=0.6, relheight=0.30)
  864. height = 0.1
  865. for lb, text, enter, var, check in zip(self.title,
  866. ["UserID:", "UserName:", "Phone:"],
  867. self.enter, self.var, self.check):
  868. lb['font'] = title_font
  869. lb['text'] = text
  870. lb['bg'] = "#FA8072"
  871. lb['anchor'] = 'e'
  872. enter['font'] = title_font
  873. enter['textvariable'] = var
  874. check[0]['font'] = title_font
  875. check[0]['text'] = ''
  876. check[0]['bg'] = "#FA8072"
  877. check[0]['variable'] = check[1]
  878. check[1].set(1)
  879. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.17)
  880. enter.place(relx=0.35, rely=height, relwidth=0.55, relheight=0.17)
  881. check[0].place(relx=0.92, rely=height, relwidth=0.04, relheight=0.17)
  882. height += 0.30
  883. self.btn['font'] = btn_font
  884. self.btn['text'] = "Search"
  885. self.btn['bg'] = conf.tk_btn_bg
  886. self.btn['command'] = self.search_user
  887. self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
  888. self.conf_view_gui(self._columns, relx=0.05, rely=0.32, relwidth=0.9, relheight=0.55)
  889. def search_user(self):
  890. use_uid = self.check[0][1].get()
  891. use_name = self.check[1][1].get()
  892. use_phone = self.check[2][1].get()
  893. uid = None
  894. name = None
  895. phone = None
  896. if use_uid:
  897. uid = self.var[0].get()
  898. if len(uid) == 0:
  899. uid = None
  900. if use_name:
  901. name = self.var[1].get()
  902. if len(name) == 0:
  903. name = None
  904. if use_phone:
  905. phone = self.var[2].get()
  906. if len(phone) == 0:
  907. phone = None
  908. event = tk_event.SearchUserEvent(self.station).start(self._columns, uid, name, phone, self)
  909. self.station.push_event(event)
  910. def set_disable(self):
  911. self.btn['state'] = 'disable'
  912. set_tk_disable_from_list(self.enter)
  913. def reset_disable(self):
  914. self.btn['state'] = 'normal'
  915. set_tk_disable_from_list(self.enter, flat='normal')
  916. class SearchAdvancedProgramBase(SearchBaseProgram, metaclass=abc.ABCMeta):
  917. def __init__(self, station, win, color, title: str):
  918. super().__init__(station, win, color, title)
  919. self.enter_frame = tk.Frame(self.frame)
  920. self.title: tk.Label = tk.Label(self.enter_frame)
  921. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  922. self.var: tk.Variable = tk.StringVar()
  923. self.btn: tk.Button = tk.Button(self.frame)
  924. self._conf([], "#FA8072") # 默认颜色
  925. self.__conf_font()
  926. def _conf(self, columns: list, bg_color):
  927. self.bg_color = bg_color
  928. self._columns = columns
  929. return self
  930. def __conf_font(self, n: int = 1):
  931. self.title_font_size = int(16 * n)
  932. self.btn_font_size = int(14 * n)
  933. def conf_gui(self, n: int = 1):
  934. self.__conf_font(n)
  935. title_font = make_font(size=self.title_font_size)
  936. btn_font = make_font(size=self.btn_font_size)
  937. self.enter_frame['bg'] = self.bg_color
  938. self.enter_frame['bd'] = 5
  939. self.enter_frame['relief'] = "ridge"
  940. self.enter_frame.place(relx=0.2, rely=0.00, relwidth=0.6, relheight=0.10)
  941. self.title['font'] = title_font
  942. self.title['bg'] = self.bg_color
  943. self.title['text'] = "Where:"
  944. self.title['anchor'] = 'e'
  945. self.enter['font'] = title_font
  946. self.enter['textvariable'] = self.var
  947. self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  948. self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  949. self.btn['text'] = "Search"
  950. self.btn['font'] = btn_font
  951. self.btn['bg'] = conf.tk_btn_bg
  952. self.btn['command'] = self.search
  953. self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
  954. self.conf_view_gui(self._columns, relx=0.05, rely=0.12, relwidth=0.9, relheight=0.76)
  955. def search(self):
  956. ...
  957. def set_disable(self):
  958. self.btn['state'] = 'disable'
  959. self.enter['state'] = 'disable'
  960. def reset_disable(self):
  961. self.btn['state'] = 'normal'
  962. self.enter['state'] = 'normal'
  963. class SearchUserAdvancedProgram(SearchAdvancedProgramBase):
  964. def __init__(self, station, win, color):
  965. super(SearchUserAdvancedProgram, self).__init__(station, win, color, "SearchUserAdvanced")
  966. columns = ["UserID", "Name", "Phone", "Score", "Reputation", "IsManager"]
  967. self._conf(columns, '#48c0a3')
  968. def search(self):
  969. where = self.var.get()
  970. event = tk_event.SearchUserAdvancedEvent(self.station).start(self._columns, where, self)
  971. self.station.push_event(event)
  972. class SearchGarbageProgram(SearchBaseProgram):
  973. def __init__(self, station, win, color):
  974. super().__init__(station, win, color, "SearchGarbage")
  975. self.enter_frame = tk.Frame(self.frame)
  976. self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(8)]
  977. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame) for _ in range(8)]
  978. self.var: List[tk.Variable] = [tk.StringVar() for _ in range(8)]
  979. self.check: List[Tuple[tk.Checkbutton, tk.Variable]] = [(tk.Checkbutton(self.enter_frame), tk.IntVar())
  980. for _ in range(8)]
  981. self._columns = ["GarbageID", "UserID", "CheckerID", "CreateTime", "UseTime", "Location", "GarbageType",
  982. "CheckResult"]
  983. self.btn: tk.Button = tk.Button(self.frame)
  984. self.__conf_font()
  985. def __conf_font(self, n: int = 1):
  986. self.title_font_size = int(16 * n)
  987. self.btn_font_size = int(14 * n)
  988. def conf_gui(self, n: int = 1):
  989. self.__conf_font(n)
  990. title_font = make_font(size=self.title_font_size)
  991. btn_font = make_font(size=self.btn_font_size)
  992. self.enter_frame['bg'] = "#7bbfea"
  993. self.enter_frame['bd'] = 5
  994. self.enter_frame['relief'] = "ridge"
  995. self.enter_frame.place(relx=0.2, rely=0.0, relwidth=0.6, relheight=0.47)
  996. height = 0.02
  997. for lb, text, enter, var, check in zip(self.title,
  998. ["GarbageID:", "UserID:", "CheckerID:", "CreateTime:", "UseTime:",
  999. "Location:", "GarbageType:", "CheckResult:"],
  1000. self.enter, self.var, self.check):
  1001. lb['font'] = title_font
  1002. lb['text'] = text
  1003. lb['bg'] = "#7bbfea"
  1004. lb['anchor'] = 'e'
  1005. enter['font'] = title_font
  1006. enter['textvariable'] = var
  1007. check[0]['font'] = title_font
  1008. check[0]['bg'] = "#7bbfea"
  1009. check[0]['text'] = ''
  1010. check[0]['variable'] = check[1]
  1011. check[1].set(1)
  1012. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.10)
  1013. enter.place(relx=0.35, rely=height, relwidth=0.55, relheight=0.10)
  1014. check[0].place(relx=0.92, rely=height, relwidth=0.04, relheight=0.10)
  1015. height += 0.121
  1016. self.btn['font'] = btn_font
  1017. self.btn['bg'] = conf.tk_btn_bg
  1018. self.btn['text'] = "Search"
  1019. self.btn['command'] = self.search_user
  1020. self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
  1021. self.conf_view_gui(self._columns, relx=0.05, rely=0.49, relwidth=0.9, relheight=0.38, x_scroll=0.07)
  1022. def search_user(self):
  1023. keys = ["gid", "uid", "cuid", "create_time", "use_time", "loc", "type_", "check"]
  1024. key_values = {}
  1025. for i, key in enumerate(keys):
  1026. ck = self.check[i][1].get()
  1027. if ck:
  1028. res = self.enter[i].get()
  1029. if len(res) > 0:
  1030. key_values[key] = res
  1031. continue
  1032. key_values[key] = None
  1033. event = tk_event.SearchGarbageEvent(self.station).start(self._columns, key_values, self)
  1034. self.station.push_event(event)
  1035. def set_disable(self):
  1036. self.btn['state'] = 'disable'
  1037. set_tk_disable_from_list(self.enter)
  1038. def reset_disable(self):
  1039. self.btn['state'] = 'normal'
  1040. set_tk_disable_from_list(self.enter, flat='normal')
  1041. class SearchGarbageAdvancedProgram(SearchAdvancedProgramBase):
  1042. def __init__(self, station, win, color):
  1043. super(SearchGarbageAdvancedProgram, self).__init__(station, win, color, "SearchGarbageAdvanced")
  1044. columns = ["GarbageID", "UserID", "CheckerID", "CreateTime", "UseTime", "Location", "GarbageType",
  1045. "CheckResult"]
  1046. self._conf(columns, '#d1923f')
  1047. def search(self):
  1048. where = self.var.get()
  1049. event = tk_event.SearchGarbageAdvancedEvent(self.station).start(self._columns, where, self)
  1050. self.station.push_event(event)
  1051. class SearchAdvancedProgram(SearchAdvancedProgramBase):
  1052. def __init__(self, station, win, color):
  1053. super(SearchAdvancedProgram, self).__init__(station, win, color, "SearchAdvanced")
  1054. columns = ["GarbageID", "UserID", "UserName", "UserPhone", "UserScore",
  1055. "UserReputation", "CheckerID", "CheckerName", "CheckerPhone",
  1056. "CreateTime", "UseTime", "Location", "GarbageType", "CheckResult"]
  1057. self._conf(columns, '#426ab3')
  1058. def search(self):
  1059. where = self.var.get()
  1060. event = tk_event.SearchAdvancedEvent(self.station).start(self._columns, where, self)
  1061. self.station.push_event(event)
  1062. class UpdateUserProgramBase(AdminProgram):
  1063. def __init__(self, station, win, color, title: str):
  1064. super().__init__(station, win, color, title)
  1065. self.enter_frame = tk.Frame(self.frame)
  1066. self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(2)]
  1067. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame) for _ in range(2)]
  1068. self.var: List[tk.Variable] = [tk.StringVar() for _ in range(2)]
  1069. self.where_frame = tk.Frame(self.frame)
  1070. self.where_title: List[tk.Label] = [tk.Label(self.where_frame) for _ in range(2)]
  1071. self.where_enter: List[tk.Entry] = [tk.Entry(self.where_frame) for _ in range(2)]
  1072. self.where_var: List[tk.Variable] = [tk.StringVar() for _ in range(2)]
  1073. self.btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  1074. self._conf(["", ""], "#FA8072")
  1075. self.__conf_font()
  1076. def _conf(self, title: List[str], bg_color: str):
  1077. self.bg_color = bg_color
  1078. self.bg_color_where = bg_color
  1079. self.enter_title = title
  1080. def __conf_font(self, n: int = 1):
  1081. self.title_font_size = int(16 * n)
  1082. self.btn_font_size = int(14 * n)
  1083. def conf_gui(self, n: int = 1):
  1084. self.__conf_font(n)
  1085. title_font = make_font(size=self.title_font_size)
  1086. btn_font = make_font(size=self.btn_font_size)
  1087. self.where_frame['bg'] = self.bg_color_where
  1088. self.where_frame['bd'] = 5
  1089. self.where_frame['relief'] = "ridge"
  1090. self.where_frame.place(relx=0.2, rely=0.20, relwidth=0.6, relheight=0.17)
  1091. self.enter_frame['bg'] = self.bg_color
  1092. self.enter_frame['bd'] = 5
  1093. self.enter_frame['relief'] = "ridge"
  1094. self.enter_frame.place(relx=0.2, rely=0.58, relwidth=0.6, relheight=0.17)
  1095. height = 0.1
  1096. for lb, text, enter, var, lb_w, text_w, enter_w, var_w in (
  1097. zip(self.title, self.enter_title, self.enter, self.var,
  1098. self.where_title, ["Where:", self.enter_title[1]], self.where_enter, self.where_var)):
  1099. lb['font'] = title_font
  1100. lb['text'] = text
  1101. lb['bg'] = self.bg_color
  1102. lb['anchor'] = 'e'
  1103. lb_w['font'] = title_font
  1104. lb_w['text'] = text_w
  1105. lb_w['bg'] = self.bg_color_where
  1106. lb_w['anchor'] = 'e'
  1107. enter['font'] = title_font
  1108. enter['textvariable'] = var
  1109. enter_w['font'] = title_font
  1110. enter_w['textvariable'] = var_w
  1111. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.35)
  1112. enter.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.35)
  1113. lb_w.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.35)
  1114. enter_w.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.35)
  1115. height += 0.43
  1116. for btn, text, func in zip(self.btn,
  1117. ["Update Advanced", "Update By UserID"],
  1118. [self.update_by_where, self.update_by_uid]):
  1119. btn['font'] = btn_font
  1120. btn['text'] = text
  1121. btn['bg'] = conf.tk_btn_bg
  1122. btn['command'] = func
  1123. self.btn[0].place(relx=0.55, rely=0.40, relwidth=0.25, relheight=0.08)
  1124. self.btn[1].place(relx=0.55, rely=0.78, relwidth=0.25, relheight=0.08)
  1125. def update_by_uid(self):
  1126. ...
  1127. def update_by_where(self):
  1128. ...
  1129. def set_disable(self):
  1130. set_tk_disable_from_list(self.btn)
  1131. set_tk_disable_from_list(self.enter)
  1132. def reset_disable(self):
  1133. set_tk_disable_from_list(self.btn, flat='normal')
  1134. set_tk_disable_from_list(self.enter, flat='normal')
  1135. class UpdateUserScoreBase(UpdateUserProgramBase):
  1136. def __init__(self, station, win, color):
  1137. super(UpdateUserScoreBase, self).__init__(station, win, color, "UpdateScore")
  1138. self._conf(["UserID:", "Score:"], "#afdfe4")
  1139. def update_by_uid(self):
  1140. uid = self.enter[0].get()
  1141. score = int(self.enter[1].get())
  1142. event = tk_event.UpdateUserScoreEvent(self.station).start(score, f"UserID='{uid}'")
  1143. self.station.push_event(event)
  1144. def update_by_where(self):
  1145. where = self.where_enter[0].get()
  1146. score = int(self.where_enter[1].get())
  1147. event = tk_event.UpdateUserScoreEvent(self.station).start(score, where)
  1148. self.station.push_event(event)
  1149. class UpdateUserReputationBase(UpdateUserProgramBase):
  1150. def __init__(self, station, win, color):
  1151. super(UpdateUserReputationBase, self).__init__(station, win, color, "UpdateReputation")
  1152. self._conf(["UserID:", "Reputation:"], "#f8aba6")
  1153. def update_by_uid(self):
  1154. uid = self.enter[0].get()
  1155. reputation = int(self.enter[1].get())
  1156. event = tk_event.UpdateUserReputationEvent(self.station).start(reputation, f"UserID='{uid}'")
  1157. self.station.push_event(event)
  1158. def update_by_where(self):
  1159. where = self.where_enter[0].get()
  1160. reputation = int(self.where_enter[1].get())
  1161. event = tk_event.UpdateUserReputationEvent(self.station).start(reputation, where)
  1162. self.station.push_event(event)
  1163. class UpdateGarbageTypeProgram(AdminProgram):
  1164. def __init__(self, station, win, color):
  1165. super().__init__(station, win, color, "UpdateGarbageType")
  1166. self.enter_frame = tk.Frame(self.frame)
  1167. self.title: tk.Label = tk.Label(self.enter_frame)
  1168. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  1169. self.type: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(4)]
  1170. self.var: List[tk.Variable] = [tk.StringVar, tk.IntVar()]
  1171. self.where_frame = tk.Frame(self.frame)
  1172. self.where_title: tk.Label = tk.Label(self.where_frame)
  1173. self.where_enter: tk.Entry = tk.Entry(self.where_frame)
  1174. self.where_type: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(4)]
  1175. self.where_var: List[tk.Variable] = [tk.StringVar, tk.IntVar()]
  1176. self.btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  1177. self.__conf_font()
  1178. def __conf_font(self, n: int = 1):
  1179. self.title_font_size = int(16 * n)
  1180. self.btn_font_size = int(14 * n)
  1181. def conf_gui(self, n: int = 1):
  1182. self.__conf_font(n)
  1183. title_font = make_font(size=self.title_font_size)
  1184. btn_font = make_font(size=self.btn_font_size)
  1185. self.where_frame['bg'] = "#fdb933"
  1186. self.where_frame['bd'] = 5
  1187. self.where_frame['relief'] = "ridge"
  1188. self.where_frame.place(relx=0.2, rely=0.20, relwidth=0.6, relheight=0.10)
  1189. self.enter_frame['bg'] = "#fdb933"
  1190. self.enter_frame['bd'] = 5
  1191. self.enter_frame['relief'] = "ridge"
  1192. self.enter_frame.place(relx=0.2, rely=0.60, relwidth=0.6, relheight=0.10)
  1193. for lb, enter, radios, var, y, text in zip([self.title, self.where_title],
  1194. [self.enter, self.where_enter],
  1195. [self.type, self.where_type],
  1196. [self.var, self.where_var],
  1197. [0.32, 0.72],
  1198. ["GarbageID:", "Where:"]):
  1199. lb['font'] = title_font
  1200. lb['text'] = text
  1201. lb['bg'] = "#fdb933"
  1202. lb['anchor'] = 'e'
  1203. enter['font'] = title_font
  1204. enter['textvariable'] = var[0]
  1205. for i, radio in enumerate(radios):
  1206. radio['font'] = btn_font
  1207. radio['bg'] = self.color
  1208. radio['text'] = GarbageType.GarbageTypeStrList[i + 1]
  1209. radio['value'] = i + 1
  1210. radio['variable'] = var[1]
  1211. radio['anchor'] = 'w'
  1212. var[1].set(1)
  1213. radios[0].place(relx=0.20, rely=y + 0.00, relwidth=0.20, relheight=0.04)
  1214. radios[1].place(relx=0.60, rely=y + 0.00, relwidth=0.20, relheight=0.04)
  1215. radios[2].place(relx=0.20, rely=y + 0.05, relwidth=0.20, relheight=0.04)
  1216. radios[3].place(relx=0.60, rely=y + 0.05, relwidth=0.20, relheight=0.04)
  1217. lb.place(relx=0.02, rely=0.2, relwidth=0.25, relheight=0.48)
  1218. enter.place(relx=0.30, rely=0.2, relwidth=0.60, relheight=0.48)
  1219. for btn, text, func in zip(self.btn,
  1220. ["Update Advanced", "Update By GarbageID"],
  1221. [self.update_by_where, self.update_by_gid]):
  1222. btn['font'] = btn_font
  1223. btn['text'] = text
  1224. btn['bg'] = conf.tk_btn_bg
  1225. btn['command'] = func
  1226. self.btn[0].place(relx=0.55, rely=0.43, relwidth=0.25, relheight=0.08)
  1227. self.btn[1].place(relx=0.55, rely=0.83, relwidth=0.25, relheight=0.08)
  1228. def update_by_gid(self):
  1229. gid = self.enter.get()
  1230. type_ = self.var[1].get()
  1231. event = tk_event.UpdateGarbageTypeEvent(self.station).start(type_, f"GarbageID={gid}")
  1232. self.station.push_event(event)
  1233. def update_by_where(self):
  1234. where = self.where_enter.get()
  1235. type_ = self.where_var[1].get()
  1236. event = tk_event.UpdateGarbageTypeEvent(self.station).start(type_, where)
  1237. self.station.push_event(event)
  1238. def set_disable(self):
  1239. set_tk_disable_from_list(self.btn)
  1240. self.enter['state'] = 'disable'
  1241. self.where_enter['state'] = 'normal'
  1242. def reset_disable(self):
  1243. set_tk_disable_from_list(self.btn, flat='normal')
  1244. self.enter['state'] = 'normal'
  1245. self.where_enter['state'] = 'normal'
  1246. class UpdateGarbageCheckResultProgram(AdminProgram):
  1247. def __init__(self, station, win, color):
  1248. super().__init__(station, win, color, "UpdateGarbageCheckResult")
  1249. self.enter_frame = tk.Frame(self.frame)
  1250. self.title: tk.Label = tk.Label(self.enter_frame)
  1251. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  1252. self.type: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(2)]
  1253. self.var: List[tk.Variable] = [tk.StringVar, tk.IntVar()]
  1254. self.where_frame = tk.Frame(self.frame)
  1255. self.where_title: tk.Label = tk.Label(self.where_frame)
  1256. self.where_enter: tk.Entry = tk.Entry(self.where_frame)
  1257. self.where_type: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(2)]
  1258. self.where_var: List[tk.Variable] = [tk.StringVar, tk.IntVar()]
  1259. self.btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  1260. self.__conf_font()
  1261. def __conf_font(self, n: int = 1):
  1262. self.title_font_size = int(16 * n)
  1263. self.btn_font_size = int(14 * n)
  1264. def conf_gui(self, n: int = 1):
  1265. self.__conf_font(n)
  1266. title_font = make_font(size=self.title_font_size)
  1267. btn_font = make_font(size=self.btn_font_size)
  1268. self.where_frame['bg'] = "#abc88b"
  1269. self.where_frame['bd'] = 5
  1270. self.where_frame['relief'] = "ridge"
  1271. self.where_frame.place(relx=0.2, rely=0.20, relwidth=0.6, relheight=0.10)
  1272. self.enter_frame['bg'] = "#abc88b"
  1273. self.enter_frame['bd'] = 5
  1274. self.enter_frame['relief'] = "ridge"
  1275. self.enter_frame.place(relx=0.2, rely=0.60, relwidth=0.6, relheight=0.10)
  1276. for lb, enter, radios, var, y, text in zip([self.title, self.where_title],
  1277. [self.enter, self.where_enter],
  1278. [self.type, self.where_type],
  1279. [self.var, self.where_var],
  1280. [0.32, 0.72],
  1281. ["GarbageID:", "Where:"]):
  1282. lb['font'] = title_font
  1283. lb['text'] = text
  1284. lb['bg'] = "#abc88b"
  1285. lb['anchor'] = 'e'
  1286. enter['font'] = title_font
  1287. enter['textvariable'] = var[0]
  1288. for i, radio in enumerate(radios):
  1289. radio['font'] = btn_font
  1290. radio['bg'] = self.color
  1291. radio['text'] = ["Fail", "Pass"][i]
  1292. radio['value'] = i
  1293. radio['variable'] = var[1]
  1294. radio['anchor'] = 'w'
  1295. var[1].set(1)
  1296. radios[0].place(relx=0.20, rely=y + 0.00, relwidth=0.20, relheight=0.04)
  1297. radios[1].place(relx=0.60, rely=y + 0.00, relwidth=0.20, relheight=0.04)
  1298. lb.place(relx=0.02, rely=0.2, relwidth=0.25, relheight=0.48)
  1299. enter.place(relx=0.30, rely=0.2, relwidth=0.60, relheight=0.48)
  1300. for btn, text, func in zip(self.btn,
  1301. ["Update Advanced", "Update By GarbageID"],
  1302. [self.update_by_where, self.update_by_gid]):
  1303. btn['font'] = btn_font
  1304. btn['bg'] = conf.tk_btn_bg
  1305. btn['text'] = text
  1306. btn['command'] = func
  1307. self.btn[0].place(relx=0.55, rely=0.38, relwidth=0.25, relheight=0.08)
  1308. self.btn[1].place(relx=0.55, rely=0.78, relwidth=0.25, relheight=0.08)
  1309. def update_by_gid(self):
  1310. gid = self.enter.get()
  1311. check = (self.var[1].get() == 1)
  1312. event = tk_event.UpdateGarbageCheckEvent(self.station).start(check, f"GarbageID={gid}")
  1313. self.station.push_event(event)
  1314. def update_by_where(self):
  1315. where = self.where_enter.get()
  1316. check = (self.where_var[1].get() == 1)
  1317. event = tk_event.UpdateGarbageCheckEvent(self.station).start(check, where)
  1318. self.station.push_event(event)
  1319. def set_disable(self):
  1320. set_tk_disable_from_list(self.btn)
  1321. self.enter['state'] = 'disable'
  1322. self.where_enter['state'] = 'normal'
  1323. def reset_disable(self):
  1324. set_tk_disable_from_list(self.btn, flat='normal')
  1325. self.enter['state'] = 'normal'
  1326. self.where_enter['state'] = 'normal'
  1327. all_program = [WelcomeProgram, CreateNormalUserProgram, CreateManagerUserProgram, CreateAutoNormalUserProgram,
  1328. CreateGarbageProgram, DeleteUserProgram, DeleteUsersProgram, DeleteGarbageProgram,
  1329. DeleteGarbageMoreProgram, DeleteAllGarbageProgram, SearchUserProgram, SearchUserAdvancedProgram,
  1330. SearchGarbageProgram, SearchGarbageAdvancedProgram, SearchAdvancedProgram, UpdateUserScoreBase,
  1331. UpdateUserReputationBase, UpdateGarbageTypeProgram, UpdateGarbageCheckResultProgram,
  1332. ExportGarbageProgram, ExportUserProgram, CreateUserFromCSVProgram, AboutProgram]