app.py 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826
  1. from tkinter import *
  2. from tkinter.ttk import Combobox
  3. from tkinter.scrolledtext import ScrolledText
  4. import tkinter.messagebox
  5. import sys
  6. import time
  7. import user
  8. import var
  9. import batch
  10. import param
  11. import production
  12. import inquire
  13. import user_socket
  14. import pro
  15. import user_openOpc
  16. import ezcad
  17. opc_value = var.opc_var()
  18. init_window = Tk() #实例化出一个父窗口
  19. user_var = var.Var_value(init_window)
  20. font_size_title = 14
  21. font_size_text = 11
  22. # 创建新线程
  23. thread_tcp = user_socket.socket_server(1, "Thread-tcp", 1)
  24. thread_work = pro.work_server(2, "Thread-work", 2)
  25. thread_opc = user_openOpc.opc_server(3, "Thread-opc", 3)
  26. thread_ezcad = ezcad.ezcad(4, "Thread-ezcad", 4)
  27. class my_gui(Frame):
  28. def __init__(self, init_window_name):
  29. global user_var
  30. self.init_window_name = init_window_name
  31. self.user_var = user_var
  32. self.opc_value = opc_value
  33. self.tcpserverParam = user_socket.tcpserverParam
  34. self.screen_width = self.user_var.screen_width
  35. self.screen_height = self.user_var.screen_height
  36. self.font_size_title = font_size_title
  37. self.font_size_text = font_size_text
  38. self.bee_stat_change_timeout = 0
  39. self.main_gui_init()
  40. self.title_canvas_init()
  41. self.button_canvas_init()
  42. self.order_frame_init()
  43. self.user_var.windows_idx = 'app'
  44. self.fun_timer()
  45. self.log_view_stat = False
  46. def team_sel_value(self):
  47. self.team_combobox.current(self.user_var.team_sel)
  48. def team_combobox_sel(self, *args):
  49. value = self.team_combobox.get()
  50. stat = tkinter.messagebox.askokcancel(title='提示', message='班组确认切换为{}'.format(value))
  51. if stat == True:
  52. for i in range(len(self.user_var.team_list)):
  53. if self.user_var.team_list[i] == value:
  54. self.user_var.team_sel = i
  55. self.user_var.team_value = value
  56. self.user_var.team = chr(self.user_var.team_sel + ord('A'))
  57. self.user_var.order_update_stat = True
  58. break
  59. self.team_sel_value()
  60. # def check_radiobutton_sel(self):
  61. # print(self.check_bit.get())
  62. def log_view_event(self, *args):
  63. if self.log_view_stat == True:
  64. self.log_view_stat = False
  65. self.loglabel.place_forget()
  66. else:
  67. self.log_view_stat = True
  68. self.loglabel.place(x=self.user_button.winfo_reqwidth() * 7, y=5)
  69. self.user_var.log_str.set("log view")
  70. def user_button_event(self):
  71. print("Please enter your username and password!")
  72. self.user_var.last_windows_idx = 'app'
  73. self.init_window_name.after_cancel(self.task_user)
  74. self.main_frame.destroy()
  75. user.my_reg(self.init_window_name)
  76. def param_button_event(self):
  77. if self.user_var.auth_stat == True:
  78. print("Enter Param Set!")
  79. self.user_var.last_windows_idx = 'app'
  80. self.init_window_name.after_cancel(self.task_user)
  81. self.main_frame.destroy()
  82. param.my_param(self.init_window_name)
  83. else:
  84. tkinter.messagebox.showwarning(title='提示', message='请登录后操作!')
  85. def data_button_event(self):
  86. print("Enter Data View!")
  87. self.user_var.last_windows_idx = 'app'
  88. self.init_window_name.after_cancel(self.task_user)
  89. self.main_frame.destroy()
  90. inquire.my_inquire(self.init_window_name)
  91. def print_button_event(self):
  92. print("Enter Print!")
  93. self.user_var.last_windows_idx = 'app'
  94. def produce_sel_button_event(self):
  95. if self.user_var.auth_stat == True:
  96. print("Please Select Production!")
  97. self.user_var.last_windows_idx = 'app'
  98. self.init_window_name.after_cancel(self.task_user)
  99. self.main_frame.destroy()
  100. production.my_production(self.init_window_name)
  101. else:
  102. tkinter.messagebox.showwarning(title='提示', message='请登录后操作!')
  103. def bee_button_event(self):
  104. if self.user_var.bee_stat == False:
  105. self.user_var.bee_stat = True
  106. self.bee_button.configure(relief=RAISED)
  107. self.bee_button.configure(state="disabled")
  108. self.bee_stat_change_timeout = 10
  109. self.opc_value.set_Bee(True)
  110. else:
  111. self.user_var.bee_stat = False
  112. self.bee_button.configure(relief=SUNKEN)
  113. self.bee_button.configure(state="disabled")
  114. self.bee_stat_change_timeout = 10
  115. self.opc_value.set_Bee(False)
  116. def workstatlabel_value(self):
  117. if self.user_var.airdata_work_stat == 'working':
  118. self.workstatlabel.config(text=" 系统正在运行中...")
  119. else:
  120. self.workstatlabel.config(text=" 系统停止中...")
  121. def productstatlabel_value(self):
  122. if self.user_var.product_name_noset == '品番已设置':
  123. self.productstatlabel.config(fg='black')
  124. self.productstatlabel.config(text=self.user_var.product_name_noset)
  125. else:
  126. self.productstatlabel.config(fg='Red')
  127. self.productstatlabel.config(text=self.user_var.product_name_noset)
  128. def opcstatlabel_value(self):
  129. if self.user_var.opc_conn_stat == "PLC已连接":
  130. self.opcstatlabel.config(fg="Green")
  131. elif self.user_var.opc_conn_stat == "PLC未连接":
  132. self.opcstatlabel.config(fg="Yellow")
  133. else:
  134. self.opcstatlabel.config(fg="Red")
  135. self.opcstatlabel.config(text=self.user_var.opc_conn_stat)
  136. def socketstatlabel_value(self):
  137. if self.user_var.socket_conn_stat == True:
  138. self.socketstatlabel.config(text="打标机已连接")
  139. self.socketstatlabel.config(fg="Green")
  140. else:
  141. self.socketstatlabel.config(text="打标机未连接")
  142. self.socketstatlabel.config(fg="Red")
  143. def authstatlabel_value(self):
  144. if self.user_var.auth_stat == False:
  145. self.authlabel.config(text="不允许", fg='red')
  146. # self.team_combobox.configure(state="disabled")
  147. self.param_button.configure(state="disabled")
  148. self.print_button.configure(state="disabled")
  149. self.product_sel_button.configure(state="disabled")
  150. else:
  151. self.authlabel.config(text="允许", fg='green')
  152. # self.team_combobox.configure(state="readonly")
  153. self.param_button.configure(state="normal")
  154. self.print_button.configure(state="normal")
  155. self.product_sel_button.configure(state="normal")
  156. def airtightdev_value(self):
  157. if self.user_var.originchkok_stat == True:
  158. self.originchkoklabel.config(bg='Lime')
  159. else:
  160. self.originchkoklabel.config(bg='DarkGray')
  161. if self.user_var.upairtightok_stat == True:
  162. self.upairtightoklabel.config(bg='Lime')
  163. else:
  164. self.upairtightoklabel.config(bg='DarkGray')
  165. if self.user_var.upairtightng_stat == True:
  166. self.upairtightnglabel.config(bg='Lime')
  167. else:
  168. self.upairtightnglabel.config(bg='DarkGray')
  169. if self.user_var.upprintok_stat == True:
  170. self.upprintoklabel.config(bg='Lime')
  171. else:
  172. self.upprintoklabel.config(bg='DarkGray')
  173. if self.user_var.origindir_stat == True:
  174. self.origindirlabel.config(bg='Lime')
  175. else:
  176. self.origindirlabel.config(bg='DarkGray')
  177. if self.user_var.downairtightok_stat == True:
  178. self.downairtightoklabel.config(bg='Lime')
  179. else:
  180. self.downairtightoklabel.config(bg='DarkGray')
  181. if self.user_var.downairtightng_stat == True:
  182. self.downairtightnglabel.config(bg='Lime')
  183. else:
  184. self.downairtightnglabel.config(bg='DarkGray')
  185. if self.user_var.downprintok_stat == True:
  186. self.downprintoklabel.config(bg='Lime')
  187. else:
  188. self.downprintoklabel.config(bg='DarkGray')
  189. def motordev_value(self):
  190. if self.user_var.motororiginok_stat == True:
  191. self.motororiginoklabel.config(bg='Lime')
  192. else:
  193. self.motororiginoklabel.config(bg='DarkGray')
  194. if self.user_var.motoronup_stat == True:
  195. self.motoronuplabel.config(bg='Lime')
  196. else:
  197. self.motoronuplabel.config(bg='DarkGray')
  198. if self.user_var.motorondown_stat == True:
  199. self.motorondownlabel.config(bg='Lime')
  200. else:
  201. self.motorondownlabel.config(bg='DarkGray')
  202. if self.user_var.motorunuse_stat == True:
  203. self.motorunuselabel.config(bg='Lime')
  204. else:
  205. self.motorunuselabel.config(bg='DarkGray')
  206. def station_value(self):
  207. if self.user_var.upgages_stat == True:
  208. self.upgageslabel.config(bg='black', fg='white')
  209. else:
  210. self.upgageslabel.config(fg='black', bg='white')
  211. if self.user_var.upworks_stat == True:
  212. self.upworkslabel.config(bg='black', fg='white')
  213. else:
  214. self.upworkslabel.config(fg='black', bg='white')
  215. if self.user_var.upmpen_stat == True:
  216. self.upmpenlabel.config(bg='black', fg='white')
  217. else:
  218. self.upmpenlabel.config(fg='black', bg='white')
  219. if self.user_var.upconnect_stat == True:
  220. self.upconnectlabel.config(bg='black', fg='white')
  221. else:
  222. self.upconnectlabel.config(fg='black', bg='white')
  223. if self.user_var.downgages_stat == True:
  224. self.downgageslabel.config(bg='black', fg='white')
  225. else:
  226. self.downgageslabel.config(fg='black', bg='white')
  227. if self.user_var.downworks_stat == True:
  228. self.downworkslabel.config(bg='black', fg='white')
  229. else:
  230. self.downworkslabel.config(fg='black', bg='white')
  231. if self.user_var.downmpen_stat == True:
  232. self.downmpenlabel.config(bg='black', fg='white')
  233. else:
  234. self.downmpenlabel.config(fg='black', bg='white')
  235. if self.user_var.downconnect_stat == True:
  236. self.downconnectlabel.config(bg='black', fg='white')
  237. else:
  238. self.downconnectlabel.config(fg='black', bg='white')
  239. def bee_value(self):
  240. if self.bee_stat_change_timeout == 0:
  241. if self.user_var.bee_stat == True:
  242. self.bee_button.configure(relief=RAISED)
  243. self.bee_button.configure(state="normal")
  244. else:
  245. self.bee_button.configure(relief=SUNKEN)
  246. self.bee_button.configure(state="normal")
  247. else:
  248. self.bee_stat_change_timeout = self.bee_stat_change_timeout - 1
  249. def auth_exit(self):
  250. if self.user_var.auth_timeout > 0:
  251. self.user_var.auth_timeout = self.user_var.auth_timeout - 1
  252. else:
  253. self.user_var.auth_stat = False
  254. def windows_update(self):
  255. currentTime = time.strftime('%Y/%m/%d %H:%M:%S', time.localtime(time.time()))
  256. self.timelabel.config(text=currentTime)
  257. self.workstatlabel_value()
  258. self.productstatlabel_value()
  259. self.opcstatlabel_value()
  260. self.socketstatlabel_value()
  261. self.authstatlabel_value()
  262. self.airtightdev_value()
  263. self.motordev_value()
  264. self.station_value()
  265. self.bee_value()
  266. self.team_sel_value()
  267. self.auth_exit()
  268. self.init_window_name.update()
  269. self.fun_timer()
  270. def fun_timer(self):
  271. self.task_user=self.init_window_name.after(1000, self.windows_update)
  272. def main_gui_init(self):
  273. self.main_frame = Frame(self.init_window_name, width=self.screen_width, height=self.screen_height)
  274. self.main_frame.pack()
  275. # 标题栏
  276. def title_canvas_init(self):
  277. self.title_canvas = Canvas(self.main_frame, width=self.screen_width - 20, height=35, bg='SeaGreen')
  278. self.mainlabel = Label(self.title_canvas, text="主页面", fg='yellow', font=("宋体", self.font_size_title),
  279. bg='SeaGreen', anchor='w')
  280. self.mainlabel.bind("<Double-Button-1>", func=self.log_view_event)
  281. self.mainlabel.place(x=20, y=5)
  282. self.timelabel = Label(self.title_canvas, text=time.strftime('%Y/%m/%d %H:%M:%S', time.localtime(time.time())),
  283. fg='yellow', font=("宋体", self.font_size_title), bg='SeaGreen', anchor='e')
  284. self.timelabel.place(x=self.title_canvas.winfo_reqwidth() - self.timelabel.winfo_reqwidth() - 20, y=5)
  285. self.title_canvas.create_line(self.mainlabel.winfo_reqwidth()/2+20, 32, self.title_canvas.winfo_reqwidth() -
  286. self.timelabel.winfo_reqwidth()/2 - 20, 32, fill='white')
  287. self.title_canvas.place(x=10, y=10)
  288. # 控制栏
  289. def button_canvas_init(self):
  290. self.button_canvas = Canvas(self.main_frame, width=self.screen_width - 20, height=40)
  291. self.user_button = Button(self.button_canvas, text="用户登陆", fg='white', bg='DeepSkyBlue', width=8,
  292. activebackground='white', activeforeground='DeepSkyBlue',
  293. font=("宋体", self.font_size_title, "bold"), command=self.user_button_event)
  294. self.user_button.place(x=1, y=0)
  295. self.param_button = Button(self.button_canvas, text="参数设定", fg='white', bg='DeepSkyBlue', width=8,
  296. activebackground='white', activeforeground='DeepSkyBlue', state="disabled",
  297. font=("宋体", self.font_size_title, "bold"), command=self.param_button_event)
  298. self.param_button.place(x=self.user_button.winfo_reqwidth()*2+3, y=0)
  299. self.data_button = Button(self.button_canvas, text="数据查询", fg='white', bg='DeepSkyBlue', width=8,
  300. activebackground='white', activeforeground='DeepSkyBlue',
  301. font=("宋体", self.font_size_title, "bold"), command=self.data_button_event)
  302. self.data_button.place(x=self.user_button.winfo_reqwidth() + 2, y=0)
  303. self.print_button = Button(self.button_canvas, text="手动刻印", fg='white', bg='DeepSkyBlue', width=8,
  304. activebackground='white', activeforeground='DeepSkyBlue',
  305. font=("宋体", self.font_size_title, "bold"), command=self.print_button_event)
  306. # self.print_button.place(x=self.user_button.winfo_reqwidth()*3 + 4, y=0)
  307. #日志显示
  308. self.loglabel = Label(self.button_canvas, fg='black', textvariable=self.user_var.log_str,
  309. font=("宋体", 8), anchor='w')
  310. #
  311. self.bee_button = Button(self.button_canvas, text="蜂鸣器关闭", fg='black', width=12,
  312. font=("宋体", self.font_size_text), command=self.bee_button_event)
  313. if self.user_var.bee_stat == True:
  314. self.bee_button.configure(relief=RAISED)
  315. else:
  316. self.bee_button.configure(relief=SUNKEN)
  317. self.bee_button.place(x=self.button_canvas.winfo_reqwidth() - self.bee_button.winfo_reqwidth()-5, y=5)
  318. self.button_canvas.place(x=10, y=self.screen_height - 60)
  319. # 工单栏
  320. def order_frame_init(self):
  321. self.order_frame = Frame(self.main_frame, width=self.screen_width - 20, relief=SUNKEN, borderwidth=2,
  322. height=self.screen_height - self.title_canvas.winfo_reqheight() - self.button_canvas.winfo_reqheight() - 35)
  323. # 工单栏展示
  324. self.order_frame.place(x=12, y=self.title_canvas.winfo_reqheight() + 15)
  325. # 产品信息
  326. self.product_frame = Frame(self.order_frame, width=self.order_frame.winfo_reqwidth() - 4, height=100,
  327. relief=SUNKEN, borderwidth=2)
  328. self.worklabel = Label(self.product_frame, text=" 状态信息 ", fg='black', font=("宋体", self.font_size_text), bg='PaleGreen', anchor='w')
  329. self.worklabel.place(x=1, y=1)
  330. # 系统当前状态
  331. self.workstatcanvas = Canvas(self.product_frame, bg='black', width=self.product_frame.winfo_reqwidth() - 8,
  332. height=25)
  333. self.workstatlabel = Label(self.workstatcanvas, fg='Gold', font=("宋体", self.font_size_text), bg='black',
  334. anchor='w')
  335. self.workstatlabel.place(x=2, y=5)
  336. self.productstatlabel = Label(self.workstatcanvas, fg='Red', font=("宋体", self.font_size_text), bg='black',
  337. anchor='w')
  338. self.productstatlabel.place(x=self.workstatcanvas.winfo_reqwidth() - 500, y=5)
  339. self.opcstatlabel = Label(self.workstatcanvas, fg='Red', font=("宋体", self.font_size_text), bg='black',
  340. anchor='w')
  341. self.opcstatlabel.place(x=self.workstatcanvas.winfo_reqwidth() - 250, y=5)
  342. self.socketstatlabel = Label(self.workstatcanvas, fg='Red', font=("宋体", self.font_size_text), bg='black',
  343. anchor='w')
  344. self.socketstatlabel.place(x=self.workstatcanvas.winfo_reqwidth() - 100, y=5)
  345. self.workstatcanvas.place(x=0, y=self.worklabel.winfo_reqheight() + 1)
  346. # 操作授权
  347. self.authstatframe = Frame(self.product_frame, bg='GreenYellow', width=150, height=30, relief=RAISED,
  348. borderwidth=2)
  349. self.authtitlelabel = Label(self.authstatframe, text="操作许可:", fg='black', font=("宋体", self.font_size_text),
  350. bg='GreenYellow',
  351. anchor='w')
  352. self.authtitlelabel.place(x=1, y=1)
  353. self.authlabel = Label(self.authstatframe, font=("宋体", self.font_size_text), width=6, bg='GreenYellow',
  354. anchor='w')
  355. self.authlabel.place(x=self.authtitlelabel.winfo_reqwidth(), y=1)
  356. # self.authstatlabel_value()
  357. self.authstatframe.config(height=self.authtitlelabel.winfo_reqheight()+8,
  358. width=self.authtitlelabel.winfo_reqwidth() + self.authlabel.winfo_reqwidth() + 4)
  359. self.authstatframe.place(x=1, y=self.worklabel.winfo_reqheight()+self.workstatcanvas.winfo_reqheight() + 4)
  360. # 产品编号
  361. self.product_sel_button = Button(self.product_frame, text="品番设定", fg='black', width=10,
  362. font=("宋体", self.font_size_text), command=self.produce_sel_button_event)
  363. self.product_sel_button.place(
  364. x=self.product_frame.winfo_reqwidth() - self.product_sel_button.winfo_reqwidth() - 8,
  365. y=self.worklabel.winfo_reqheight() + self.workstatcanvas.winfo_reqheight() + 4)
  366. self.productidxlabel = Label(self.product_frame, fg='Green', font=("宋体", self.font_size_title, "bold"),
  367. bg='black', width=2,
  368. height=1, anchor='center', textvariable=self.user_var.product_idx_str)
  369. self.productstrlabel = Label(self.product_frame, fg='white', font=("宋体", self.font_size_title, "bold"),
  370. bg='black', width=30,
  371. height=1, anchor='center', textvariable=self.user_var.product_str)
  372. self.productidxlabel.place(
  373. x=self.product_frame.winfo_reqwidth() - self.product_sel_button.winfo_reqwidth() - self.productstrlabel.winfo_reqwidth() - self.productidxlabel.winfo_reqwidth() - 12,
  374. y=self.worklabel.winfo_reqheight() + self.workstatcanvas.winfo_reqheight() + 4)
  375. self.productstrlabel.place(
  376. x=self.product_frame.winfo_reqwidth() - self.product_sel_button.winfo_reqwidth() - self.productstrlabel.winfo_reqwidth() - 10,
  377. y=self.worklabel.winfo_reqheight() + self.workstatcanvas.winfo_reqheight() + 4)
  378. self.productnamelabel = Label(self.product_frame, text="产品\r编号", font=("宋体", self.font_size_text - 1), width=4,
  379. justify='left')
  380. self.productnamelabel.place(
  381. x=self.product_frame.winfo_reqwidth() - self.product_sel_button.winfo_reqwidth() - self.productstrlabel.winfo_reqwidth() - self.productidxlabel.winfo_reqwidth() - self.productnamelabel.winfo_reqwidth() - 14,
  382. y=self.worklabel.winfo_reqheight() + self.workstatcanvas.winfo_reqheight() + 2)
  383. # 产品信息展示
  384. self.product_frame.config(
  385. height=self.worklabel.winfo_reqheight() + self.workstatcanvas.winfo_reqheight() + self.authstatframe.winfo_reqheight() + 10)
  386. self.product_frame.place(x=1, y=1)
  387. # 生产数据
  388. self.order_data_frame = Frame(
  389. self.order_frame, width=self.screen_width / 4,
  390. height=self.order_frame.winfo_reqheight() - self.product_frame.winfo_reqheight() - 15,
  391. relief=SUNKEN, borderwidth=2)
  392. # 生产数据展示
  393. self.order_data_frame.place(x=1, y=self.product_frame.winfo_reqheight() + 10)
  394. self.orderdatalabel_canvas = Canvas(self.order_data_frame, bg='DeepSkyBlue',
  395. width=self.order_data_frame.winfo_reqwidth() - 10, height=25)
  396. self.orderdatalabel = Label(self.orderdatalabel_canvas, fg='black', font=("宋体", self.font_size_text),
  397. bg='DeepSkyBlue', height=1,
  398. anchor='center', text="生产数据")
  399. self.orderdatalabel.place(x=self.order_data_frame.winfo_reqwidth() / 2 - 50, y=5)
  400. self.orderdatalabel_canvas.place(x=1, y=1)
  401. self.oktitlelabel = Label(self.order_data_frame, fg='black', font=("宋体", self.font_size_title), height=1,
  402. width=10,
  403. borderwidth=1, anchor='e', text="OK数:")
  404. self.oktitlelabel.place(x=self.order_data_frame.winfo_reqwidth() / 2 - 120, y=40)
  405. self.oklabel = Label(self.order_data_frame, fg='black', font=("宋体", self.font_size_title), relief=GROOVE,
  406. height=1, width=10,
  407. borderwidth=1, anchor='center', textvariable=self.user_var.order_ok_str)
  408. self.oklabel.place(x=self.order_data_frame.winfo_reqwidth() / 2, y=40)
  409. self.ngtitlelabel = Label(self.order_data_frame, fg='black', font=("宋体", self.font_size_title), height=1,
  410. width=10,
  411. borderwidth=1, anchor='e', text="NG数:")
  412. self.ngtitlelabel.place(x=self.order_data_frame.winfo_reqwidth() / 2 - 120, y=80)
  413. self.nglabel = Label(self.order_data_frame, fg='black', font=("宋体", self.font_size_title), relief=GROOVE,
  414. height=1, width=10,
  415. borderwidth=1, anchor='center', textvariable=self.user_var.order_ng_str)
  416. self.nglabel.place(x=self.order_data_frame.winfo_reqwidth() / 2, y=80)
  417. self.targetitlelabel = Label(self.order_data_frame, fg='black', font=("宋体", self.font_size_title), height=1,
  418. width=10,
  419. borderwidth=1, anchor='e', text="targe:")
  420. self.targetitlelabel.place(x=self.order_data_frame.winfo_reqwidth() / 2 - 120, y=120)
  421. self.targelabel = Label(self.order_data_frame, fg='black', font=("宋体", self.font_size_title), relief=GROOVE,
  422. height=1, width=10,
  423. borderwidth=1, anchor='center', textvariable=self.user_var.order_targe_str)
  424. self.targelabel.place(x=self.order_data_frame.winfo_reqwidth() / 2, y=120)
  425. self.snptitlelabel = Label(self.order_data_frame, fg='black', font=("宋体", self.font_size_title), height=1,
  426. width=10,
  427. borderwidth=1, anchor='e', text="SNP:")
  428. self.snptitlelabel.place(x=self.order_data_frame.winfo_reqwidth() / 2 - 120, y=160)
  429. self.snplabel = Label(self.order_data_frame, fg='black', font=("宋体", self.font_size_title), relief=GROOVE,
  430. height=1, width=10,
  431. borderwidth=1, anchor='center', textvariable=self.user_var.order_snp_str)
  432. self.snplabel.place(x=self.order_data_frame.winfo_reqwidth() / 2, y=160)
  433. self.yeartitlelabel = Label(self.order_data_frame, fg='black', font=("宋体", self.font_size_title), height=1,
  434. width=10,
  435. borderwidth=1, anchor='e', text="年份批号:")
  436. self.yeartitlelabel.place(x=self.order_data_frame.winfo_reqwidth() / 2 - 120, y=200)
  437. self.yearlabel = Label(self.order_data_frame, fg='black', font=("宋体", self.font_size_title), relief=GROOVE,
  438. height=1, width=10,
  439. borderwidth=1, anchor='center', textvariable=self.user_var.order_year_str)
  440. self.yearlabel.place(x=self.order_data_frame.winfo_reqwidth() / 2, y=200)
  441. self.teamtitlelabel = Label(self.order_data_frame, fg='black', font=("宋体", self.font_size_title), height=1,
  442. width=10,
  443. borderwidth=1, anchor='e', text="班组选择:")
  444. self.teamtitlelabel.place(x=self.order_data_frame.winfo_reqwidth() / 2 - 120, y=240)
  445. self.team_canvas = Canvas(self.order_data_frame, bg='yellow', width=102,
  446. height=28)
  447. self.team_combobox = Combobox(self.team_canvas, font=("宋体", self.font_size_text), width=9)
  448. self.team_combobox["value"] = self.user_var.team_list
  449. self.team_combobox.configure(state="readonly")
  450. self.team_sel_value()
  451. self.team_combobox.bind("<<ComboboxSelected>>", self.team_combobox_sel)
  452. self.team_combobox.place(x=5, y=5)
  453. self.team_canvas.place(x=self.order_data_frame.winfo_reqwidth()/2 - 3, y=238)
  454. self.notice_canvas = Canvas(self.order_data_frame)
  455. self.noticelabel01 = Label(self.notice_canvas, fg='red', font=("宋体", self.font_size_text), anchor='center',
  456. text="注:图中")
  457. self.noticelabel01.grid(row=0, column=0)
  458. self.noticelabel02 = Label(self.notice_canvas, bg='yellow', relief=SOLID, font=("宋体", self.font_size_text - 2),
  459. anchor='center',
  460. text=" ")
  461. self.noticelabel02.grid(row=0, column=1)
  462. self.noticelabel03 = Label(self.notice_canvas, fg='red', font=("宋体", self.font_size_text), anchor='center',
  463. text="区域作业员需要选择")
  464. self.noticelabel03.grid(row=0, column=2)
  465. self.notice_canvas.place(x=3, y=self.order_data_frame.winfo_reqheight() - 25)
  466. # 气密数据
  467. self.airtightness_data_frame = Frame(
  468. self.order_frame, width=self.order_frame.winfo_reqwidth() - self.order_data_frame.winfo_reqwidth() - 8,
  469. height=160,
  470. relief=SUNKEN, borderwidth=2)
  471. # 气密数据展示
  472. self.airtightness_data_frame.place(
  473. x=self.order_data_frame.winfo_reqwidth() + 2,
  474. y=self.product_frame.winfo_reqheight() + 10)
  475. self.airtightnesstitle_canvas = Canvas(self.airtightness_data_frame, bg='DeepSkyBlue',
  476. width=self.airtightness_data_frame.winfo_reqwidth() / 3, height=25)
  477. self.airtightnesstitlelabel = Label(self.airtightnesstitle_canvas, fg='black', font=("宋体", self.font_size_text),
  478. bg='DeepSkyBlue',
  479. anchor='center', text="气密数据区")
  480. self.airtightnesstitlelabel.place(x=self.airtightnesstitle_canvas.winfo_reqwidth() / 2 - 40, y=5)
  481. self.airtightnesstitle_canvas.place(x=self.airtightness_data_frame.winfo_reqwidth() / 3, y=1)
  482. self.batchtitlelabel = Label(self.airtightness_data_frame, fg='black', font=("宋体", self.font_size_text),
  483. borderwidth=1, anchor='e', text="当前批号:", width=10)
  484. self.batchtitlelabel.place(x=10, y=40)
  485. self.batchlabel = Label(self.airtightness_data_frame, fg='black', bg='white', font=("宋体", self.font_size_text),
  486. relief=GROOVE, borderwidth=1, anchor='center', textvariable=self.user_var.batch_str,
  487. width=35, height=1)
  488. self.batchlabel.place(x=100, y=40)
  489. self.airtightness_17700titlelabel = Label(self.airtightness_data_frame, fg='black',
  490. font=("宋体", self.font_size_text),
  491. borderwidth=1, anchor='e', text="气密数据\r(17700):", width=10)
  492. self.airtightness_17700titlelabel.place(x=10, y=70)
  493. self.airtightness_17700label = Label(self.airtightness_data_frame, fg='black', bg='white',
  494. font=("宋体", self.font_size_text),
  495. relief=GROOVE,
  496. borderwidth=1, anchor='center',
  497. textvariable=self.user_var.airtightness_17700_str,
  498. width=35, height=1)
  499. self.airtightness_17700label.place(x=100, y=80)
  500. self.airtightness_17720titlelabel = Label(self.airtightness_data_frame, fg='black',
  501. font=("宋体", self.font_size_text),
  502. borderwidth=1, anchor='e', text="气密数据\r(17720):", width=10)
  503. self.airtightness_17720titlelabel.place(x=10, y=110)
  504. self.airtightness_17720label = Label(self.airtightness_data_frame, fg='black', bg='white',
  505. font=("宋体", self.font_size_text),
  506. relief=GROOVE,
  507. borderwidth=1, anchor='center',
  508. textvariable=self.user_var.airtightness_17720_str,
  509. width=35, height=1)
  510. self.airtightness_17720label.place(x=100, y=120)
  511. self.printf_numtitlelabel = Label(self.airtightness_data_frame, fg='black',
  512. font=("宋体", self.font_size_text),
  513. borderwidth=1, anchor='center', text="标签号:", width=10)
  514. self.printf_numtitlelabel.place(x=self.airtightness_data_frame.winfo_reqwidth() / 2 + 30, y=40)
  515. self.printf_numlabel = Label(self.airtightness_data_frame, fg='black', bg='white',
  516. font=("宋体", self.font_size_text),
  517. relief=GROOVE,
  518. borderwidth=1, anchor='center', textvariable=self.user_var.printf_num_str,
  519. width=25, height=1)
  520. self.printf_numlabel.place(x=self.airtightness_data_frame.winfo_reqwidth() / 2 + 120, y=40)
  521. self.serial_numtitlelabel = Label(self.airtightness_data_frame, fg='black',
  522. font=("宋体", self.font_size_text),
  523. borderwidth=1, anchor='center', text="流水号:", width=10)
  524. self.serial_numtitlelabel.place(x=self.airtightness_data_frame.winfo_reqwidth() / 2 + 30, y=80)
  525. self.serial_numlabel = Label(self.airtightness_data_frame, fg='black', bg='white',
  526. font=("宋体", self.font_size_text),
  527. relief=GROOVE,
  528. borderwidth=1, anchor='center', textvariable=self.user_var.serial_num_str,
  529. width=25, height=1)
  530. self.serial_numlabel.place(x=self.airtightness_data_frame.winfo_reqwidth() / 2 + 120, y=80)
  531. # 设备信号
  532. self.dev_signal_frame = Frame(
  533. self.order_frame, width=self.order_frame.winfo_reqwidth() - self.order_data_frame.winfo_reqwidth() - 8,
  534. height=self.order_data_frame.winfo_reqheight() - self.airtightness_data_frame.winfo_reqheight()-5,
  535. relief=SUNKEN, borderwidth=2)
  536. # 设备信号展示
  537. self.dev_signal_frame.place(
  538. x=self.order_data_frame.winfo_reqwidth() + 2,
  539. y=self.product_frame.winfo_reqheight() + self.airtightness_data_frame.winfo_reqheight() + 15)
  540. self.devsignaltitle_canvas = Canvas(self.dev_signal_frame, bg='DeepSkyBlue',
  541. width=self.dev_signal_frame.winfo_reqwidth() / 3, height=30)
  542. self.devsignaltitlelabel = Label(self.devsignaltitle_canvas, fg='black', font=("宋体", self.font_size_text),
  543. bg='DeepSkyBlue',
  544. anchor='center', text="设备信号显示区")
  545. self.devsignaltitlelabel.place(x=self.airtightnesstitle_canvas.winfo_reqwidth() / 2 - 70, y=5)
  546. self.devsignaltitle_canvas.place(x=self.airtightness_data_frame.winfo_reqwidth() / 3, y=1)
  547. self.airtightdevtitlelabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  548. anchor='center', text="气密机")
  549. self.motordevtitlelabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  550. anchor='center', text="移动电机")
  551. self.airtightdevtitlelabel.place(x=10, y=1)
  552. self.motordevtitlelabel.place(x=self.dev_signal_frame.winfo_reqwidth() - 80, y=1)
  553. self.originchkoklabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  554. relief=SOLID,
  555. borderwidth=1, anchor='center', text="点检OK",
  556. width=10, height=1)
  557. self.originchkoklabel.place(x=10, y=40)
  558. self.upairtightoklabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  559. relief=SOLID,
  560. borderwidth=1, anchor='center', text="上气密OK",
  561. width=10, height=1)
  562. self.upairtightoklabel.place(x=100, y=40)
  563. self.upairtightnglabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  564. relief=SOLID,
  565. borderwidth=1, anchor='center', text="上气密NG",
  566. width=10, height=1)
  567. self.upairtightnglabel.place(x=190, y=40)
  568. self.upprintoklabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  569. relief=SOLID,
  570. borderwidth=1, anchor='center', text="上刻印完成",
  571. width=10, height=1)
  572. self.upprintoklabel.place(x=280, y=40)
  573. self.origindirlabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  574. relief=SOLID,
  575. borderwidth=1, anchor='center', text="原点指示",
  576. width=10, height=1)
  577. self.origindirlabel.place(x=10, y=70)
  578. self.downairtightoklabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  579. relief=SOLID,
  580. borderwidth=1, anchor='center', text="下气密OK",
  581. width=10, height=1)
  582. self.downairtightoklabel.place(x=100, y=70)
  583. self.downairtightnglabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  584. relief=SOLID,
  585. borderwidth=1, anchor='center', text="下气密NG",
  586. width=10, height=1)
  587. self.downairtightnglabel.place(x=190, y=70)
  588. self.downprintoklabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  589. relief=SOLID,
  590. borderwidth=1, anchor='center', text="下刻印完成",
  591. width=10, height=1)
  592. self.downprintoklabel.place(x=280, y=70)
  593. self.airtightdev_value()
  594. self.motororiginoklabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  595. relief=SOLID,
  596. borderwidth=1, anchor='center', text="电机原点正确",
  597. width=12, height=1)
  598. self.motororiginoklabel.place(x=self.dev_signal_frame.winfo_reqwidth()-220, y=40)
  599. self.motoronuplabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  600. relief=SOLID,
  601. borderwidth=1, anchor='center', text="电机于上工位",
  602. width=12, height=1)
  603. self.motoronuplabel.place(x=self.dev_signal_frame.winfo_reqwidth()-110, y=40)
  604. self.motorunuselabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  605. relief=SOLID,
  606. borderwidth=1, anchor='center', text="未使用",
  607. width=12, height=1)
  608. self.motorunuselabel.place(x=self.dev_signal_frame.winfo_reqwidth() - 220, y=70)
  609. self.motorondownlabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  610. relief=SOLID,
  611. borderwidth=1, anchor='center', text="电机于下工位",
  612. width=12, height=1)
  613. self.motorondownlabel.place(x=self.dev_signal_frame.winfo_reqwidth() - 110, y=70)
  614. self.motordev_value()
  615. self.upstationlabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  616. anchor='center', text="上工作位",
  617. width=10, height=1)
  618. self.upstationlabel.place(x=10, y=125)
  619. self.upgages_canvas = Canvas(self.dev_signal_frame, bg='white', relief=SOLID, borderwidth=1,
  620. width=60, height=25)
  621. self.upgageslabel = Label(self.upgages_canvas, font=("宋体", self.font_size_text),
  622. relief=SOLID, borderwidth=1, anchor='center', text="gage-s",
  623. width=6, height=1)
  624. self.upgageslabel.place(x=6, y=6)
  625. self.upgages_canvas.place(x=100, y=120)
  626. self.upworks_canvas = Canvas(self.dev_signal_frame, bg='white', relief=SOLID, borderwidth=1,
  627. width=60, height=25)
  628. self.upworkslabel = Label(self.upworks_canvas, font=("宋体", self.font_size_text),
  629. relief=SOLID, borderwidth=1, anchor='center', text="work-s",
  630. width=6, height=1)
  631. self.upworkslabel.place(x=6, y=6)
  632. self.upworks_canvas.place(x=170, y=120)
  633. self.upmpen_canvas = Canvas(self.dev_signal_frame, bg='white', relief=SOLID, borderwidth=1,
  634. width=60, height=25)
  635. self.upmpenlabel = Label(self.upmpen_canvas, font=("宋体", self.font_size_text),
  636. relief=SOLID, borderwidth=1, anchor='center', text="M-pen",
  637. width=6, height=1)
  638. self.upmpenlabel.place(x=6, y=6)
  639. self.upmpen_canvas.place(x=240, y=120)
  640. self.upconnect_canvas = Canvas(self.dev_signal_frame, bg='white', relief=SOLID, borderwidth=1,
  641. width=67, height=25)
  642. self.upconnectlabel = Label(self.upconnect_canvas, font=("宋体", self.font_size_text),
  643. relief=SOLID, borderwidth=1, anchor='center', text="connect",
  644. width=7, height=1)
  645. self.upconnectlabel.place(x=6, y=6)
  646. self.upconnect_canvas.place(x=310, y=120)
  647. self.downstationlabel = Label(self.dev_signal_frame, fg='black', font=("宋体", self.font_size_text),
  648. anchor='center', text="下工作位",
  649. width=10, height=1)
  650. self.downstationlabel.place(x=10, y=165)
  651. self.downgages_canvas = Canvas(self.dev_signal_frame, bg='white', relief=SOLID, borderwidth=1,
  652. width=60, height=25)
  653. self.downgageslabel = Label(self.downgages_canvas, font=("宋体", self.font_size_text),
  654. relief=SOLID, borderwidth=1, anchor='center', text="gage-s",
  655. width=6, height=1)
  656. self.downgageslabel.place(x=6, y=6)
  657. self.downgages_canvas.place(x=100, y=160)
  658. self.downworks_canvas = Canvas(self.dev_signal_frame, bg='white', relief=SOLID, borderwidth=1,
  659. width=60, height=25)
  660. self.downworkslabel = Label(self.downworks_canvas, font=("宋体", self.font_size_text),
  661. relief=SOLID, borderwidth=1, anchor='center', text="work-s",
  662. width=6, height=1)
  663. self.downworkslabel.place(x=6, y=6)
  664. self.downworks_canvas.place(x=170, y=160)
  665. self.downmpen_canvas = Canvas(self.dev_signal_frame, bg='white', relief=SOLID, borderwidth=1,
  666. width=60, height=25)
  667. self.downmpenlabel = Label(self.downmpen_canvas, font=("宋体", self.font_size_text),
  668. relief=SOLID, borderwidth=1, anchor='center', text="M-pen",
  669. width=6, height=1)
  670. self.downmpenlabel.place(x=6, y=6)
  671. self.downmpen_canvas.place(x=240, y=160)
  672. self.downconnect_canvas = Canvas(self.dev_signal_frame, bg='white', relief=SOLID, borderwidth=1,
  673. width=67, height=25)
  674. self.downconnectlabel = Label(self.downconnect_canvas, font=("宋体", self.font_size_text),
  675. relief=SOLID, borderwidth=1, anchor='center', text="connect",
  676. width=7, height=1)
  677. self.downconnectlabel.place(x=6, y=6)
  678. self.downconnect_canvas.place(x=310, y=160)
  679. class my_main(Frame):
  680. def __init__(self, init_window_name):
  681. global user_var
  682. self.init_window_name = init_window_name
  683. self.user_var = user_var
  684. self.screen_width = self.init_window_name.winfo_screenwidth()
  685. self.screen_height = self.init_window_name.winfo_screenheight()
  686. self.set_init_window()
  687. my_gui(self.init_window_name)
  688. # 设置窗口
  689. def set_init_window(self):
  690. self.init_window_name.title("气密测试") # 窗口名
  691. self.init_window_name.resizable(width=False, height=False)
  692. # self.init_window_name.geometry('%dx%d' % (self.screen_width, self.screen_height)) #定义窗口弹出时的默认展示大小和位置
  693. # self.init_window_name.state("zoomed")
  694. # self.init_window_name.overrideredirect(True)
  695. # self.init_window_name["bg"] = "black" #窗口背景色,其他背景色见:blog.csdn.net/chl0000/article/details/7657887
  696. # self.init_window_name.attributes("-alpha", 1) #虚化,值越小虚化程度越高
  697. # label.grid(row=0, column=2, rowspan=2, columnspan=2, sticky=W + E + N + S, padx=5, pady=5) # 合并两行,两列,居中,四周外延5个长度
  698. def on_closing(self):
  699. if self.user_var.auth_stat == True:
  700. message = tkinter.messagebox.askokcancel(title='提示', message='是否退出程序?')
  701. if(message == True):
  702. print("application is closed!")
  703. while self.user_var.pro_exit_stat == False:
  704. thread_work.exit()
  705. thread_opc.exit()
  706. thread_tcp.exit()
  707. time.sleep(2)
  708. init_window.destroy()
  709. sys.exit(0)
  710. else:
  711. tkinter.messagebox.showwarning(title='提示', message='请登录后操作!')
  712. def gui_start():
  713. global init_window
  714. global user_var
  715. ZMJ_PORTAL = my_main(init_window)
  716. thread_opc.start()
  717. thread_tcp.start()
  718. thread_work.start()
  719. thread_ezcad.start()
  720. # 设置根窗口默认属性
  721. ZMJ_PORTAL.set_init_window()
  722. init_window.protocol("WM_DELETE_WINDOW", ZMJ_PORTAL.on_closing)
  723. init_window.mainloop() #父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示