admin.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. import abc
  2. import tkinter as tk
  3. from tkinter import messagebox as msg
  4. from tkinter import ttk
  5. import conf
  6. from core.garbage import GarbageBag
  7. from core.user import User
  8. from equipment.scan_garbage import write_gid_qr
  9. from equipment.scan_user import write_uid_qr, write_all_uid_qr
  10. from event import TkEventMain
  11. from sql.db import DB, search_from_garbage_checker_user
  12. from sql.garbage import (creat_new_garbage, search_from_garbage_view,
  13. del_garbage, del_garbage_not_use, del_garbage_wait_check, del_garbage_has_check,
  14. del_garbage_where_scan_not_use, del_garbage_where_scan_wait_check,
  15. del_garbage_where_scan_has_check,
  16. del_garbage_where_not_use, del_garbage_where_wait_check, del_garbage_where_has_check,
  17. del_garbage_not_use_many, del_all_garbage, del_all_garbage_scan)
  18. from sql.user import (creat_new_user, del_user, del_user_from_where, del_user_from_where_scan,
  19. search_user_by_fields, search_from_user_view)
  20. from tool.tk import make_font
  21. from tool.type_ import *
  22. class AdminStationException(Exception):
  23. ...
  24. class CreatGarbageError(AdminStationException):
  25. ...
  26. class CreatUserError(AdminStationException):
  27. ...
  28. class AdminStationBase(TkEventMain, metaclass=abc.ABCMeta):
  29. def __init__(self, db: DB):
  30. self._admin: Optional[User] = None
  31. self._db = db
  32. super(AdminStationBase, self).__init__()
  33. def get_db(self):
  34. return self._db
  35. def creat_garbage(self, path: Optional[str], num: int = 1) -> List[tuple[str, Optional[GarbageBag]]]:
  36. re = []
  37. for _ in range(num):
  38. gar = creat_new_garbage(self._db)
  39. if gar is None:
  40. raise CreatGarbageError
  41. if path is not None:
  42. res = write_gid_qr(gar.get_gid(), path, self._db)
  43. re.append(res)
  44. else:
  45. re.append(("", gar))
  46. return re
  47. def creat_user(self, name: uname_t, passwd: passwd_t, phone: str, manager: bool) -> Optional[User]:
  48. return creat_new_user(name, passwd, phone, manager, self._db)
  49. def creat_user_from_list(self, user_list: List[Tuple[uname_t, passwd_t, str]], manager: bool) -> List[User]:
  50. re = []
  51. for i in user_list:
  52. user = creat_new_user(i[0], i[1], i[2], manager, self._db)
  53. if user is None:
  54. raise CreatUserError
  55. re.append(user)
  56. return re
  57. def get_gid_qrcode(self, gid: gid_t, path: str) -> Tuple[str, Optional[GarbageBag]]:
  58. return write_gid_qr(gid, path, self._db)
  59. def get_all_gid_qrcode(self, path: str, where: str = "") -> List[str]:
  60. return write_all_uid_qr(path, self._db, where=where)
  61. def get_uid_qrcode(self, uid: uid_t, path: str) -> Tuple[str, Optional[User]]:
  62. return write_uid_qr(uid, path, self._db)
  63. def get_all_uid_qrcode(self, path: str, where: str = "") -> List[str]:
  64. return write_all_uid_qr(path, self._db, where=where)
  65. def del_garbage_not_use(self, gid: gid_t) -> bool:
  66. return del_garbage_not_use(gid, self._db)
  67. def del_garbage_wait_check(self, gid: gid_t) -> bool:
  68. return del_garbage_wait_check(gid, self._db)
  69. def del_garbage_has_check(self, gid: gid_t) -> bool:
  70. return del_garbage_has_check(gid, self._db)
  71. def del_garbage(self, gid: gid_t) -> bool:
  72. return del_garbage(gid, self._db)
  73. def del_garbage_where_not_use(self, where) -> int:
  74. return del_garbage_where_not_use(where, self._db)
  75. def del_garbage_where_wait_check(self, where) -> int:
  76. return del_garbage_where_wait_check(where, self._db)
  77. def del_garbage_where_has_check(self, where) -> int:
  78. return del_garbage_where_has_check(where, self._db)
  79. def del_garbage_where_scan_not_use(self, where) -> int:
  80. return del_garbage_where_scan_not_use(where, self._db)
  81. def del_garbage_where_scan_wait_check(self, where) -> int:
  82. return del_garbage_where_scan_wait_check(where, self._db)
  83. def del_garbage_where_scan_has_check(self, where) -> int:
  84. return del_garbage_where_scan_has_check(where, self._db)
  85. def del_all_garbage_scan(self) -> int:
  86. return del_all_garbage_scan(self._db)
  87. def del_all_garbage(self) -> int:
  88. return del_all_garbage(self._db)
  89. def del_garbage_many(self, from_: gid_t, to_: gid_t) -> int:
  90. return del_garbage_not_use_many(from_, to_, self._db)
  91. def del_user(self, uid: uid_t) -> bool:
  92. return del_user(uid, self._db)
  93. def del_user_from_where_scan(self, where: str) -> int:
  94. return del_user_from_where_scan(where, self._db)
  95. def del_user_from_where(self, where: str) -> int:
  96. return del_user_from_where(where, self._db)
  97. def search_user(self, columns, uid, name, phone):
  98. return search_user_by_fields(columns, uid, name, phone, self._db)
  99. def search_user_advanced(self, columns, sql):
  100. return search_from_user_view(columns, sql, self._db)
  101. def search_garbage_advanced(self, columns, sql):
  102. return search_from_garbage_view(columns, sql, self._db)
  103. def search_advanced(self, columns, sql):
  104. return search_from_garbage_checker_user(columns, sql, self._db)
  105. @abc.abstractmethod
  106. def login_call(self):
  107. ...
  108. def login(self, user: User) -> bool:
  109. if user is not None and user.is_manager():
  110. self._admin = user
  111. return True
  112. else:
  113. return False
  114. def logout(self):
  115. self._admin = None
  116. @abc.abstractmethod
  117. def show_loading(self, title: str):
  118. ...
  119. @abc.abstractmethod
  120. def stop_loading(self):
  121. ...
  122. @abc.abstractmethod
  123. def set_after_run(self, ms, func, *args):
  124. ...
  125. @abc.abstractmethod
  126. def to_menu(self, name: str = "Main"):
  127. ...
  128. @abc.abstractmethod
  129. def to_program(self, name: str = "Welcome"):
  130. ...
  131. @abc.abstractmethod
  132. def show_msg(self, title, info, msg_type='info'):
  133. ...
  134. @abc.abstractmethod
  135. def hide_msg(self):
  136. ...
  137. import admin_program as tk_program
  138. import admin_menu as tk_menu
  139. import admin_event as tk_event
  140. class AdminStation(AdminStationBase):
  141. def set_after_run(self, ms, func, *args): # super.__init__可能会调用
  142. self.init_after_run_list.append((ms, func, args))
  143. def __conf_set_after_run(self):
  144. for ms, func, args in self.init_after_run_list:
  145. self._window.after(ms, func, *args)
  146. def set_after_run_now(self, ms, func, *args):
  147. self._window.after(ms, func, *args)
  148. def __init__(self, db: DB, refresh_delay: int = conf.tk_refresh_delay):
  149. self.init_after_run_list: List[Tuple[int, Callable, Tuple]] = []
  150. super().__init__(db)
  151. self.refresh_delay = refresh_delay
  152. self._window = tk.Tk()
  153. self.login_window = None
  154. self._sys_height = self._window.winfo_screenheight()
  155. self._sys_width = self._window.winfo_screenwidth()
  156. self._win_height = int(self._sys_height * (2 / 3))
  157. self._win_width = int(self._sys_width * (2 / 3))
  158. self.__conf_windows()
  159. self._full_screen = False
  160. self._is_loading = False
  161. self._disable_all_btn = False
  162. self._menu_now: Optional[Tuple[str, tk.Frame, tk_menu.AdminMenu]] = None
  163. self._program_now: Optional[Tuple[str, tk.Frame, tk_program.AdminProgram]] = None
  164. self.__conf_font_size()
  165. self.__conf_create_tk()
  166. self.__conf_create_menu()
  167. self.__conf_create_program()
  168. self.__conf_tk()
  169. # self.__show_login_window()
  170. self.__conf_set_after_run()
  171. def __conf_windows(self):
  172. self._window.title('HGSSystem: Manage Station')
  173. self._window.geometry(f'{self._win_width}x{self._win_height}')
  174. self._window['bg'] = "#F0FFF0"
  175. self._window.resizable(False, False)
  176. self._window.protocol("WM_DELETE_WINDOW", lambda: self.main_exit())
  177. def __conf_create_tk(self):
  178. self._menu_back = tk.Frame(self._window)
  179. self._menu_line = tk.Label(self._menu_back) # 下划线
  180. self._menu_title: Tuple[tk.Label, tk.Variable] = tk.Label(self._menu_back), tk.StringVar()
  181. self._menu_dict: Dict[str, tk_menu.AdminMenu] = {}
  182. self._menu_list: List[str] = [] # 菜单回溯
  183. self._program_back = tk.Frame(self._window)
  184. self._program_title: Tuple[tk.Label, tk.Variable] = tk.Label(self._program_back), tk.StringVar()
  185. self._program_dict: Dict[str, tk_program.AdminProgram] = {}
  186. self._win_ctrl_button: List[tk.Button, tk.Button, tk.Button] = [tk.Button(self._menu_back),
  187. tk.Button(self._menu_back),
  188. tk.Button(self._window),
  189. tk.Button(self._window),
  190. tk.Button(self._window)]
  191. self._msg_frame = tk.Frame(self._window)
  192. self._msg_label = tk.Label(self._msg_frame), tk.Label(self._msg_frame), tk.StringVar(), tk.StringVar()
  193. self._msg_hide = tk.Button(self._msg_frame)
  194. self._loading_pro = ttk.Progressbar(self._window)
  195. def __conf_font_size(self, n: int = 1):
  196. self._login_title_font_size = int(12 * n)
  197. self._login_btn_font_size = int(11 * n)
  198. self._win_ctrl_font_size = int(15 * n)
  199. self._menu_title_font_size = int(17 * n)
  200. self._program_title_font_size = int(14 * n)
  201. self._msg_font_size = int(20 * n)
  202. def __conf_tk(self, n: int = 1):
  203. self.__conf_win_ctrl_button()
  204. self.__conf_menu_title()
  205. self.__conf_menu(n)
  206. self.__conf_program_title()
  207. self.__conf_program(n)
  208. self.__conf_loading()
  209. self.__conf_msg()
  210. self.to_menu() # 显示主页面
  211. self.to_program()
  212. def __conf_win_ctrl_button(self):
  213. title_font = make_font(size=self._win_ctrl_font_size)
  214. title_font_bold = make_font(size=self._win_ctrl_font_size, weight="bold")
  215. for bt in self._win_ctrl_button:
  216. bt: tk.Button
  217. bt['bg'] = conf.tk_btn_bg
  218. bt['font'] = title_font
  219. bt_main: tk.Button = self._win_ctrl_button[1]
  220. bt_main['text'] = 'Main'
  221. bt_main['font'] = title_font_bold
  222. bt_main['command'] = lambda: self.__to_main_menu()
  223. bt_main.place(relx=0.02, rely=0.86, relwidth=0.96, relheight=0.06)
  224. bt_back: tk.Button = self._win_ctrl_button[0]
  225. bt_back['text'] = 'back'
  226. bt_back['font'] = title_font_bold
  227. bt_back['state'] = 'disable'
  228. bt_back['command'] = lambda: self.__to_back_menu()
  229. bt_back.place(relx=0.02, rely=0.93, relwidth=0.96, relheight=0.06)
  230. rely = 0.02
  231. bt_help: tk.Button = self._win_ctrl_button[2]
  232. bt_help['text'] = 'Help'
  233. bt_help.place(relx=0.81, rely=rely, relwidth=0.05, relheight=0.05)
  234. bt_about: tk.Button = self._win_ctrl_button[3]
  235. bt_about['text'] = 'About'
  236. bt_about.place(relx=0.87, rely=rely, relwidth=0.05, relheight=0.05)
  237. bt_exit: tk.Button = self._win_ctrl_button[4]
  238. bt_exit['text'] = 'Exit'
  239. bt_exit['command'] = lambda: self.main_exit()
  240. bt_exit.place(relx=0.93, rely=rely, relwidth=0.05, relheight=0.05)
  241. def set_ctrl_back_button(self):
  242. if len(self._menu_list) <= 1:
  243. self._win_ctrl_button[0]['state'] = 'disable'
  244. else:
  245. self._win_ctrl_button[0]['state'] = 'normal'
  246. def __to_main_menu(self):
  247. self._menu_list = []
  248. self.to_menu()
  249. self.to_program()
  250. def __to_back_menu(self):
  251. assert len(self._menu_list) > 1
  252. self._menu_list.pop() # 弹出最后一个元素
  253. self.to_menu(self._menu_list.pop()) # 再弹出一个元素
  254. def __conf_create_menu(self):
  255. frame_list = []
  256. for i in tk_menu.all_menu:
  257. frame_list.append(i(self, self._menu_back, conf.tk_win_bg))
  258. for i in frame_list:
  259. name, _ = i.get_menu_frame()
  260. self._menu_dict[name] = i
  261. def __conf_menu(self, n: int = 1):
  262. for i in self._menu_dict:
  263. menu = self._menu_dict[i]
  264. menu.conf_gui(conf.tk_btn_bg, n)
  265. def __conf_menu_title(self):
  266. self._menu_back['bg'] = conf.tk_win_bg
  267. self._menu_back['bd'] = 5
  268. self._menu_back['relief'] = "ridge"
  269. title_font = make_font(size=self._menu_title_font_size, weight="bold")
  270. self._menu_title[0]['bg'] = conf.tk_win_bg
  271. self._menu_title[0]['font'] = title_font
  272. self._menu_title[0]['textvariable'] = self._menu_title[1]
  273. self._menu_line['bg'] = '#000000'
  274. # 不立即显示
  275. def to_menu(self, name: str = "Main"):
  276. if self._menu_now is not None:
  277. self._menu_now[1].place_forget()
  278. menu = self._menu_dict.get(name)
  279. if menu is None:
  280. self.show_msg("Menu not found", f"System can not found menu:\n {name}")
  281. return
  282. name, frame = menu.get_menu_frame()
  283. self._menu_title[1].set(name)
  284. self._menu_back.place(relx=0.02, rely=0.02, relwidth=0.20, relheight=0.96)
  285. self._menu_line.place(relx=0.06, rely=0.065, relwidth=0.88, height=1) # 一个像素的高度即可
  286. self._menu_title[0].place(relx=0.02, rely=0.02, relwidth=0.96, relheight=0.03)
  287. frame.place(relx=0.02, rely=0.07, relwidth=0.96, relheight=0.79)
  288. self._menu_list.append(name)
  289. self._menu_now = name, frame, menu
  290. self.set_ctrl_back_button()
  291. def __conf_program_title(self):
  292. self._program_back['bg'] = conf.tk_win_bg
  293. self._program_back['relief'] = "ridge"
  294. self._program_back['bd'] = 5
  295. title_font = make_font(size=self._program_title_font_size, weight="bold")
  296. self._program_title[0]['bg'] = '#2468a2'
  297. self._program_title[0]['fg'] = "#F0F8FF"
  298. self._program_title[0]['font'] = title_font
  299. self._program_title[0]['anchor'] = 'w'
  300. self._program_title[0]['textvariable'] = self._program_title[1]
  301. # 不立即显示
  302. def __conf_create_program(self):
  303. program_list = []
  304. for i in tk_program.all_program:
  305. program_list.append(i(self, self._program_back, conf.tk_win_bg))
  306. for i in program_list:
  307. name, _ = i.get_program_frame()
  308. self._program_dict[name] = i
  309. def __conf_program(self, n: int = 1):
  310. for i in self._program_dict:
  311. program = self._program_dict[i]
  312. program.conf_gui(n)
  313. def to_program(self, name: str = "Welcome"):
  314. if self._program_now is not None:
  315. self._program_now[1].place_forget()
  316. program = self._program_dict.get(name)
  317. if program is None:
  318. self.show_msg("Program not found", f"System can not found program:\n {name}")
  319. return
  320. name, frame = program.get_program_frame()
  321. self.__show_program()
  322. self._program_title[1].set(f' {name}')
  323. self._program_title[0].place(relx=0.00, rely=0.00, relwidth=1, relheight=0.05)
  324. frame.place(relx=0.02, rely=0.12, relwidth=0.96, relheight=0.86)
  325. self._program_now = name, frame, program
  326. def __show_program(self):
  327. self._program_back.place(relx=0.26, rely=0.1, relwidth=0.68, relheight=0.84)
  328. def __hide_program(self):
  329. self._program_back.place_forget()
  330. def __conf_loading(self):
  331. self._loading_pro['mode'] = 'indeterminate'
  332. self._loading_pro['orient'] = 'horizontal'
  333. self._loading_pro['maximum'] = 50
  334. def show_loading(self, _):
  335. self._is_loading = True
  336. self.set_all_btn_disable()
  337. self._loading_pro['value'] = 0
  338. self._loading_pro.place(relx=0.30, rely=0.035, relwidth=0.48, relheight=0.03)
  339. self._loading_pro.start(50)
  340. def stop_loading(self):
  341. self._is_loading = False
  342. self._loading_pro.place_forget()
  343. self._loading_pro.stop()
  344. self.set_reset_all_btn()
  345. def __conf_msg(self):
  346. title_font = make_font(size=self._msg_font_size + 1, weight="bold")
  347. info_font = make_font(size=self._msg_font_size - 1)
  348. self._msg_frame['bg'] = conf.tk_win_bg
  349. self._msg_frame['bd'] = 5
  350. self._msg_frame['relief'] = "ridge"
  351. # frame 不会立即显示
  352. self._msg_label[0]['font'] = title_font
  353. self._msg_label[0]['bg'] = conf.tk_win_bg
  354. self._msg_label[0]['anchor'] = 'w'
  355. self._msg_label[0]['textvariable'] = self._msg_label[2]
  356. self._msg_label[1]['font'] = info_font
  357. self._msg_label[1]['bg'] = conf.tk_win_bg
  358. self._msg_label[1]['anchor'] = 'nw'
  359. self._msg_label[1]['textvariable'] = self._msg_label[3]
  360. self._msg_label[1]['justify'] = 'left'
  361. self._msg_label[0].place(relx=0.05, rely=0.05, relwidth=0.9, relheight=0.1)
  362. self._msg_label[1].place(relx=0.075, rely=0.2, relwidth=0.85, relheight=0.58)
  363. self._msg_hide['font'] = info_font
  364. self._msg_hide['text'] = 'close'
  365. self._msg_hide['bg'] = conf.tk_btn_bg
  366. self._msg_hide['command'] = lambda: self.hide_msg()
  367. self._msg_hide.place(relx=0.375, rely=0.80, relwidth=0.25, relheight=0.13)
  368. def show_msg(self, title, info, msg_type='info'):
  369. assert not self._is_loading # loading 时不显示msg
  370. self.set_all_btn_disable()
  371. self._msg_label[2].set(f'{msg_type}: {title}')
  372. self._msg_label[3].set(f'{info}')
  373. frame_width = self._win_width * 0.50
  374. self._msg_label[1]['wraplength'] = frame_width * 0.85 - 5 # 设定自动换行的像素
  375. self._msg_frame.place(relx=0.30, rely=0.25, relwidth=0.55, relheight=0.50)
  376. # 不隐藏元素, 隐藏后界面会显得单调
  377. def hide_msg(self):
  378. self.set_reset_all_btn()
  379. self._msg_frame.place_forget()
  380. def set_all_btn_disable(self):
  381. for btn in self._win_ctrl_button[:-1]: # Exit 不设置disable
  382. btn['state'] = 'disable'
  383. if self._menu_list != 0:
  384. menu = self._menu_dict.get(self._menu_list[-1], None)
  385. assert menu is not None
  386. menu.set_disable()
  387. if self._program_now is not None:
  388. self._program_now[2].set_disable()
  389. def set_reset_all_btn(self):
  390. for btn in self._win_ctrl_button[:-1]:
  391. btn['state'] = 'normal'
  392. self.set_ctrl_back_button()
  393. if self._menu_list != 0:
  394. menu = self._menu_dict.get(self._menu_list[-1], None)
  395. assert menu is not None
  396. menu.reset_disable()
  397. if self._program_now is not None:
  398. self._program_now[2].reset_disable()
  399. def __show_login_window(self):
  400. self.login_window: Optional[tk.Toplevel] = tk.Toplevel()
  401. self.login_window.title("HGSSystem Login")
  402. height = int(self._sys_height * (1 / 6))
  403. width = int(height * 2)
  404. if width > self._sys_width:
  405. width = int(self._sys_width * (2 / 3))
  406. height = int(width / 2)
  407. self.login_window.geometry(f'{width}x{height}')
  408. self.login_window['bg'] = "#d1d9e0"
  409. self.login_window.resizable(False, False)
  410. self.login_window.protocol("WM_DELETE_WINDOW", lambda: self.login_exit())
  411. self._login_name = [tk.Label(self.login_window), tk.Entry(self.login_window), tk.StringVar()]
  412. self._login_passwd = [tk.Label(self.login_window), tk.Entry(self.login_window), tk.StringVar()]
  413. self._login_btn = [tk.Button(self.login_window), tk.Button(self.login_window)]
  414. self.__conf_login_window()
  415. self.hide_main()
  416. def __conf_login_window(self):
  417. title_font = make_font(size=self._login_title_font_size, weight="bold")
  418. btn_font = make_font(size=self._login_btn_font_size, weight="bold")
  419. for lb, text in zip([self._login_name[0], self._login_passwd[0]], ["User:", "Passwd:"]):
  420. lb['bg'] = "#d1d9e0" # 蜜瓜绿
  421. lb['font'] = title_font
  422. lb['text'] = text
  423. lb['anchor'] = 'e'
  424. for lb, var in zip([self._login_name[1], self._login_passwd[1]], [self._login_name[2], self._login_passwd[2]]):
  425. lb['font'] = title_font
  426. lb['textvariable'] = var
  427. self._login_name[0].place(relx=0.00, rely=0.20, relwidth=0.35, relheight=0.15)
  428. self._login_passwd[0].place(relx=0.00, rely=0.40, relwidth=0.35, relheight=0.15)
  429. self._login_name[1].place(relx=0.40, rely=0.20, relwidth=0.45, relheight=0.15)
  430. self._login_passwd[1]['show'] = "*"
  431. self._login_passwd[1].place(relx=0.40, rely=0.40, relwidth=0.45, relheight=0.15)
  432. self._login_btn[0]['bg'] = "#a1afc9"
  433. self._login_btn[0]['font'] = btn_font
  434. self._login_btn[0]['text'] = 'Login'
  435. self._login_btn[0]['command'] = lambda: self.login_call()
  436. self._login_btn[0].place(relx=0.50, rely=0.70, relwidth=0.16, relheight=0.15)
  437. self._login_btn[1]['bg'] = "#a1afc9"
  438. self._login_btn[1]['font'] = btn_font
  439. self._login_btn[1]['text'] = 'Exit'
  440. self._login_btn[1]['command'] = lambda: self.login_exit()
  441. self._login_btn[1].place(relx=0.70, rely=0.70, relwidth=0.16, relheight=0.15)
  442. def login_call(self):
  443. event = tk_event.LoginEvent(self).start(self._login_name[2].get(), self._login_passwd[2].get())
  444. self.push_event(event)
  445. def login(self, user: User):
  446. if super(AdminStation, self).login(user):
  447. self.login_window.destroy()
  448. self.login_window = None
  449. self.show_main()
  450. else:
  451. msg.showerror("Login error", "Please, try again")
  452. self._login_name[2].set('')
  453. self._login_passwd[2].set('')
  454. def logout(self):
  455. super(AdminStation, self).logout()
  456. self.__show_login_window()
  457. def login_exit(self):
  458. if not msg.askokcancel('Sure?', 'Exit manager system.'):
  459. return
  460. if self.login_window is not None:
  461. self.login_window.destroy()
  462. self.exit_win()
  463. def main_exit(self):
  464. if not msg.askokcancel('Sure?', 'Exit manager system.'):
  465. return
  466. self.exit_win()
  467. def hide_main(self):
  468. self._window.withdraw()
  469. def show_main(self):
  470. self._window.update()
  471. self._window.deiconify()
  472. def mainloop(self):
  473. self._window.mainloop()
  474. def exit_win(self):
  475. self._window.destroy()
  476. if __name__ == '__main__':
  477. mysql_db = DB()
  478. station_ = AdminStation(mysql_db)
  479. station_.mainloop()