main_window_XmSgj.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import sys
  2. import threading
  3. import time
  4. from PyQt5 import QtWidgets
  5. sys.path.append("..")
  6. import mytool.db_helper.db_operation as spmng
  7. from PyQt5.QtCore import QSize, QTimer, Qt
  8. from PyQt5.QtGui import QFont, QBrush, QColor, QPixmap
  9. from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidgetItem, QListWidget, QLabel, QMessageBox, QFrame, \
  10. QAbstractItemView
  11. from ui.ui import Ui_MainWindow
  12. class MainWindow(QMainWindow, Ui_MainWindow):
  13. def __init__(self, task_type, show_config, db_config):
  14. super().__init__()
  15. self.setupUi(self)
  16. # self.label.setText("上古街智能立体停车库取车排队信息")
  17. self.setWindowFlags(Qt.FramelessWindowHint)
  18. self.task_type = task_type
  19. self.top_number = show_config["top_number"]
  20. # self.image_label.setPixmap(QPixmap('./image/log.jpg'))
  21. # self.image_label.setScaledContents(True)
  22. # self.image_label.setMaximumHeight(140)
  23. # self.image_label.setMaximumWidth(600)
  24. self.db = spmng.DBOperation(db_config['db_ip'], db_config['db_port'], db_config['db_name'],
  25. db_config['db_user'], db_config['db_password'])
  26. self.unit_list = show_config["unit_list"][show_config["unit"]]
  27. self.font_size = show_config["font_size"]
  28. self.list_widget_dict = {}
  29. self.list_widget_thread = {}
  30. self.scroll_flag_dict = {}
  31. self.command_dict = {}
  32. self.last_command_dict = {}
  33. self.pick_wait_weight = {}
  34. self.last_pick_wait_weight = {}
  35. self.btn_positions = [(i, j) for i in range(0, show_config['row']) for j in range(show_config['column'])]
  36. # 创建listwidget与label 配置多少个单元生成多少对
  37. for i, position in zip(self.unit_list, self.btn_positions):
  38. vboxlayout = QtWidgets.QVBoxLayout()
  39. self.list_widget_dict[i] = QListWidget(self)
  40. self.list_widget_dict[i].setAutoScroll(True)
  41. self.scroll_flag_dict[i] = False
  42. self.list_widget_dict[i].setSelectionMode(QAbstractItemView.NoSelection)
  43. self.list_widget_dict[i].setStyleSheet("border:5px solid #c0181f;")
  44. self.list_widget_dict[i].setObjectName(('list_widget_%d' % (i + 1)))
  45. self.list_widget_thread[i] = threading.Thread(target=self.Scroll, args=(i,))
  46. self.list_widget_thread[i].start()
  47. label = QLabel(self.get_unit(i), self)
  48. label.setFont(QFont("黑体", 30, QFont.Bold)) # 设置字体、样式和大小
  49. label.setAlignment(Qt.AlignCenter)
  50. vboxlayout.addWidget(label)
  51. vboxlayout.addWidget(self.list_widget_dict[i])
  52. vboxlayout.setSpacing(0)
  53. # hframe = QFrame(self)
  54. # hframe.setFrameShape(QFrame.HLine) # 设置水平方向
  55. # hframe.setStyleSheet("QFrame{background:black;min-height:4px}");
  56. # vboxlayout.addWidget(hframe)
  57. self.main_gridLayout.addLayout(vboxlayout, *position)
  58. self.main_gridLayout.setVerticalSpacing(40)
  59. self.command_dict[i] = []
  60. self.pick_wait_weight[i] = {}
  61. # 数据库查询线程
  62. self.db_query = threading.Thread(target=self.db_query)
  63. self.db_query_isClose = False
  64. self.db_query.start()
  65. # 界面刷新定时器
  66. self.timer = QTimer()
  67. self.timer.timeout.connect(self.Switch)
  68. self.timer.start(200)
  69. # 断开连接的弹窗
  70. self.t_timer = QTimer(self)
  71. self.msg_box_hint = QMessageBox()
  72. self.msg_box_hint.setIcon(QMessageBox.Critical)
  73. self.msg_box_hint.setWindowTitle('错误')
  74. self.msg_box_hint.setText('连接断开,重新连接中...')
  75. self.t_timer.setSingleShot(True)
  76. self.t_timer.timeout.connect(self.msg_box_hint.close)
  77. def closeEvent(self, event):
  78. self.db_query_isClose = True
  79. self.db_query.join()
  80. event.accept() # 接受关闭事件
  81. # 定义自动关闭对话框函数
  82. def show_message_box(self):
  83. self.msg_box_hint.show()
  84. self.t_timer.start(1000)
  85. def db_query(self):
  86. while self.db_query_isClose is False:
  87. for i in self.unit_list:
  88. self.last_pick_wait_weight[i] = self.db.query_pick_wait_weight_in_unit(i)
  89. if i != 40:
  90. self.last_command_dict[i] = self.db.query_queue_condition_in_unit(i)
  91. else:
  92. self.last_command_dict[i] = self.db.query_command_top_number_in_type(self.task_type,
  93. self.top_number)
  94. # elif self.task_type != 0 and i == 40:
  95. # self.last_command_dict[i] = self.db.query_command_top_number_in_type(self.task_type,self.top_number)
  96. # elif self.task_type == 0 and i != 40:
  97. # self.last_command_dict[i] = self.db.query_queue_condition_in_unit(i)
  98. # else:
  99. # self.last_command_dict[i] = self.db.query_command_top_number(self.top_number)
  100. time.sleep(0.2)
  101. def get_listWidget_item(self, dict, index):
  102. item = QListWidgetItem()
  103. item.setFont(QFont('微软雅黑', self.font_size, QFont.Bold))
  104. show_str = ""
  105. if dict['type'] == 1: # 存车指令
  106. item.setBackground(QColor(185, 240, 240))
  107. if (dict['statu'] == 0): # 排队
  108. item.setForeground(QColor(80, 80, 80))
  109. show_str = "%s 排队中" % (dict['car_number'])
  110. elif (dict['statu'] == 1): # 工作
  111. item.setForeground(QColor('blue'))
  112. show_str = "%s 存车中" % (dict['car_number'])
  113. elif (dict['statu'] == 2): # 已完成
  114. item.setForeground(QColor('green'))
  115. show_str = "%s 已完成" % (dict['car_number'])
  116. elif (dict['statu'] == 3): # 已完成
  117. item.setForeground(QColor('red'))
  118. show_str = "%s 维护!" % (dict['car_number'])
  119. elif dict['type'] == 2: # 取车指令
  120. item.setBackground(QColor(250, 240, 200))
  121. if (dict['statu'] == 0): # 排队
  122. item.setForeground(QColor(80, 80, 80))
  123. show_str = "%s %s排队中" % (dict['car_number'], self.get_unit(dict['unit']))
  124. if index != 40:
  125. show_str = "%s 剩%d分钟" % (dict['car_number'],
  126. int((dict['row_number() over(order by queue_time)'] - 1) * 5 *
  127. self.pick_wait_weight[index][0]['wait_weight']))
  128. elif (dict['statu'] == 1): # 工作
  129. item.setForeground(QColor('blue'))
  130. show_str = "%s %s取车中" % (dict['car_number'], self.get_unit(dict['unit']))
  131. elif (dict['statu'] == 2): # 已完成
  132. item.setForeground(QColor('green'))
  133. show_str = "%s %s出口%d" % (dict['car_number'], self.get_unit(dict['unit']), dict['export_id'])
  134. elif (dict['statu'] == 3): # 已完成
  135. item.setForeground(QColor(80, 180, 200))
  136. show_str = "%s %s维护!" % (dict['car_number'], self.get_unit(dict['unit']))
  137. item.setText(show_str)
  138. return item
  139. def Switch(self):
  140. for i in self.unit_list:
  141. if (i in self.last_command_dict.keys()) is False or self.last_command_dict[i] is None or \
  142. (i in self.last_pick_wait_weight.keys()) is False or self.last_pick_wait_weight[i] is None:
  143. self.show_message_box()
  144. elif self.command_dict[i] != self.last_command_dict[i] or self.pick_wait_weight[i] != \
  145. self.last_pick_wait_weight[i]:
  146. self.pick_wait_weight[i] = self.last_pick_wait_weight[i]
  147. self.command_dict[i] = self.last_command_dict[i]
  148. self.list_widget_dict[i].clear()
  149. for dict in self.command_dict[i]:
  150. if dict['statu'] != 4 and dict['type'] == self.task_type:
  151. self.list_widget_dict[i].addItem(self.get_listWidget_item(dict, i))
  152. def Scroll(self, i):
  153. while True:
  154. for index in range(self.list_widget_dict[i].count()):
  155. # if self.scroll_flag_dict[i] is True:
  156. # self.scroll_flag_dict[i] = False
  157. # break
  158. self.list_widget_dict[i].setCurrentRow(index)
  159. time.sleep(0.7)
  160. time.sleep(2)
  161. def get_unit(self, unit):
  162. if unit == 1:
  163. return 'A'
  164. elif unit == 2:
  165. return 'B'
  166. elif unit == 11:
  167. return 'A1'
  168. elif unit == 12:
  169. return 'A2'
  170. elif unit == 13:
  171. return 'A3'
  172. elif unit == 14:
  173. return 'A4'
  174. elif unit == 21:
  175. return 'B1'
  176. elif unit == 22:
  177. return 'B2'
  178. elif unit == 23:
  179. return 'B3'
  180. elif unit == 24:
  181. return 'B4'
  182. elif unit == 25:
  183. return 'B5'
  184. elif unit == 31:
  185. return 'C1'
  186. elif unit == 32:
  187. return 'C2'
  188. elif unit == 40:
  189. return '最新%d条' % self.top_number
  190. return '未知'