admin_program.py 53 KB

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