admin_program.py 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671
  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.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.12)
  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.25, relwidth=0.25, relheight=0.50)
  173. self.enter.place(relx=0.30, rely=0.25, relwidth=0.60, relheight=0.50)
  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 ExportProgramBase(AdminProgram):
  257. def __init__(self, station, win, color, title: str):
  258. super().__init__(station, win, color, title)
  259. self.gid_frame = tk.Frame(self.frame)
  260. self.gid_title: List[tk.Label] = [tk.Label(self.gid_frame), tk.Label(self.gid_frame)]
  261. self.gid_enter: List[tk.Entry] = [tk.Entry(self.gid_frame), tk.Entry(self.gid_frame)]
  262. self.gid_var: List[tk.Variable] = [tk.StringVar(), tk.StringVar()]
  263. self.where_frame = tk.Frame(self.frame)
  264. self.where_title: List[tk.Label] = [tk.Label(self.where_frame), tk.Label(self.where_frame)]
  265. self.where_enter: List[tk.Entry] = [tk.Entry(self.where_frame), tk.Entry(self.where_frame)]
  266. self.where_var: List[tk.Variable] = [tk.StringVar(), tk.StringVar()]
  267. self.create_btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  268. self.file_btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  269. self._conf("", [], [], [])
  270. self.__conf_font()
  271. def _conf(self, bg_color: str, title_id, title_where, title_command):
  272. self.bg_color = bg_color
  273. self.title_id = title_id
  274. self.title_where = title_where
  275. self.title_command = title_command
  276. def __conf_font(self, n: int = 1):
  277. self.title_font_size = int(16 * n)
  278. self.btn_font_size = int(14 * n)
  279. def conf_gui(self, n: int = 1):
  280. self.__conf_font(n)
  281. title_font = make_font(size=self.title_font_size)
  282. btn_font = make_font(size=self.btn_font_size)
  283. self.where_frame['bg'] = self.bg_color
  284. self.where_frame['bd'] = 5
  285. self.where_frame['relief'] = "ridge"
  286. self.where_frame.place(relx=0.2, rely=0.2, relwidth=0.6, relheight=0.17)
  287. self.gid_frame['bg'] = self.bg_color
  288. self.gid_frame['bd'] = 5
  289. self.gid_frame['relief'] = "ridge"
  290. self.gid_frame.place(relx=0.2, rely=0.6, relwidth=0.6, relheight=0.17)
  291. height = 0.1
  292. for lb, text, enter, var, lb_w, text_w, enter_w, var_w in zip(
  293. self.gid_title, self.title_id, self.gid_enter, self.gid_var,
  294. self.where_title, self.title_where, self.where_enter, self.where_var):
  295. lb['font'] = title_font
  296. lb['text'] = text
  297. lb['bg'] = self.bg_color
  298. lb['anchor'] = 'e'
  299. lb_w['font'] = title_font
  300. lb_w['text'] = text_w
  301. lb_w['bg'] = self.bg_color
  302. lb_w['anchor'] = 'e'
  303. enter['textvariable'] = var
  304. enter['font'] = title_font
  305. enter_w['textvariable'] = var_w
  306. enter_w['font'] = title_font
  307. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.35)
  308. enter.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.35)
  309. lb_w.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.35)
  310. enter_w.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.35)
  311. height += 0.43
  312. for btn, text in zip(self.create_btn + self.file_btn, self.title_command):
  313. btn['font'] = btn_font
  314. btn['text'] = text
  315. btn['bg'] = conf.tk_btn_bg
  316. self.create_btn[1]['command'] = self.export_where
  317. self.create_btn[0]['command'] = self.export_id
  318. self.create_btn[1].place(relx=0.2, rely=0.39, relwidth=0.25, relheight=0.08)
  319. self.create_btn[0].place(relx=0.2, rely=0.79, relwidth=0.25, relheight=0.08)
  320. self.file_btn[1]['command'] = self.choose_file_where
  321. self.file_btn[0]['command'] = self.choose_file_id
  322. self.file_btn[1].place(relx=0.6, rely=0.39, relwidth=0.2, relheight=0.08)
  323. self.file_btn[0].place(relx=0.6, rely=0.79, relwidth=0.2, relheight=0.08)
  324. def choose_file_id(self):
  325. path = askdirectory(title='path to save qr code')
  326. self.gid_var[1].set(path)
  327. def choose_file_where(self):
  328. path = askdirectory(title='path to save qr code')
  329. self.where_var[1].set(path)
  330. def export_id(self):
  331. ...
  332. def export_where(self):
  333. ...
  334. def set_disable(self):
  335. set_tk_disable_from_list(self.gid_enter)
  336. set_tk_disable_from_list(self.create_btn)
  337. set_tk_disable_from_list(self.file_btn)
  338. def reset_disable(self):
  339. set_tk_disable_from_list(self.gid_enter, flat='normal')
  340. set_tk_disable_from_list(self.create_btn, flat='normal')
  341. set_tk_disable_from_list(self.file_btn, flat='normal')
  342. class ExportGarbageProgram(ExportProgramBase):
  343. def __init__(self, station, win, color):
  344. super().__init__(station, win, color, "ExportGarbage")
  345. self._conf("#afdfe4", ["GarbageID:", "Export:"], ["Where:", "Export:"],
  346. ["Export By GarbageID", "Export Advanced", "ChoosePath", "ChoosePath"])
  347. def export_id(self):
  348. gid = self.gid_var[0].get()
  349. path = self.gid_var[1].get()
  350. event = tk_event.ExportGarbageByIDEvent(self.station).start(path, gid)
  351. self.station.push_event(event)
  352. def export_where(self):
  353. where = self.where_var[0].get()
  354. path = self.where_var[1].get()
  355. event = tk_event.ExportGarbageAdvancedEvent(self.station).start(path, where)
  356. self.station.push_event(event)
  357. class ExportUserProgram(ExportProgramBase):
  358. def __init__(self, station, win, color):
  359. super().__init__(station, win, color, "ExportUser")
  360. self._conf("#f69c9f", ["UserID:", "Export:"], ["Where:", "Export:"],
  361. ["Export By UserID", "Export Advanced", "ChoosePath", "ChoosePath"])
  362. def export_id(self):
  363. uid = self.gid_var[0].get()
  364. path = self.gid_var[1].get()
  365. event = tk_event.ExportUserByIDEvent(self.station).start(path, uid)
  366. self.station.push_event(event)
  367. def export_where(self):
  368. where = self.where_var[0].get()
  369. path = self.where_var[1].get()
  370. event = tk_event.ExportUserAdvancedEvent(self.station).start(path, where)
  371. self.station.push_event(event)
  372. class CreateUserFromCSVProgram(AdminProgram):
  373. def __init__(self, station, win, color):
  374. super().__init__(station, win, color, "CreateUserFromCSV")
  375. self.auto_frame = tk.Frame(self.frame)
  376. self.auto_title: tk.Label = tk.Label(self.auto_frame)
  377. self.auto_enter: tk.Entry = tk.Entry(self.auto_frame)
  378. self.auto_var: tk.Variable = tk.StringVar()
  379. self.enter_frame = tk.Frame(self.frame)
  380. self.path_title: tk.Label = tk.Label(self.enter_frame)
  381. self.path_enter: tk.Entry = tk.Entry(self.enter_frame)
  382. self.path_var: tk.Variable = tk.StringVar()
  383. self.create_btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  384. self.file_btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  385. self.__conf_font()
  386. def __conf_font(self, n: int = 1):
  387. self.title_font_size = int(16 * n)
  388. self.btn_font_size = int(14 * n)
  389. def conf_gui(self, n: int = 1):
  390. self.__conf_font(n)
  391. title_font = make_font(size=self.title_font_size)
  392. btn_font = make_font(size=self.btn_font_size)
  393. self.enter_frame['bg'] = "#EEE8AA"
  394. self.enter_frame['bd'] = 5
  395. self.enter_frame['relief'] = "ridge"
  396. self.enter_frame.place(relx=0.2, rely=0.2, relwidth=0.6, relheight=0.12)
  397. self.auto_frame['bg'] = "#EEE8AA"
  398. self.auto_frame['bd'] = 5
  399. self.auto_frame['relief'] = "ridge"
  400. self.auto_frame.place(relx=0.2, rely=0.6, relwidth=0.6, relheight=0.12)
  401. self.auto_title['font'] = title_font
  402. self.auto_title['text'] = "Path:"
  403. self.auto_title['bg'] = "#EEE8AA"
  404. self.auto_title['anchor'] = 'e'
  405. self.path_title['font'] = title_font
  406. self.path_title['text'] = "Path:"
  407. self.path_title['bg'] = "#EEE8AA"
  408. self.path_title['anchor'] = 'e'
  409. self.auto_enter['textvariable'] = self.auto_var
  410. self.auto_enter['font'] = title_font
  411. self.path_enter['textvariable'] = self.path_var
  412. self.path_enter['font'] = title_font
  413. self.auto_title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  414. self.auto_enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  415. self.path_title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  416. self.path_enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  417. for btn, text in zip(self.create_btn + self.file_btn,
  418. ["Create User", "Create Auto User", "Choose CSV", "Choose CSV"]):
  419. btn['font'] = btn_font
  420. btn['text'] = text
  421. btn['bg'] = conf.tk_btn_bg
  422. self.create_btn[0]['command'] = self.create
  423. self.create_btn[1]['command'] = self.create_auto
  424. self.create_btn[0].place(relx=0.2, rely=0.34, relwidth=0.25, relheight=0.08)
  425. self.create_btn[1].place(relx=0.2, rely=0.74, relwidth=0.25, relheight=0.08)
  426. self.file_btn[0]['command'] = self.choose_file
  427. self.file_btn[1]['command'] = self.choose_file_auto
  428. self.file_btn[0].place(relx=0.6, rely=0.34, relwidth=0.2, relheight=0.08)
  429. self.file_btn[1].place(relx=0.6, rely=0.74, relwidth=0.2, relheight=0.08)
  430. def choose_file_auto(self):
  431. path = askopenfilename(title='path of csv', filetypes=[("CSV", ".csv")])
  432. self.auto_var.set(path)
  433. def choose_file(self):
  434. path = askopenfilename(title='path of csv', filetypes=[("CSV", ".csv")])
  435. self.path_var.set(path)
  436. def create_auto(self):
  437. path = self.auto_var.get()
  438. event = tk_event.CreateAutoUserFromCSVEvent(self.station).start(path)
  439. self.station.push_event(event)
  440. def create(self):
  441. path = self.path_var.get()
  442. event = tk_event.CreateUserFromCSVEvent(self.station).start(path)
  443. self.station.push_event(event)
  444. def set_disable(self):
  445. self.auto_enter['state'] = 'disable'
  446. self.path_enter['state'] = 'disable'
  447. set_tk_disable_from_list(self.create_btn)
  448. set_tk_disable_from_list(self.file_btn)
  449. def reset_disable(self):
  450. self.auto_enter['state'] = 'normal'
  451. self.path_enter['state'] = 'normal'
  452. set_tk_disable_from_list(self.create_btn, flat='normal')
  453. set_tk_disable_from_list(self.file_btn, flat='normal')
  454. class DeleteUserProgram(AdminProgram):
  455. def __init__(self, station, win, color):
  456. super().__init__(station, win, color, "DeleteUser")
  457. self.uid_frame = tk.Frame(self.frame)
  458. self.uid_title: tk.Label = tk.Label(self.uid_frame)
  459. self.uid_enter: tk.Entry = tk.Entry(self.uid_frame)
  460. self.uid_var: tk.Variable = tk.StringVar()
  461. self.name_frame = tk.Frame(self.frame)
  462. self.name_title: List[tk.Label] = [tk.Label(self.name_frame) for _ in range(2)]
  463. self.name_enter: List[tk.Entry] = [tk.Entry(self.name_frame) for _ in range(2)]
  464. self.name_var: List[tk.Variable] = [tk.StringVar() for _ in range(2)]
  465. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)] # uid-del, name-passwd-del
  466. self.__conf_font()
  467. def __conf_font(self, n: int = 1):
  468. self.title_font_size = int(16 * n)
  469. self.btn_font_size = int(14 * n)
  470. def conf_gui(self, n: int = 1):
  471. self.__conf_font(n)
  472. title_font = make_font(size=self.title_font_size)
  473. btn_font = make_font(size=self.btn_font_size)
  474. self.uid_frame['bg'] = "#FA8072"
  475. self.uid_frame['bd'] = 5
  476. self.uid_frame['relief'] = "ridge"
  477. self.uid_frame.place(relx=0.2, rely=0.20, relwidth=0.6, relheight=0.10)
  478. self.name_frame['bg'] = "#FA8072"
  479. self.name_frame['bd'] = 5
  480. self.name_frame['relief'] = "ridge"
  481. self.name_frame.place(relx=0.2, rely=0.48, relwidth=0.6, relheight=0.25)
  482. height = 0.17
  483. for lb, text, enter, var in zip(self.name_title, ["UserName:", "PassWord:"], self.name_enter, self.name_var):
  484. lb['font'] = title_font
  485. lb['text'] = text
  486. lb['bg'] = "#FA8072"
  487. lb['anchor'] = 'e'
  488. enter['font'] = title_font
  489. enter['textvariable'] = var
  490. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.20)
  491. enter.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.20)
  492. height += 0.45
  493. self.uid_title['font'] = title_font
  494. self.uid_title['text'] = "UserID:"
  495. self.uid_title['bg'] = "#FA8072"
  496. self.uid_title['anchor'] = 'e'
  497. self.uid_enter['font'] = title_font
  498. self.uid_enter['textvariable'] = self.uid_var
  499. self.uid_title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  500. self.uid_enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  501. for btn, text, func in zip(self.btn,
  502. ["Delete By Uid", "Delete By Name"],
  503. [lambda: self.del_by_uid(), lambda: self.del_by_name()]):
  504. btn['font'] = btn_font
  505. btn['text'] = text
  506. btn['bg'] = conf.tk_btn_bg
  507. btn['command'] = func
  508. self.btn[0].place(relx=0.6, rely=0.32, relwidth=0.2, relheight=0.08)
  509. self.btn[1].place(relx=0.6, rely=0.75, relwidth=0.2, relheight=0.08)
  510. def del_by_uid(self):
  511. uid = self.uid_var.get()
  512. if len(uid) != 32:
  513. self.station.show_msg("UserID Error", "Len of UserID must be 32", "Error")
  514. return
  515. event = tk_event.DelUserEvent(self.station).start(uid)
  516. self.station.push_event(event)
  517. def del_by_name(self):
  518. name = self.name_var[0].get()
  519. passwd = self.name_var[1].get()
  520. if len(name) == 0 or len(passwd) == 0:
  521. self.station.show_msg("UserName/Password Error", "You should enter UserName and Password", "Error")
  522. return
  523. uid = create_uid(name, passwd)
  524. event = tk_event.DelUserEvent(self.station).start(uid)
  525. self.station.push_event(event)
  526. def set_disable(self):
  527. set_tk_disable_from_list(self.btn)
  528. set_tk_disable_from_list(self.name_enter)
  529. self.uid_enter['state'] = 'disable'
  530. def reset_disable(self):
  531. set_tk_disable_from_list(self.btn, flat='normal')
  532. set_tk_disable_from_list(self.name_enter, flat='normal')
  533. self.uid_enter['state'] = 'normal'
  534. class DeleteUsersProgram(AdminProgram):
  535. def __init__(self, station, win, color):
  536. super().__init__(station, win, color, "DeleteUsers")
  537. self.enter_frame = tk.Frame(self.frame)
  538. self.title: tk.Label = tk.Label(self.enter_frame)
  539. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  540. self.var: tk.Variable = tk.StringVar()
  541. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)] # del, scan
  542. self.__conf_font()
  543. def __conf_font(self, n: int = 1):
  544. self.title_font_size = int(16 * n)
  545. self.btn_font_size = int(14 * n)
  546. def conf_gui(self, n: int = 1):
  547. self.__conf_font(n)
  548. title_font = make_font(size=self.title_font_size)
  549. btn_font = make_font(size=self.btn_font_size)
  550. self.enter_frame['bg'] = "#48c0a3"
  551. self.enter_frame['bd'] = 5
  552. self.enter_frame['relief'] = "ridge"
  553. self.enter_frame.place(relx=0.2, rely=0.30, relwidth=0.6, relheight=0.10)
  554. self.title['font'] = title_font
  555. self.title['text'] = "Where:"
  556. self.title['anchor'] = 'e'
  557. self.title['bg'] = "#48c0a3"
  558. self.enter['font'] = title_font
  559. self.enter['textvariable'] = self.var
  560. self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  561. self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  562. for btn, text, x, func in zip(self.btn,
  563. ["Delete", "Scan"],
  564. [0.2, 0.6],
  565. [lambda: self.delete_user(), lambda: self.scan_user()]):
  566. btn['font'] = btn_font
  567. btn['text'] = text
  568. btn['bg'] = conf.tk_btn_bg
  569. btn['command'] = func
  570. btn.place(relx=x, rely=0.6, relwidth=0.2, relheight=0.08)
  571. def delete_user(self):
  572. where = self.var.get()
  573. if len(where) == 0:
  574. self.station.show_msg("`Where`Error", "`Where` must be SQL", "Warning")
  575. return
  576. event = tk_event.DelUserFromWhereEvent(self.station).start(where)
  577. self.station.push_event(event)
  578. def scan_user(self):
  579. where = self.var.get()
  580. if len(where) == 0:
  581. self.station.show_msg("`Where`Error", "`Where` must be SQL", "Warning")
  582. return
  583. event = tk_event.DelUserFromWhereScanEvent(self.station).start(where)
  584. self.station.push_event(event)
  585. def set_disable(self):
  586. set_tk_disable_from_list(self.btn)
  587. self.enter['state'] = 'disable'
  588. def reset_disable(self):
  589. set_tk_disable_from_list(self.btn, flat='normal')
  590. self.enter['state'] = 'normal'
  591. class DeleteGarbageProgramBase(AdminProgram):
  592. def __init__(self, station, win, color, title: str):
  593. super().__init__(station, win, color, title)
  594. self.enter_frame = tk.Frame(self.frame)
  595. self.title: tk.Label = tk.Label(self.enter_frame)
  596. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  597. self.var: tk.Variable = tk.StringVar()
  598. self.int_var: tk.Variable = tk.IntVar()
  599. self.int_var.set(0)
  600. self.radio: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(4)]
  601. self.btn: tk.Button = tk.Button(self.frame)
  602. self.__conf_font()
  603. self._conf()
  604. def _conf(self, title: str = "GarbageID:", color: str = "#b69968", support_del_all: bool = True):
  605. self.frame_title = title
  606. self.frame_color = color
  607. self.support_del_all = support_del_all
  608. def __conf_font(self, n: int = 1):
  609. self.title_font_size = int(16 * n)
  610. self.btn_font_size = int(14 * n)
  611. def conf_gui(self, n: int = 1):
  612. self.__conf_font(n)
  613. title_font = make_font(size=self.title_font_size)
  614. btn_font = make_font(size=self.btn_font_size)
  615. self.enter_frame['bg'] = self.frame_color
  616. self.enter_frame['bd'] = 5
  617. self.enter_frame['relief'] = "ridge"
  618. self.enter_frame.place(relx=0.2, rely=0.30, relwidth=0.6, relheight=0.10)
  619. self.title['font'] = title_font
  620. self.title['text'] = self.frame_title
  621. self.title['bg'] = self.frame_color
  622. self.title['anchor'] = 'e'
  623. self.enter['font'] = title_font
  624. self.enter['textvariable'] = self.var
  625. self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  626. self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  627. for i in range(4):
  628. radio = self.radio[i]
  629. radio['font'] = btn_font
  630. radio['text'] = ['From-All', 'From-NotUse', 'From-Waiting', 'From-Used'][i]
  631. radio['bg'] = self.color
  632. radio['value'] = i
  633. radio['variable'] = self.int_var
  634. radio['anchor'] = 'w'
  635. if not self.support_del_all:
  636. self.int_var.set(1)
  637. self.radio[0]['state'] = 'disable'
  638. self.radio[0].place(relx=0.20, rely=0.43, relwidth=0.20, relheight=0.1)
  639. self.radio[1].place(relx=0.60, rely=0.43, relwidth=0.20, relheight=0.1)
  640. self.radio[2].place(relx=0.20, rely=0.55, relwidth=0.20, relheight=0.1)
  641. self.radio[3].place(relx=0.60, rely=0.55, relwidth=0.20, relheight=0.1)
  642. self.btn['font'] = btn_font
  643. self.btn['text'] = 'Delete'
  644. self.btn['bg'] = conf.tk_btn_bg
  645. self.btn['command'] = lambda: self.delete_garbage()
  646. self.btn.place(relx=0.4, rely=0.68, relwidth=0.2, relheight=0.08)
  647. def delete_garbage(self):
  648. ...
  649. def set_disable(self):
  650. self.enter['state'] = 'disable'
  651. self.btn['state'] = 'disable'
  652. def reset_disable(self):
  653. self.enter['state'] = 'normal'
  654. self.btn['state'] = 'normal'
  655. class DeleteGarbageProgram(DeleteGarbageProgramBase):
  656. def __init__(self, station, win, color):
  657. super(DeleteGarbageProgram, self).__init__(station, win, color, "DeleteGarbage")
  658. def delete_garbage(self):
  659. where = self.int_var.get()
  660. assert where in [0, 1, 2, 3]
  661. gid = self.var.get()
  662. if len(gid) == 0:
  663. self.station.show_msg("GarbageID Error", "You should enter the garbage id", "Warning")
  664. return
  665. event = tk_event.DelGarbageEvent(self.station).start(gid, where)
  666. self.station.push_event(event)
  667. class DeleteGarbageMoreProgram(DeleteGarbageProgramBase):
  668. def __init__(self, station, win, color):
  669. super(DeleteGarbageMoreProgram, self).__init__(station, win, color, "DeleteGarbageMore")
  670. self.scan_btn = tk.Button(self.frame)
  671. self._conf("Where:", "#f58f98", False)
  672. def conf_gui(self, n: int = 1):
  673. super(DeleteGarbageMoreProgram, self).conf_gui(n)
  674. self.btn.place_forget()
  675. self.btn.place(relx=0.2, rely=0.68, relwidth=0.2, relheight=0.08)
  676. self.scan_btn['font'] = make_font(size=self.btn_font_size)
  677. self.scan_btn['text'] = 'Scan'
  678. self.scan_btn['bg'] = conf.tk_btn_bg
  679. self.scan_btn['command'] = lambda: self.delete_garbage(True)
  680. self.scan_btn.place(relx=0.6, rely=0.68, relwidth=0.2, relheight=0.08)
  681. def set_disable(self):
  682. super(DeleteGarbageMoreProgram, self).set_disable()
  683. self.scan_btn['state'] = 'disable'
  684. def reset_disable(self):
  685. super(DeleteGarbageMoreProgram, self).reset_disable()
  686. self.scan_btn['state'] = 'normal'
  687. def delete_garbage(self, is_scan: bool = False):
  688. where = self.int_var.get()
  689. assert where in [1, 2, 3]
  690. where_sql = self.var.get()
  691. if len(where_sql) == 0:
  692. self.station.show_msg("`Where`Error", "`Where` must be SQL", "Warning")
  693. return
  694. if is_scan:
  695. event = tk_event.DelGarbageWhereScanEvent(self.station).start(where, where_sql)
  696. else:
  697. event = tk_event.DelGarbageWhereEvent(self.station).start(where, where_sql)
  698. self.station.push_event(event)
  699. class DeleteAllGarbageProgram(AdminProgram):
  700. def __init__(self, station, win, color):
  701. super().__init__(station, win, color, "DeleteAllGarbage")
  702. self.dangerous: tk.Label = tk.Label(self.frame)
  703. self.enter_frame = tk.Frame(self.frame)
  704. self.title: tk.Label = tk.Label(self.enter_frame)
  705. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  706. self.var: tk.Variable = tk.StringVar()
  707. self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)] # del, scan
  708. self.__conf_font()
  709. def __conf_font(self, n: int = 1):
  710. self.danger_font_size = int(20 * n)
  711. self.title_font_size = int(16 * n)
  712. self.btn_font_size = int(14 * n)
  713. def conf_gui(self, n: int = 1):
  714. self.__conf_font(n)
  715. danger_font = make_font(size=self.danger_font_size, weight="bold", underline=1)
  716. title_font = make_font(size=self.title_font_size)
  717. btn_font = make_font(size=self.btn_font_size)
  718. danger_btn_font = make_font(size=self.btn_font_size, weight="bold", overstrike=1)
  719. self.dangerous['bg'] = self.color
  720. self.dangerous['font'] = danger_font
  721. self.dangerous['fg'] = "#f20c00"
  722. self.dangerous['text'] = ("Delete all garbage from database?\n"
  723. "Please enter the admin-passwd to\n"
  724. "continue.\n"
  725. "Dangerous operation.\n"
  726. "The database may not be restored.\n"
  727. "SuperHuan is not responsible for\n"
  728. "the consequences.")
  729. self.dangerous.place(relx=0.05, rely=0.03, relwidth=0.9, relheight=0.43)
  730. self.enter_frame['bg'] = "#f20c00"
  731. self.enter_frame['bd'] = 5
  732. self.enter_frame['relief'] = "ridge"
  733. self.enter_frame.place(relx=0.2, rely=0.50, relwidth=0.6, relheight=0.10)
  734. self.title['font'] = title_font
  735. self.title['text'] = "Password:"
  736. self.title['bg'] = "#f20c00"
  737. self.title['anchor'] = 'e'
  738. self.enter['font'] = title_font
  739. self.enter['textvariable'] = self.var
  740. self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  741. self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  742. for btn, text, x in zip(self.btn, ["Delete", "Scan"], [0.2, 0.6]):
  743. btn['text'] = text
  744. btn.place(relx=x, rely=0.68, relwidth=0.2, relheight=0.08)
  745. self.btn[0]['font'] = danger_btn_font
  746. self.btn[0]['bg'] = "#f20c00"
  747. self.btn[0]['command'] = lambda: self.delete_garbage()
  748. self.btn[1]['font'] = btn_font
  749. self.btn[1]['bg'] = conf.tk_btn_bg
  750. self.btn[1]['command'] = lambda: self.scan_garbage()
  751. def scan_garbage(self):
  752. event = tk_event.DelAllGarbageScanEvent(self.station) # 不需要start
  753. self.station.push_event(event)
  754. def delete_garbage(self):
  755. passwd = self.var.get()
  756. if len(passwd) == 0:
  757. self.station.show_msg("PassWordError", "Password error", "Warning")
  758. user = find_user_by_name('admin', passwd, self.station.get_db())
  759. if user is None or not user.is_manager():
  760. self.station.show_msg("PassWordError", "Password error", "Warning")
  761. return
  762. event = tk_event.DelAllGarbageEvent(self.station) # 不需要start
  763. self.station.push_event(event)
  764. def set_disable(self):
  765. set_tk_disable_from_list(self.btn)
  766. self.enter['state'] = 'disable'
  767. def reset_disable(self):
  768. set_tk_disable_from_list(self.btn, flat='normal')
  769. self.enter['state'] = 'normal'
  770. class SearchBaseProgram(AdminProgram, metaclass=abc.ABCMeta):
  771. def __init__(self, station, win, color, title: str):
  772. super().__init__(station, win, color, title)
  773. self.view_frame = tk.Frame(self.frame)
  774. self.view = ttk.Treeview(self.view_frame)
  775. self.y_scroll = tk.Scrollbar(self.view_frame)
  776. self.x_scroll = tk.Scrollbar(self.view_frame)
  777. def conf_view_gui(self, columns: list, relx, rely, relwidth, relheight,
  778. x_scroll=0.05, y_scroll=0.02, color: str = "#FA8072"):
  779. self.view_frame['bg'] = color
  780. self.view_frame['bd'] = 2
  781. self.view_frame['relief'] = "ridge"
  782. self.view_frame.place(relx=relx, rely=rely, relwidth=relwidth, relheight=relheight)
  783. self.view['columns'] = columns
  784. self.view['show'] = 'headings'
  785. self.view['selectmode'] = 'none'
  786. for i in columns:
  787. self.view.column(i, anchor="c")
  788. self.view.heading(i, text=i)
  789. self.y_scroll['orient'] = 'vertical'
  790. self.y_scroll['command'] = self.view.yview
  791. self.view['yscrollcommand'] = self.y_scroll.set
  792. self.x_scroll['orient'] = 'horizontal'
  793. self.x_scroll['command'] = self.view.xview
  794. self.view['xscrollcommand'] = self.x_scroll.set
  795. self.view.place(relx=0.0, rely=0.0, relwidth=1 - y_scroll, relheight=1 - x_scroll)
  796. self.y_scroll.place(relx=0.98, rely=0.0, relwidth=y_scroll, relheight=1.0)
  797. self.x_scroll.place(relx=0.0, rely=1 - x_scroll, relwidth=1 - y_scroll, relheight=x_scroll)
  798. class SearchUserProgram(SearchBaseProgram):
  799. def __init__(self, station, win, color):
  800. super().__init__(station, win, color, "SearchUser")
  801. self.enter_frame = tk.Frame(self.frame)
  802. self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(3)]
  803. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame) for _ in range(3)]
  804. self.var: List[tk.Variable] = [tk.StringVar() for _ in range(3)]
  805. self.check: List[Tuple[tk.Checkbutton, tk.Variable]] = [(tk.Checkbutton(self.enter_frame), tk.IntVar())
  806. for _ in range(3)]
  807. self.btn: tk.Button = tk.Button(self.frame)
  808. self._columns = ["UserID", "Name", "Phone", "Score", "Reputation", "IsManager"]
  809. self.__conf_font()
  810. def __conf_font(self, n: int = 1):
  811. self.title_font_size = int(16 * n)
  812. self.btn_font_size = int(14 * n)
  813. def conf_gui(self, n: int = 1):
  814. self.__conf_font(n)
  815. title_font = make_font(size=self.title_font_size)
  816. btn_font = make_font(size=self.btn_font_size)
  817. self.enter_frame['bg'] = "#FA8072"
  818. self.enter_frame['bd'] = 5
  819. self.enter_frame['relief'] = "ridge"
  820. self.enter_frame.place(relx=0.2, rely=0.0, relwidth=0.6, relheight=0.30)
  821. height = 0.1
  822. for lb, text, enter, var, check in zip(self.title,
  823. ["UserID:", "UserName:", "Phone:"],
  824. self.enter, self.var, self.check):
  825. lb['font'] = title_font
  826. lb['text'] = text
  827. lb['bg'] = "#FA8072"
  828. lb['anchor'] = 'e'
  829. enter['font'] = title_font
  830. enter['textvariable'] = var
  831. check[0]['font'] = title_font
  832. check[0]['text'] = ''
  833. check[0]['bg'] = "#FA8072"
  834. check[0]['variable'] = check[1]
  835. check[1].set(1)
  836. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.17)
  837. enter.place(relx=0.35, rely=height, relwidth=0.55, relheight=0.17)
  838. check[0].place(relx=0.92, rely=height, relwidth=0.04, relheight=0.17)
  839. height += 0.30
  840. self.btn['font'] = btn_font
  841. self.btn['text'] = "Search"
  842. self.btn['bg'] = conf.tk_btn_bg
  843. self.btn['command'] = self.search_user
  844. self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
  845. self.conf_view_gui(self._columns, relx=0.05, rely=0.32, relwidth=0.9, relheight=0.55)
  846. def search_user(self):
  847. use_uid = self.check[0][1].get()
  848. use_name = self.check[1][1].get()
  849. use_phone = self.check[2][1].get()
  850. uid = None
  851. name = None
  852. phone = None
  853. if use_uid:
  854. uid = self.var[0].get()
  855. if len(uid) == 0:
  856. uid = None
  857. if use_name:
  858. name = self.var[1].get()
  859. if len(name) == 0:
  860. name = None
  861. if use_phone:
  862. phone = self.var[2].get()
  863. if len(phone) == 0:
  864. phone = None
  865. event = tk_event.SearchUserEvent(self.station).start(self._columns, uid, name, phone, self)
  866. self.station.push_event(event)
  867. def set_disable(self):
  868. self.btn['state'] = 'disable'
  869. set_tk_disable_from_list(self.enter)
  870. def reset_disable(self):
  871. self.btn['state'] = 'normal'
  872. set_tk_disable_from_list(self.enter, flat='normal')
  873. class SearchAdvancedProgramBase(SearchBaseProgram, metaclass=abc.ABCMeta):
  874. def __init__(self, station, win, color, title: str):
  875. super().__init__(station, win, color, title)
  876. self.enter_frame = tk.Frame(self.frame)
  877. self.title: tk.Label = tk.Label(self.enter_frame)
  878. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  879. self.var: tk.Variable = tk.StringVar()
  880. self.btn: tk.Button = tk.Button(self.frame)
  881. self._conf([], "#FA8072") # 默认颜色
  882. self.__conf_font()
  883. def _conf(self, columns: list, bg_color):
  884. self.bg_color = bg_color
  885. self._columns = columns
  886. return self
  887. def __conf_font(self, n: int = 1):
  888. self.title_font_size = int(16 * n)
  889. self.btn_font_size = int(14 * n)
  890. def conf_gui(self, n: int = 1):
  891. self.__conf_font(n)
  892. title_font = make_font(size=self.title_font_size)
  893. btn_font = make_font(size=self.btn_font_size)
  894. self.enter_frame['bg'] = self.bg_color
  895. self.enter_frame['bd'] = 5
  896. self.enter_frame['relief'] = "ridge"
  897. self.enter_frame.place(relx=0.2, rely=0.00, relwidth=0.6, relheight=0.10)
  898. self.title['font'] = title_font
  899. self.title['bg'] = self.bg_color
  900. self.title['text'] = "Where:"
  901. self.title['anchor'] = 'e'
  902. self.enter['font'] = title_font
  903. self.enter['textvariable'] = self.var
  904. self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
  905. self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
  906. self.btn['text'] = "Search"
  907. self.btn['font'] = btn_font
  908. self.btn['bg'] = conf.tk_btn_bg
  909. self.btn['command'] = self.search
  910. self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
  911. self.conf_view_gui(self._columns, relx=0.05, rely=0.12, relwidth=0.9, relheight=0.76)
  912. def search(self):
  913. ...
  914. def set_disable(self):
  915. self.btn['state'] = 'disable'
  916. self.enter['state'] = 'disable'
  917. def reset_disable(self):
  918. self.btn['state'] = 'normal'
  919. self.enter['state'] = 'normal'
  920. class SearchUserAdvancedProgram(SearchAdvancedProgramBase):
  921. def __init__(self, station, win, color):
  922. super(SearchUserAdvancedProgram, self).__init__(station, win, color, "SearchUserAdvanced")
  923. columns = ["UserID", "Name", "Phone", "Score", "Reputation", "IsManager"]
  924. self._conf(columns, '#48c0a3')
  925. def search(self):
  926. where = self.var.get()
  927. event = tk_event.SearchUserAdvancedEvent(self.station).start(self._columns, where, self)
  928. self.station.push_event(event)
  929. class SearchGarbageProgram(SearchBaseProgram):
  930. def __init__(self, station, win, color):
  931. super().__init__(station, win, color, "SearchGarbage")
  932. self.enter_frame = tk.Frame(self.frame)
  933. self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(8)]
  934. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame) for _ in range(8)]
  935. self.var: List[tk.Variable] = [tk.StringVar() for _ in range(8)]
  936. self.check: List[Tuple[tk.Checkbutton, tk.Variable]] = [(tk.Checkbutton(self.enter_frame), tk.IntVar())
  937. for _ in range(8)]
  938. self._columns = ["GarbageID", "UserID", "CheckerID", "CreateTime", "UseTime", "Location", "GarbageType",
  939. "CheckResult"]
  940. self.btn: tk.Button = tk.Button(self.frame)
  941. self.__conf_font()
  942. def __conf_font(self, n: int = 1):
  943. self.title_font_size = int(16 * n)
  944. self.btn_font_size = int(14 * n)
  945. def conf_gui(self, n: int = 1):
  946. self.__conf_font(n)
  947. title_font = make_font(size=self.title_font_size)
  948. btn_font = make_font(size=self.btn_font_size)
  949. self.enter_frame['bg'] = "#7bbfea"
  950. self.enter_frame['bd'] = 5
  951. self.enter_frame['relief'] = "ridge"
  952. self.enter_frame.place(relx=0.2, rely=0.0, relwidth=0.6, relheight=0.47)
  953. height = 0.02
  954. for lb, text, enter, var, check in zip(self.title,
  955. ["GarbageID:", "UserID:", "CheckerID:", "CreateTime:", "UseTime:",
  956. "Location:", "GarbageType:", "CheckResult:"],
  957. self.enter, self.var, self.check):
  958. lb['font'] = title_font
  959. lb['text'] = text
  960. lb['bg'] = "#7bbfea"
  961. lb['anchor'] = 'e'
  962. enter['font'] = title_font
  963. enter['textvariable'] = var
  964. check[0]['font'] = title_font
  965. check[0]['bg'] = "#7bbfea"
  966. check[0]['text'] = ''
  967. check[0]['variable'] = check[1]
  968. check[1].set(1)
  969. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.10)
  970. enter.place(relx=0.35, rely=height, relwidth=0.55, relheight=0.10)
  971. check[0].place(relx=0.92, rely=height, relwidth=0.04, relheight=0.10)
  972. height += 0.121
  973. self.btn['font'] = btn_font
  974. self.btn['bg'] = conf.tk_btn_bg
  975. self.btn['text'] = "Search"
  976. self.btn['command'] = self.search_user
  977. self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
  978. self.conf_view_gui(self._columns, relx=0.05, rely=0.49, relwidth=0.9, relheight=0.38, x_scroll=0.07)
  979. def search_user(self):
  980. keys = ["gid", "uid", "cuid", "create_time", "use_time", "loc", "type_", "check"]
  981. key_values = {}
  982. for i, key in enumerate(keys):
  983. ck = self.check[i][1].get()
  984. if ck:
  985. res = self.enter[i].get()
  986. if len(res) > 0:
  987. key_values[key] = res
  988. continue
  989. key_values[key] = None
  990. event = tk_event.SearchGarbageEvent(self.station).start(self._columns, key_values, self)
  991. self.station.push_event(event)
  992. def set_disable(self):
  993. self.btn['state'] = 'disable'
  994. set_tk_disable_from_list(self.enter)
  995. def reset_disable(self):
  996. self.btn['state'] = 'normal'
  997. set_tk_disable_from_list(self.enter, flat='normal')
  998. class SearchGarbageAdvancedProgram(SearchAdvancedProgramBase):
  999. def __init__(self, station, win, color):
  1000. super(SearchGarbageAdvancedProgram, self).__init__(station, win, color, "SearchGarbageAdvanced")
  1001. columns = ["GarbageID", "UserID", "CheckerID", "CreateTime", "UseTime", "Location", "GarbageType",
  1002. "CheckResult"]
  1003. self._conf(columns, '#d1923f')
  1004. def search(self):
  1005. where = self.var.get()
  1006. event = tk_event.SearchGarbageAdvancedEvent(self.station).start(self._columns, where, self)
  1007. self.station.push_event(event)
  1008. class SearchAdvancedProgram(SearchAdvancedProgramBase):
  1009. def __init__(self, station, win, color):
  1010. super(SearchAdvancedProgram, self).__init__(station, win, color, "SearchAdvanced")
  1011. columns = ["GarbageID", "UserID", "UserName", "UserPhone", "UserScore",
  1012. "UserReputation", "CheckerID", "CheckerName", "CheckerPhone",
  1013. "CreateTime", "UseTime", "Location", "GarbageType", "CheckResult"]
  1014. self._conf(columns, '#426ab3')
  1015. def search(self):
  1016. where = self.var.get()
  1017. event = tk_event.SearchAdvancedEvent(self.station).start(self._columns, where, self)
  1018. self.station.push_event(event)
  1019. class UpdateUserProgramBase(AdminProgram):
  1020. def __init__(self, station, win, color, title: str):
  1021. super().__init__(station, win, color, title)
  1022. self.enter_frame = tk.Frame(self.frame)
  1023. self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(2)]
  1024. self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame) for _ in range(2)]
  1025. self.var: List[tk.Variable] = [tk.StringVar() for _ in range(2)]
  1026. self.where_frame = tk.Frame(self.frame)
  1027. self.where_title: List[tk.Label] = [tk.Label(self.where_frame) for _ in range(2)]
  1028. self.where_enter: List[tk.Entry] = [tk.Entry(self.where_frame) for _ in range(2)]
  1029. self.where_var: List[tk.Variable] = [tk.StringVar() for _ in range(2)]
  1030. self.btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  1031. self._conf(["", ""], "#FA8072")
  1032. self.__conf_font()
  1033. def _conf(self, title: List[str], bg_color: str):
  1034. self.bg_color = bg_color
  1035. self.bg_color_where = bg_color
  1036. self.enter_title = title
  1037. def __conf_font(self, n: int = 1):
  1038. self.title_font_size = int(16 * n)
  1039. self.btn_font_size = int(14 * n)
  1040. def conf_gui(self, n: int = 1):
  1041. self.__conf_font(n)
  1042. title_font = make_font(size=self.title_font_size)
  1043. btn_font = make_font(size=self.btn_font_size)
  1044. self.where_frame['bg'] = self.bg_color_where
  1045. self.where_frame['bd'] = 5
  1046. self.where_frame['relief'] = "ridge"
  1047. self.where_frame.place(relx=0.2, rely=0.20, relwidth=0.6, relheight=0.17)
  1048. self.enter_frame['bg'] = self.bg_color
  1049. self.enter_frame['bd'] = 5
  1050. self.enter_frame['relief'] = "ridge"
  1051. self.enter_frame.place(relx=0.2, rely=0.58, relwidth=0.6, relheight=0.17)
  1052. height = 0.1
  1053. for lb, text, enter, var, lb_w, text_w, enter_w, var_w in (
  1054. zip(self.title, self.enter_title, self.enter, self.var,
  1055. self.where_title, ["Where:", self.enter_title[1]], self.where_enter, self.where_var)):
  1056. lb['font'] = title_font
  1057. lb['text'] = text
  1058. lb['bg'] = self.bg_color
  1059. lb['anchor'] = 'e'
  1060. lb_w['font'] = title_font
  1061. lb_w['text'] = text_w
  1062. lb_w['bg'] = self.bg_color_where
  1063. lb_w['anchor'] = 'e'
  1064. enter['font'] = title_font
  1065. enter['textvariable'] = var
  1066. enter_w['font'] = title_font
  1067. enter_w['textvariable'] = var_w
  1068. lb.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.35)
  1069. enter.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.35)
  1070. lb_w.place(relx=0.01, rely=height, relwidth=0.30, relheight=0.35)
  1071. enter_w.place(relx=0.35, rely=height, relwidth=0.60, relheight=0.35)
  1072. height += 0.43
  1073. for btn, text, func in zip(self.btn,
  1074. ["Update Advanced", "Update By UserID"],
  1075. [self.update_by_where, self.update_by_uid]):
  1076. btn['font'] = btn_font
  1077. btn['text'] = text
  1078. btn['bg'] = conf.tk_btn_bg
  1079. btn['command'] = func
  1080. self.btn[0].place(relx=0.55, rely=0.40, relwidth=0.25, relheight=0.08)
  1081. self.btn[1].place(relx=0.55, rely=0.78, relwidth=0.25, relheight=0.08)
  1082. def update_by_uid(self):
  1083. ...
  1084. def update_by_where(self):
  1085. ...
  1086. def set_disable(self):
  1087. set_tk_disable_from_list(self.btn)
  1088. set_tk_disable_from_list(self.enter)
  1089. def reset_disable(self):
  1090. set_tk_disable_from_list(self.btn, flat='normal')
  1091. set_tk_disable_from_list(self.enter, flat='normal')
  1092. class UpdateUserScoreBase(UpdateUserProgramBase):
  1093. def __init__(self, station, win, color):
  1094. super(UpdateUserScoreBase, self).__init__(station, win, color, "UpdateScore")
  1095. self._conf(["UserID:", "Score:"], "#afdfe4")
  1096. def update_by_uid(self):
  1097. uid = self.enter[0].get()
  1098. score = int(self.enter[1].get())
  1099. event = tk_event.UpdateUserScoreEvent(self.station).start(score, f"UserID='{uid}'")
  1100. self.station.push_event(event)
  1101. def update_by_where(self):
  1102. where = self.where_enter[0].get()
  1103. score = int(self.where_enter[1].get())
  1104. event = tk_event.UpdateUserScoreEvent(self.station).start(score, where)
  1105. self.station.push_event(event)
  1106. class UpdateUserReputationBase(UpdateUserProgramBase):
  1107. def __init__(self, station, win, color):
  1108. super(UpdateUserReputationBase, self).__init__(station, win, color, "UpdateReputation")
  1109. self._conf(["UserID:", "Reputation:"], "#f8aba6")
  1110. def update_by_uid(self):
  1111. uid = self.enter[0].get()
  1112. reputation = int(self.enter[1].get())
  1113. event = tk_event.UpdateUserReputationEvent(self.station).start(reputation, f"UserID='{uid}'")
  1114. self.station.push_event(event)
  1115. def update_by_where(self):
  1116. where = self.where_enter[0].get()
  1117. reputation = int(self.where_enter[1].get())
  1118. event = tk_event.UpdateUserReputationEvent(self.station).start(reputation, where)
  1119. self.station.push_event(event)
  1120. class UpdateGarbageTypeProgram(AdminProgram):
  1121. def __init__(self, station, win, color):
  1122. super().__init__(station, win, color, "UpdateGarbageType")
  1123. self.enter_frame = tk.Frame(self.frame)
  1124. self.title: tk.Label = tk.Label(self.enter_frame)
  1125. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  1126. self.type: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(4)]
  1127. self.var: List[tk.Variable] = [tk.StringVar, tk.IntVar()]
  1128. self.where_frame = tk.Frame(self.frame)
  1129. self.where_title: tk.Label = tk.Label(self.where_frame)
  1130. self.where_enter: tk.Entry = tk.Entry(self.where_frame)
  1131. self.where_type: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(4)]
  1132. self.where_var: List[tk.Variable] = [tk.StringVar, tk.IntVar()]
  1133. self.btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  1134. self.__conf_font()
  1135. def __conf_font(self, n: int = 1):
  1136. self.title_font_size = int(16 * n)
  1137. self.btn_font_size = int(14 * n)
  1138. def conf_gui(self, n: int = 1):
  1139. self.__conf_font(n)
  1140. title_font = make_font(size=self.title_font_size)
  1141. btn_font = make_font(size=self.btn_font_size)
  1142. self.where_frame['bg'] = "#fdb933"
  1143. self.where_frame['bd'] = 5
  1144. self.where_frame['relief'] = "ridge"
  1145. self.where_frame.place(relx=0.2, rely=0.20, relwidth=0.6, relheight=0.10)
  1146. self.enter_frame['bg'] = "#fdb933"
  1147. self.enter_frame['bd'] = 5
  1148. self.enter_frame['relief'] = "ridge"
  1149. self.enter_frame.place(relx=0.2, rely=0.60, relwidth=0.6, relheight=0.10)
  1150. for lb, enter, radios, var, y, text in zip([self.title, self.where_title],
  1151. [self.enter, self.where_enter],
  1152. [self.type, self.where_type],
  1153. [self.var, self.where_var],
  1154. [0.32, 0.72],
  1155. ["GarbageID:", "Where:"]):
  1156. lb['font'] = title_font
  1157. lb['text'] = text
  1158. lb['bg'] = "#fdb933"
  1159. lb['anchor'] = 'e'
  1160. enter['font'] = title_font
  1161. enter['textvariable'] = var[0]
  1162. for i, radio in enumerate(radios):
  1163. radio['font'] = btn_font
  1164. radio['bg'] = self.color
  1165. radio['text'] = GarbageType.GarbageTypeStrList[i + 1]
  1166. radio['value'] = i + 1
  1167. radio['variable'] = var[1]
  1168. radio['anchor'] = 'w'
  1169. var[1].set(1)
  1170. radios[0].place(relx=0.20, rely=y + 0.00, relwidth=0.20, relheight=0.04)
  1171. radios[1].place(relx=0.60, rely=y + 0.00, relwidth=0.20, relheight=0.04)
  1172. radios[2].place(relx=0.20, rely=y + 0.05, relwidth=0.20, relheight=0.04)
  1173. radios[3].place(relx=0.60, rely=y + 0.05, relwidth=0.20, relheight=0.04)
  1174. lb.place(relx=0.02, rely=0.2, relwidth=0.25, relheight=0.48)
  1175. enter.place(relx=0.30, rely=0.2, relwidth=0.60, relheight=0.48)
  1176. for btn, text, func in zip(self.btn,
  1177. ["Update Advanced", "Update By GarbageID"],
  1178. [self.update_by_where, self.update_by_gid]):
  1179. btn['font'] = btn_font
  1180. btn['text'] = text
  1181. btn['bg'] = conf.tk_btn_bg
  1182. btn['command'] = func
  1183. self.btn[0].place(relx=0.55, rely=0.43, relwidth=0.25, relheight=0.08)
  1184. self.btn[1].place(relx=0.55, rely=0.83, relwidth=0.25, relheight=0.08)
  1185. def update_by_gid(self):
  1186. gid = self.enter.get()
  1187. type_ = self.var[1].get()
  1188. event = tk_event.UpdateGarbageTypeEvent(self.station).start(type_, f"GarbageID={gid}")
  1189. self.station.push_event(event)
  1190. def update_by_where(self):
  1191. where = self.where_enter.get()
  1192. type_ = self.where_var[1].get()
  1193. event = tk_event.UpdateGarbageTypeEvent(self.station).start(type_, where)
  1194. self.station.push_event(event)
  1195. def set_disable(self):
  1196. set_tk_disable_from_list(self.btn)
  1197. self.enter['state'] = 'disable'
  1198. self.where_enter['state'] = 'normal'
  1199. def reset_disable(self):
  1200. set_tk_disable_from_list(self.btn, flat='normal')
  1201. self.enter['state'] = 'normal'
  1202. self.where_enter['state'] = 'normal'
  1203. class UpdateGarbageCheckResultProgram(AdminProgram):
  1204. def __init__(self, station, win, color):
  1205. super().__init__(station, win, color, "UpdateGarbageCheckResult")
  1206. self.enter_frame = tk.Frame(self.frame)
  1207. self.title: tk.Label = tk.Label(self.enter_frame)
  1208. self.enter: tk.Entry = tk.Entry(self.enter_frame)
  1209. self.type: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(2)]
  1210. self.var: List[tk.Variable] = [tk.StringVar, tk.IntVar()]
  1211. self.where_frame = tk.Frame(self.frame)
  1212. self.where_title: tk.Label = tk.Label(self.where_frame)
  1213. self.where_enter: tk.Entry = tk.Entry(self.where_frame)
  1214. self.where_type: List[tk.Radiobutton] = [tk.Radiobutton(self.frame) for _ in range(2)]
  1215. self.where_var: List[tk.Variable] = [tk.StringVar, tk.IntVar()]
  1216. self.btn: List[tk.Button] = [tk.Button(self.frame), tk.Button(self.frame)]
  1217. self.__conf_font()
  1218. def __conf_font(self, n: int = 1):
  1219. self.title_font_size = int(16 * n)
  1220. self.btn_font_size = int(14 * n)
  1221. def conf_gui(self, n: int = 1):
  1222. self.__conf_font(n)
  1223. title_font = make_font(size=self.title_font_size)
  1224. btn_font = make_font(size=self.btn_font_size)
  1225. self.where_frame['bg'] = "#abc88b"
  1226. self.where_frame['bd'] = 5
  1227. self.where_frame['relief'] = "ridge"
  1228. self.where_frame.place(relx=0.2, rely=0.20, relwidth=0.6, relheight=0.10)
  1229. self.enter_frame['bg'] = "#abc88b"
  1230. self.enter_frame['bd'] = 5
  1231. self.enter_frame['relief'] = "ridge"
  1232. self.enter_frame.place(relx=0.2, rely=0.60, relwidth=0.6, relheight=0.10)
  1233. for lb, enter, radios, var, y, text in zip([self.title, self.where_title],
  1234. [self.enter, self.where_enter],
  1235. [self.type, self.where_type],
  1236. [self.var, self.where_var],
  1237. [0.32, 0.72],
  1238. ["GarbageID:", "Where:"]):
  1239. lb['font'] = title_font
  1240. lb['text'] = text
  1241. lb['bg'] = "#abc88b"
  1242. lb['anchor'] = 'e'
  1243. enter['font'] = title_font
  1244. enter['textvariable'] = var[0]
  1245. for i, radio in enumerate(radios):
  1246. radio['font'] = btn_font
  1247. radio['bg'] = self.color
  1248. radio['text'] = ["Fail", "Pass"][i]
  1249. radio['value'] = i
  1250. radio['variable'] = var[1]
  1251. radio['anchor'] = 'w'
  1252. var[1].set(1)
  1253. radios[0].place(relx=0.20, rely=y + 0.00, relwidth=0.20, relheight=0.04)
  1254. radios[1].place(relx=0.60, rely=y + 0.00, relwidth=0.20, relheight=0.04)
  1255. lb.place(relx=0.02, rely=0.2, relwidth=0.25, relheight=0.48)
  1256. enter.place(relx=0.30, rely=0.2, relwidth=0.60, relheight=0.48)
  1257. for btn, text, func in zip(self.btn,
  1258. ["Update Advanced", "Update By GarbageID"],
  1259. [self.update_by_where, self.update_by_gid]):
  1260. btn['font'] = btn_font
  1261. btn['bg'] = conf.tk_btn_bg
  1262. btn['text'] = text
  1263. btn['command'] = func
  1264. self.btn[0].place(relx=0.55, rely=0.38, relwidth=0.25, relheight=0.08)
  1265. self.btn[1].place(relx=0.55, rely=0.78, relwidth=0.25, relheight=0.08)
  1266. def update_by_gid(self):
  1267. gid = self.enter.get()
  1268. check = (self.var[1].get() == 1)
  1269. event = tk_event.UpdateGarbageCheckEvent(self.station).start(check, f"GarbageID={gid}")
  1270. self.station.push_event(event)
  1271. def update_by_where(self):
  1272. where = self.where_enter.get()
  1273. check = (self.where_var[1].get() == 1)
  1274. event = tk_event.UpdateGarbageCheckEvent(self.station).start(check, where)
  1275. self.station.push_event(event)
  1276. def set_disable(self):
  1277. set_tk_disable_from_list(self.btn)
  1278. self.enter['state'] = 'disable'
  1279. self.where_enter['state'] = 'normal'
  1280. def reset_disable(self):
  1281. set_tk_disable_from_list(self.btn, flat='normal')
  1282. self.enter['state'] = 'normal'
  1283. self.where_enter['state'] = 'normal'
  1284. all_program = [WelcomeProgram, CreateNormalUserProgram, CreateManagerUserProgram, CreateAutoNormalUserProgram,
  1285. CreateGarbageProgram, DeleteUserProgram, DeleteUsersProgram, DeleteGarbageProgram,
  1286. DeleteGarbageMoreProgram, DeleteAllGarbageProgram, SearchUserProgram, SearchUserAdvancedProgram,
  1287. SearchGarbageProgram, SearchGarbageAdvancedProgram, SearchAdvancedProgram, UpdateUserScoreBase,
  1288. UpdateUserReputationBase, UpdateGarbageTypeProgram, UpdateGarbageCheckResultProgram,
  1289. ExportGarbageProgram, ExportUserProgram, CreateUserFromCSVProgram]