pyqt5 tableview使用、日期判断示例、combobox多选(勾选)示例
gui部分:
1 # -*- coding: utf-8 -*- 2 3 # Form implementation generated from reading ui file 'caiyagui.ui' 4 # 5 # Created by: PyQt5 UI code generator 5.14.2 6 # 7 # WARNING! All changes made in this file will be lost! 8 9 10 from PyQt5 import QtCore, QtGui, QtWidgets 11 12 13 class Ui_MainWindow(object): 14 def setupUi(self, MainWindow): 15 MainWindow.setObjectName("MainWindow") 16 MainWindow.resize(1080, 804) 17 self.centralwidget = QtWidgets.QWidget(MainWindow) 18 self.centralwidget.setObjectName("centralwidget") 19 self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) 20 self.verticalLayout.setObjectName("verticalLayout") 21 self.label = QtWidgets.QLabel(self.centralwidget) 22 font = QtGui.QFont() 23 font.setFamily("方正楷体简体") 24 font.setPointSize(16) 25 self.label.setFont(font) 26 self.label.setAlignment(QtCore.Qt.AlignCenter) 27 self.label.setObjectName("label") 28 self.verticalLayout.addWidget(self.label) 29 self.line_2 = QtWidgets.QFrame(self.centralwidget) 30 self.line_2.setFrameShape(QtWidgets.QFrame.HLine) 31 self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) 32 self.line_2.setObjectName("line_2") 33 self.verticalLayout.addWidget(self.line_2) 34 self.gridLayout = QtWidgets.QGridLayout() 35 self.gridLayout.setObjectName("gridLayout") 36 self.label_2 = QtWidgets.QLabel(self.centralwidget) 37 self.label_2.setObjectName("label_2") 38 self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) 39 self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) 40 self.lineEdit.setObjectName("lineEdit") 41 self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1) 42 self.label_4 = QtWidgets.QLabel(self.centralwidget) 43 self.label_4.setObjectName("label_4") 44 self.gridLayout.addWidget(self.label_4, 0, 4, 1, 1) 45 self.dateEdit = QtWidgets.QDateEdit(self.centralwidget) 46 self.dateEdit.setObjectName("dateEdit") 47 self.gridLayout.addWidget(self.dateEdit, 0, 5, 1, 1) 48 self.label_6 = QtWidgets.QLabel(self.centralwidget) 49 self.label_6.setObjectName("label_6") 50 self.gridLayout.addWidget(self.label_6, 1, 2, 1, 1) 51 self.dateEdit_2 = QtWidgets.QDateEdit(self.centralwidget) 52 self.dateEdit_2.setObjectName("dateEdit_2") 53 self.gridLayout.addWidget(self.dateEdit_2, 1, 5, 1, 1) 54 self.comboBox_2 = QtWidgets.QComboBox(self.centralwidget) 55 self.comboBox_2.setObjectName("comboBox_2") 56 self.gridLayout.addWidget(self.comboBox_2, 1, 3, 1, 1) 57 self.label_7 = QtWidgets.QLabel(self.centralwidget) 58 self.label_7.setObjectName("label_7") 59 self.gridLayout.addWidget(self.label_7, 1, 4, 1, 1) 60 self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget) 61 self.pushButton_5.setObjectName("pushButton_5") 62 self.gridLayout.addWidget(self.pushButton_5, 2, 5, 1, 1) 63 self.label_5 = QtWidgets.QLabel(self.centralwidget) 64 self.label_5.setObjectName("label_5") 65 self.gridLayout.addWidget(self.label_5, 0, 2, 1, 1) 66 self.comboBox = QtWidgets.QComboBox(self.centralwidget) 67 self.comboBox.setObjectName("comboBox") 68 self.gridLayout.addWidget(self.comboBox, 0, 3, 1, 1) 69 self.checkBox = QtWidgets.QCheckBox(self.centralwidget) 70 self.checkBox.setObjectName("checkBox") 71 self.gridLayout.addWidget(self.checkBox, 2, 3, 1, 1) 72 self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget) 73 self.pushButton_6.setObjectName("pushButton_6") 74 self.gridLayout.addWidget(self.pushButton_6, 2, 0, 1, 1) 75 self.verticalLayout.addLayout(self.gridLayout) 76 self.gridLayout_3 = QtWidgets.QGridLayout() 77 self.gridLayout_3.setObjectName("gridLayout_3") 78 self.textBrowser_2 = QtWidgets.QTextBrowser(self.centralwidget) 79 self.textBrowser_2.setObjectName("textBrowser_2") 80 self.gridLayout_3.addWidget(self.textBrowser_2, 1, 1, 1, 1) 81 self.textEdit = QtWidgets.QTextEdit(self.centralwidget) 82 self.textEdit.setObjectName("textEdit") 83 self.gridLayout_3.addWidget(self.textEdit, 1, 0, 1, 1) 84 self.label_9 = QtWidgets.QLabel(self.centralwidget) 85 self.label_9.setAlignment(QtCore.Qt.AlignCenter) 86 self.label_9.setObjectName("label_9") 87 self.gridLayout_3.addWidget(self.label_9, 0, 0, 1, 1) 88 self.label_11 = QtWidgets.QLabel(self.centralwidget) 89 self.label_11.setAlignment(QtCore.Qt.AlignCenter) 90 self.label_11.setObjectName("label_11") 91 self.gridLayout_3.addWidget(self.label_11, 0, 1, 1, 1) 92 self.verticalLayout.addLayout(self.gridLayout_3) 93 self.line = QtWidgets.QFrame(self.centralwidget) 94 self.line.setFrameShape(QtWidgets.QFrame.HLine) 95 self.line.setFrameShadow(QtWidgets.QFrame.Sunken) 96 self.line.setObjectName("line") 97 self.verticalLayout.addWidget(self.line) 98 self.gridLayout_2 = QtWidgets.QGridLayout() 99 self.gridLayout_2.setObjectName("gridLayout_2") 100 self.line_3 = QtWidgets.QFrame(self.centralwidget) 101 self.line_3.setFrameShape(QtWidgets.QFrame.VLine) 102 self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken) 103 self.line_3.setObjectName("line_3") 104 self.gridLayout_2.addWidget(self.line_3, 0, 6, 1, 1) 105 self.label_10 = QtWidgets.QLabel(self.centralwidget) 106 sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) 107 sizePolicy.setHorizontalStretch(0) 108 sizePolicy.setVerticalStretch(0) 109 sizePolicy.setHeightForWidth(self.label_10.sizePolicy().hasHeightForWidth()) 110 self.label_10.setSizePolicy(sizePolicy) 111 self.label_10.setObjectName("label_10") 112 self.gridLayout_2.addWidget(self.label_10, 0, 9, 1, 1) 113 self.label_12 = QtWidgets.QLabel(self.centralwidget) 114 sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) 115 sizePolicy.setHorizontalStretch(0) 116 sizePolicy.setVerticalStretch(0) 117 sizePolicy.setHeightForWidth(self.label_12.sizePolicy().hasHeightForWidth()) 118 self.label_12.setSizePolicy(sizePolicy) 119 self.label_12.setObjectName("label_12") 120 self.gridLayout_2.addWidget(self.label_12, 0, 11, 1, 1) 121 self.comboBox_4 = QtWidgets.QComboBox(self.centralwidget) 122 self.comboBox_4.setObjectName("comboBox_4") 123 self.gridLayout_2.addWidget(self.comboBox_4, 0, 12, 1, 1) 124 self.pushButton = QtWidgets.QPushButton(self.centralwidget) 125 self.pushButton.setObjectName("pushButton") 126 self.gridLayout_2.addWidget(self.pushButton, 0, 1, 1, 1) 127 self.comboBox_3 = QtWidgets.QComboBox(self.centralwidget) 128 self.comboBox_3.setObjectName("comboBox_3") 129 self.gridLayout_2.addWidget(self.comboBox_3, 0, 10, 1, 1) 130 self.checkBox_2 = QtWidgets.QCheckBox(self.centralwidget) 131 self.checkBox_2.setObjectName("checkBox_2") 132 self.gridLayout_2.addWidget(self.checkBox_2, 0, 8, 1, 1) 133 self.pushButton_7 = QtWidgets.QPushButton(self.centralwidget) 134 self.pushButton_7.setObjectName("pushButton_7") 135 self.gridLayout_2.addWidget(self.pushButton_7, 0, 2, 1, 1) 136 self.pushButton_8 = QtWidgets.QPushButton(self.centralwidget) 137 self.pushButton_8.setObjectName("pushButton_8") 138 self.gridLayout_2.addWidget(self.pushButton_8, 0, 3, 1, 1) 139 self.verticalLayout.addLayout(self.gridLayout_2) 140 self.tableView = QtWidgets.QTableView(self.centralwidget) 141 self.tableView.setObjectName("tableView") 142 self.verticalLayout.addWidget(self.tableView) 143 self.horizontalLayout = QtWidgets.QHBoxLayout() 144 self.horizontalLayout.setObjectName("horizontalLayout") 145 self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget) 146 self.pushButton_4.setObjectName("pushButton_4") 147 self.horizontalLayout.addWidget(self.pushButton_4) 148 spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 149 self.horizontalLayout.addItem(spacerItem) 150 self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) 151 self.pushButton_2.setObjectName("pushButton_2") 152 self.horizontalLayout.addWidget(self.pushButton_2) 153 self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) 154 self.pushButton_3.setObjectName("pushButton_3") 155 self.horizontalLayout.addWidget(self.pushButton_3) 156 self.verticalLayout.addLayout(self.horizontalLayout) 157 MainWindow.setCentralWidget(self.centralwidget) 158 self.statusbar = QtWidgets.QStatusBar(MainWindow) 159 self.statusbar.setObjectName("statusbar") 160 MainWindow.setStatusBar(self.statusbar) 161 162 self.retranslateUi(MainWindow) 163 QtCore.QMetaObject.connectSlotsByName(MainWindow) 164 165 def retranslateUi(self, MainWindow): 166 _translate = QtCore.QCoreApplication.translate 167 MainWindow.setWindowTitle(_translate("MainWindow", "Caiya tool")) 168 self.label.setText(_translate("MainWindow", "事物跟踪小工具")) 169 self.label_2.setText(_translate("MainWindow", "来源")) 170 self.label_4.setText(_translate("MainWindow", "承诺解决日期")) 171 self.label_6.setText(_translate("MainWindow", "跟踪人")) 172 self.label_7.setText(_translate("MainWindow", "问题提出日期")) 173 self.pushButton_5.setText(_translate("MainWindow", "同步")) 174 self.label_5.setText(_translate("MainWindow", "责任人")) 175 self.checkBox.setText(_translate("MainWindow", "完成状态")) 176 self.pushButton_6.setText(_translate("MainWindow", "Add a Item")) 177 self.label_9.setText(_translate("MainWindow", "行动计划")) 178 self.label_11.setText(_translate("MainWindow", "预览")) 179 self.label_10.setText(_translate("MainWindow", "提醒周期")) 180 self.label_12.setText(_translate("MainWindow", "超期提醒")) 181 self.pushButton.setText(_translate("MainWindow", "Del")) 182 self.checkBox_2.setText(_translate("MainWindow", "是否提醒")) 183 self.pushButton_7.setText(_translate("MainWindow", "隐藏已完成")) 184 self.pushButton_8.setText(_translate("MainWindow", "显示已完成")) 185 self.pushButton_4.setText(_translate("MainWindow", "存档")) 186 self.pushButton_2.setText(_translate("MainWindow", "Run")) 187 self.pushButton_3.setText(_translate("MainWindow", "Send E-mail"))
主代码部分:
1 import os 2 import sys 3 import time 4 from sys import argv 5 import qtawesome 6 from PyQt5.QtGui import QStandardItem, QStandardItemModel 7 from PyQt5 import QtCore 8 from PyQt5.QtCore import QThread, QDate, Qt, QModelIndex 9 from PyQt5.QtWidgets import QApplication, QMainWindow, QAbstractItemView, QHeaderView, QItemDelegate, QMessageBox 10 import caiyagui 11 import pandas as pd 12 import numpy as np 13 from datetime import datetime 14 15 16 17 class my_mainwindow(): 18 def __init__(self): 19 # PyQt5中,每个应用程序都必须实例化一个QApplication(): 20 app = QApplication(argv) 21 app.setWindowIcon(qtawesome.icon("fa.github-alt",color="green")) 22 self.my_MainWindow = QMainWindow() 23 self.my_ui = caiyagui.Ui_MainWindow() 24 self.my_ui.setupUi(self.my_MainWindow) 25 #################################################################### 26 #线程标志位 27 self.key_flag = 0 28 #################################################################### 29 self.update_data={'序号': -1, 30 '来源': 'NA', 31 '事务&问题描述': 'NA', 32 '承诺解决日期': 'NA', 33 '责任人': 'NA', 34 '跟踪人': 'NA', 35 '问题提出日期': 'NA', 36 '完成状态': 'NA', 37 '行动计划': 'NA', 38 '是否提醒': 'NA', 39 '提醒周期': 'NA', 40 '超期提醒': 'NA', 41 '实际完成时间': 'NA'} 42 self.owner=[] 43 self.stalker=[] 44 # 创建表格模型 45 self.model = QStandardItemModel(self.my_MainWindow) 46 self.model.setColumnCount(5) # 设置列数 47 self.model.setHeaderData(0, Qt.Horizontal, "序号") # 设置列头 48 self.model.setHeaderData(1, Qt.Horizontal, "事务&问题描述") # 设置列头 49 self.model.setHeaderData(2, Qt.Horizontal, "责任人") # 设置列头 50 self.model.setHeaderData(3, Qt.Horizontal, "承诺解决日期") 51 self.model.setHeaderData(4, Qt.Horizontal, "完成状态") # 设置列头 52 self.my_ui.tableView.setModel(self.model) 53 self.my_ui.tableView.setSelectionBehavior(QAbstractItemView.SelectRows) # 设置选择行为 54 # 下面代码让表格填满窗口 55 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) 56 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(0,QHeaderView.Interactive) 57 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(1, QHeaderView.Interactive) 58 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(2, QHeaderView.Interactive) 59 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(3, QHeaderView.Interactive) 60 self.my_ui.tableView.setItemDelegateForColumn(0, EmptyDelegate(self.my_MainWindow)) # 设置第二列不可编辑 61 self.my_ui.tableView.setItemDelegateForColumn(2, EmptyDelegate(self.my_MainWindow)) # 设置第二列不可编辑 62 self.my_ui.tableView.setItemDelegateForColumn(3, EmptyDelegate(self.my_MainWindow)) # 设置第二列不可编辑 63 self.my_ui.tableView.setItemDelegateForColumn(4, EmptyDelegate(self.my_MainWindow)) # 设置第二列不可编辑 64 #表格槽函数 65 self.datachange_flag=True 66 self.model.dataChanged.connect(self.datachanged) 67 self.index_row=[] 68 # 表格连接信号和槽 69 self.my_ui.tableView.clicked.connect(self.handle_row_click) 70 #导入数据 71 if os.path.exists("DATA/任务跟踪表单.xlsx") == False: 72 QMessageBox.information(self.my_MainWindow, "Information", "任务清单文件不存在") 73 sys.exit(0) # 系统结束推出 74 # 判断导入数据表头是否有问题 75 self.data = pd.read_excel("DATA/任务跟踪表单.xlsx", sheet_name=0, engine='openpyxl') 76 # 判断字典键和数据框列是否相同 77 dict_keys = set(self.update_data.keys()) 78 df_keys = set(self.data.columns) 79 if (dict_keys == df_keys) == False: 80 QMessageBox.information(self.my_MainWindow, "Information", "任务清单数据不对") 81 sys.exit(0) # 系统结束推出 82 #table导入数据 83 for i in range(len(self.data)): 84 # 添加数据到模型 iloc是通过位置来获取值 85 self.model.appendRow([ 86 QStandardItem("%d" % self.data['序号'].iloc[i]), 87 QStandardItem("%s" % self.data['事务&问题描述'].iloc[i]), 88 QStandardItem("%s" % self.data['责任人'].iloc[i]), 89 QStandardItem("%s" % self.data['承诺解决日期'].iloc[i]), 90 QStandardItem("%s" % self.data['完成状态'].iloc[i]) 91 ]) 92 self.Finish=["每天","每周","每月"] 93 self.Finish_delay = ["每天", "每周Double", "每月"] 94 self.my_ui.comboBox_3.addItems(self.Finish) 95 self.my_ui.comboBox_4.addItems(self.Finish_delay) 96 #导入通讯录数据 97 if os.path.exists("DATA/通讯录.xlsx") == False: 98 QMessageBox.information(self.my_MainWindow, "Information", "通讯录文件不存在") 99 sys.exit(0) # 系统结束推出 100 # 判断导入数据表头是否有问题 101 self.name_data={'序号': 0, 102 '姓名': 'NA', 103 '邮箱': 'NA'} 104 self.address = pd.read_excel("DATA/通讯录.xlsx", sheet_name=0, engine='openpyxl') 105 # 判断字典键和数据框列是否相同 106 dict_keys = set(self.name_data.keys()) 107 df_keys = set(self.address.columns) 108 if (dict_keys == df_keys) == False: 109 QMessageBox.information(self.my_MainWindow, "Information", "通讯录数据不对") 110 sys.exit(0) # 系统结束推出 111 self.name_list=list(self.address[self.address.keys()[1]]) 112 self.my_ui.comboBox.addItems(self.name_list) 113 self.my_ui.comboBox_2.addItems(self.name_list) 114 self.my_ui.comboBox.view().pressed.connect(self.get_owner) 115 self.my_ui.comboBox_2.view().pressed.connect(self.get_stalker) 116 self.prview() 117 #设置日期 118 current_date = QDate.currentDate() 119 self.my_ui.dateEdit.setDate(current_date) 120 self.my_ui.dateEdit_2.setDate(current_date) 121 self.click_pushbutton(self.my_MainWindow) 122 ##################################################################### 123 self.my_MainWindow.show() 124 sys.exit(app.exec_()) 125 126 def click_pushbutton(self,my_MainWindow): 127 self.my_ui.pushButton_5.clicked.connect(self.sync_use) 128 self.my_ui.pushButton_6.clicked.connect(self.addItem) 129 self.my_ui.pushButton.clicked.connect(self.delate) 130 self.my_ui.pushButton_4.clicked.connect(self.savedata) 131 self.my_ui.pushButton_7.clicked.connect(self.RowHidden) 132 self.my_ui.pushButton_8.clicked.connect(self.disRowHidden) 133 self.my_ui.pushButton_2.clicked.connect(self.run) 134 135 def run(self): 136 self.my_ui.pushButton_2.setDisabled(True) 137 # 新建线程开始计算 138 self.mywork1 = myworkthread1((self.data,self.address)) 139 self.mywork1.finishsignal.connect(self.workend1) 140 self.mywork1.start() 141 142 def workend(self,ins): 143 self.key_flag = 0 144 print(ins) 145 QMessageBox.information(self.my_MainWindow, "Information", "%s"%ins[1]) 146 147 def workend1(self,ins): 148 print(ins) 149 # 新建线程开始计算 150 self.mywork1 = myworkthread1((self.data,self.address)) 151 self.mywork1.finishsignal.connect(self.workend1) 152 self.mywork1.start() 153 154 def RowHidden(self): 155 for i in range(self.model.rowCount()): 156 dindex = self.model.index(i, 4) 157 #获取表格数据 158 item_data = self.model.data(dindex, Qt.DisplayRole) 159 if item_data=="close": 160 self.my_ui.tableView.setRowHidden(i,True) 161 162 def disRowHidden(self): 163 for i in range(self.model.rowCount()): 164 dindex = self.model.index(i, 4) 165 item_data = self.model.data(dindex, Qt.DisplayRole) 166 if item_data=="close": 167 self.my_ui.tableView.setRowHidden(i,False) 168 169 def handle_row_click(self): 170 self.owner = [] 171 self.stalker = [] 172 self.combox_init() 173 self.get_tablerow() 174 dindex = self.model.index(self.index_row, 0) 175 item_data = self.model.data(dindex, Qt.DisplayRole) 176 index_of_value = self.data['序号'][self.data['序号'] == np.int64(item_data)].index[0] 177 self.update_data["序号"] = self.data['序号'][index_of_value] 178 self.update_data["来源"] = self.data['来源'][index_of_value] 179 self.my_ui.lineEdit.setText(str(self.data['来源'][index_of_value])) 180 self.update_data["事务&问题描述"] = self.data['事务&问题描述'][index_of_value] 181 data_result = self.data['承诺解决日期'][index_of_value].split("/") # 使用逗号作为分隔符 182 # 设置自定义日期 183 custom_date = QDate(int(data_result[0]), int(data_result[1]), int(data_result[2])) # 设置为2023年3月15日 184 self.my_ui.dateEdit.setDate(custom_date) 185 self.update_data["承诺解决日期"] = self.data['承诺解决日期'][index_of_value] 186 self.update_data["责任人"] = self.data['责任人'][index_of_value] 187 self.update_data["跟踪人"] = self.data['跟踪人'][index_of_value] 188 data_result = self.data['问题提出日期'][index_of_value].split("/") # 使用逗号作为分隔符 189 # 设置自定义日期 190 custom_date = QDate(int(data_result[0]), int(data_result[1]), int(data_result[2])) # 设置为2023年3月15日 191 self.my_ui.dateEdit_2.setDate(custom_date) 192 self.update_data["问题提出日期"] = self.data['问题提出日期'][index_of_value] 193 if self.data['完成状态'][index_of_value]=="close": 194 self.my_ui.checkBox.setChecked(True) 195 else: 196 self.my_ui.checkBox.setChecked(False) 197 self.update_data["完成状态"] = self.my_ui.checkBox.isChecked() 198 self.my_ui.textEdit.setText(str(self.data['行动计划'][index_of_value])) 199 self.update_data["行动计划"] = self.data['行动计划'][index_of_value] 200 if self.data['是否提醒'][index_of_value]=="是": 201 self.my_ui.checkBox_2.setChecked(True) 202 else: 203 self.my_ui.checkBox_2.setChecked(False) 204 self.update_data["是否提醒"] = self.my_ui.checkBox_2.isChecked() 205 self.update_data["提醒周期"] = self.data['提醒周期'][index_of_value] 206 self.update_data["超期提醒"] = self.data['超期提醒'][index_of_value] 207 self.prview() 208 209 def get_tablerow(self): 210 indexes = self.my_ui.tableView.selectionModel().selectedRows() 211 print(indexes) 212 for index in sorted(indexes, reverse=True): 213 self.index_row = index.row() 214 print(self.index_row) 215 216 def datachanged(self): 217 if self.datachange_flag==True: 218 # 获取选中的行 219 self.get_tablerow() 220 dindex = self.model.index(self.index_row, 0) 221 item_data = self.model.data(dindex, Qt.DisplayRole) 222 index_of_value = self.data['序号'][self.data['序号'] == np.int64(item_data)].index[0] 223 print(index_of_value) 224 dindex = self.model.index(self.index_row, 1) 225 item_data = self.model.data(dindex, Qt.DisplayRole) 226 # 使用.loc[]更新数据 227 self.data.loc[index_of_value,'事务&问题描述']=item_data 228 self.update_data["事务&问题描述"] = self.data['事务&问题描述'][index_of_value] 229 self.prview() 230 231 def addItem(self): 232 last_inx = self.data['序号'].iloc[-1] 233 print(last_inx) 234 print(len(self.data)) 235 # 新增行 236 data={'序号': last_inx+1, 237 '来源': "", 238 '事务&问题描述': "", 239 '承诺解决日期': '2024/6/23', 240 '责任人': "", 241 '跟踪人': "", 242 '问题提出日期': '2024/6/23', 243 '完成状态': "", 244 '行动计划': "", 245 '是否提醒': "", 246 '提醒周期': "", 247 '超期提醒': "", 248 '实际完成时间': ""} 249 self.data = self.data.append(data, ignore_index=True) 250 print(self.data) 251 self.model.appendRow([ 252 QStandardItem("%d"%self.data['序号'].iloc[-1]), 253 QStandardItem("%s"%self.data['事务&问题描述'].iloc[-1]), 254 QStandardItem("%s" % self.data['责任人'].iloc[-1]), 255 QStandardItem("%s"%self.data['承诺解决日期'].iloc[-1]), 256 QStandardItem("%s"%self.data['完成状态'].iloc[-1]) 257 ]) 258 259 def prview(self): 260 self.my_ui.textBrowser_2.clear() 261 for j in self.update_data.keys(): 262 self.my_ui.textBrowser_2.append("%s:--%s"%(j,self.update_data[j])) 263 264 def get_owner(self,index): 265 if self.index_row != []: 266 standard_item:QStandardItem=self.my_ui.comboBox.model().itemFromIndex(index) 267 checked_state=standard_item.checkState() 268 if not checked_state: 269 standard_item.setCheckState(2) 270 self.owner.append(index.data(0)) 271 else: 272 standard_item.setCheckState(0) 273 for i in range(len(self.owner)): 274 if self.owner[i] == index.data(0): 275 self.owner.pop(i) 276 break 277 owner_str="" 278 for i in range(len(self.owner)): 279 owner_str=owner_str+","+self.owner[i] 280 self.update_data['责任人'] = owner_str 281 dindex = self.model.index(self.index_row, 0) 282 item_data = self.model.data(dindex, Qt.DisplayRole) 283 index_of_value = self.data['序号'][self.data['序号'] == np.int64(item_data)].index[0] 284 self.data.loc[index_of_value, '责任人'] = owner_str 285 # 添加数据到模型 286 items = QStandardItem("%s" % owner_str) 287 self.model.setItem(self.index_row, 2, items) 288 # 下面代码让表格填满窗口 289 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) 290 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(0,QHeaderView.Interactive) 291 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(1, QHeaderView.Interactive) 292 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(2, QHeaderView.Interactive) 293 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(3, QHeaderView.Interactive) 294 self.prview() 295 296 def combox_init(self): 297 for i in range(len(self.my_ui.comboBox_2)): 298 useinx=self.my_ui.comboBox_2.model().index(i, 0) 299 standard_item: QStandardItem = self.my_ui.comboBox_2.model().itemFromIndex(useinx) 300 checked_state = standard_item.checkState() 301 if checked_state: 302 standard_item.setCheckState(0) 303 for i in range(len(self.my_ui.comboBox)): 304 useinx = self.my_ui.comboBox.model().index(i, 0) 305 standard_item: QStandardItem = self.my_ui.comboBox.model().itemFromIndex(useinx) 306 checked_state = standard_item.checkState() 307 if checked_state: 308 standard_item.setCheckState(0) 309 310 def get_stalker(self,index:QModelIndex): 311 if self.index_row != []: 312 standard_item:QStandardItem=self.my_ui.comboBox_2.model().itemFromIndex(index) 313 checked_state=standard_item.checkState() 314 if not checked_state: 315 standard_item.setCheckState(2) 316 self.stalker.append(index.data(0)) 317 else: 318 standard_item.setCheckState(0) 319 for i in range(len(self.stalker)): 320 if self.stalker[i] == index.data(0): 321 self.stalker.pop(i) 322 break 323 stalker_str = "" 324 for i in range(len(self.stalker)): 325 stalker_str = stalker_str + "," + self.stalker[i] 326 self.update_data['跟踪人'] = stalker_str 327 dindex = self.model.index(self.index_row, 0) 328 item_data = self.model.data(dindex, Qt.DisplayRole) 329 index_of_value = self.data['序号'][self.data['序号'] == np.int64(item_data)].index[0] 330 self.data.loc[index_of_value, '跟踪人'] = stalker_str 331 self.prview() 332 333 def sync_use(self): 334 self.datachange_flag=False 335 if self.index_row!=[]: 336 dindex = self.model.index(self.index_row, 0) 337 item_data = self.model.data(dindex, Qt.DisplayRole) 338 index_of_value = self.data['序号'][self.data['序号'] == np.int64(item_data)].index[0] 339 self.update_data["来源"] = self.my_ui.lineEdit.text() 340 self.data.loc[index_of_value, '来源'] = self.my_ui.lineEdit.text() 341 self.update_data["承诺解决日期"] = self.my_ui.dateEdit.text() 342 self.data.loc[index_of_value, '承诺解决日期'] = self.my_ui.dateEdit.text() 343 # 添加数据到模型 344 items = QStandardItem("%s"%self.my_ui.dateEdit.text()) 345 self.model.setItem(self.index_row, 3, items) 346 self.update_data["问题提出日期"] = self.my_ui.dateEdit_2.text() 347 self.data.loc[index_of_value, '问题提出日期'] = self.my_ui.dateEdit_2.text() 348 self.update_data["完成状态"] = self.my_ui.checkBox.isChecked() 349 current_date = QDate.currentDate() 350 # 将 QDate 对象转换为 QDateOld 对象,以便使用 toString 方法 351 date_old = QDate(current_date.year(), current_date.month(), current_date.day()) 352 # 使用 toString 方法转换为字符串,"yyyy-MM-dd" 是格式字符串 353 date_string = date_old.toString('yyyy/MM/dd') 354 if self.my_ui.checkBox.isChecked(): 355 self.data.loc[index_of_value, '完成状态'] = "close" 356 self.data.loc[index_of_value, '实际完成时间'] = date_string 357 else: 358 self.data.loc[index_of_value, '完成状态'] = "open" 359 self.data.loc[index_of_value, '实际完成时间'] = "" 360 self.update_data["实际完成时间"] = self.data['实际完成时间'][index_of_value] 361 items = QStandardItem("%s" % self.data['完成状态'][index_of_value]) 362 self.model.setItem(self.index_row, 4, items) 363 self.update_data["行动计划"] = self.my_ui.textEdit.toPlainText() 364 self.data.loc[index_of_value, '行动计划'] = self.my_ui.textEdit.toPlainText() 365 self.update_data["是否提醒"] = self.my_ui.checkBox_2.isChecked() 366 if self.my_ui.checkBox_2.isChecked(): 367 self.data.loc[index_of_value, '是否提醒'] = "是" 368 else: 369 self.data.loc[index_of_value, '是否提醒'] = "否" 370 self.update_data["提醒周期"] = self.my_ui.comboBox_3.currentText() 371 self.data.loc[index_of_value, '提醒周期'] = self.my_ui.comboBox_3.currentText() 372 self.update_data["超期提醒"] = self.my_ui.comboBox_4.currentText() 373 self.data.loc[index_of_value, '超期提醒'] = self.my_ui.comboBox_4.currentText() 374 self.prview() 375 # 下面代码让表格填满窗口 376 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) 377 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(0,QHeaderView.Interactive) 378 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(1, QHeaderView.Interactive) 379 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(2, QHeaderView.Interactive) 380 self.my_ui.tableView.horizontalHeader().setSectionResizeMode(3, QHeaderView.Interactive) 381 self.datachange_flag = True 382 383 def delate(self): 384 if self.index_row!=[]: 385 info=QMessageBox.information(self.my_MainWindow, "Information", "确定要删除吗?.",QMessageBox.Yes | QMessageBox.No) 386 print(info) 387 if info>20000: 388 return 389 dindex = self.model.index(self.index_row, 0) 390 item_data = self.model.data(dindex, Qt.DisplayRole) 391 index_of_value = self.data['序号'][self.data['序号'] == np.int64(item_data)].index[0] 392 self.data = self.data.drop(index_of_value) 393 print(self.data) 394 self.model.removeRow(dindex.row()) 395 396 def savedata(self): 397 if self.key_flag ==0: 398 if os.path.exists("DATA/任务跟踪表单.xlsx") == False: 399 QMessageBox.information(self.my_MainWindow, "Information", "任务清单文件不存在") 400 else: 401 # 新建线程开始计算 402 self.key_flag = 1 403 self.mywork = myworkthread(self.data) 404 self.mywork.finishsignal.connect(self.workend) 405 self.mywork.start() 406 407 #设置tableview某一行不能编辑 408 class EmptyDelegate(QItemDelegate): 409 def __init__(self,parent): 410 super(EmptyDelegate, self).__init__(parent) 411 def createEditor(self, QWidget, QStyleOptionViewItem, QModelIndex): 412 return None 413 414 #新建线程 415 class myworkthread(QThread): 416 finishsignal=QtCore.pyqtSignal(list) 417 def __init__(self,indata): 418 super(myworkthread,self).__init__() 419 self.indata=indata 420 421 def run(self): 422 #耗时程序 423 back_list = [] 424 back_list.append("savedata") 425 try: 426 self.indata.to_excel("DATA/任务跟踪表单.xlsx", index=False) 427 except Exception as exc: 428 error_str = str(exc) 429 back_list.append(error_str) 430 else: 431 back_list.append("Done") 432 self.finishsignal.emit(back_list) 433 434 #新建线程 435 class myworkthread1(QThread): 436 finishsignal=QtCore.pyqtSignal(list) 437 def __init__(self,indata): 438 super(myworkthread1,self).__init__() 439 self.indata=indata[0] 440 self.addres = indata[1] 441 442 def run(self): 443 #耗时程序 444 back_list = [] 445 back_list.append("savedata") 446 time.sleep(5) 447 try: 448 self.indata.to_excel("DATA/任务跟踪表单.xlsx", index=False) 449 except Exception as exc: 450 error_str = str(exc) 451 back_list.append(error_str) 452 else: 453 back_list.append("Done") 454 #定义时间列表 0是否1号 1是否到深夜 2是否周一 3是否周五 455 data_list=[] 456 # 获取当前时间 457 now = datetime.now() 458 # 获取今天的日期 459 today = datetime.today() 460 # 检查是否是1号 461 is_first_day_of_month = today.day == 1 462 data_list.append(is_first_day_of_month) 463 # 定义时间区间的开始和结束时间 464 start_time = datetime.strptime('%s 01:00:00'%str(now).split(" ")[0], '%Y-%m-%d %H:%M:%S') 465 end_time = datetime.strptime('%s 12:00:00'%str(now).split(" ")[0], '%Y-%m-%d %H:%M:%S') 466 # 判断当前时间是否在时间区间内 467 if start_time <= now <= end_time: 468 print("当前时间在指定时间区间内。") 469 data_list.append(True) 470 else: 471 print("当前时间不在指定时间区间内。") 472 data_list.append(False) 473 weekstr=self.get_weekday(str(now).split(" ")[0]) 474 print(self.get_weekday(str(now).split(" ")[0])) 475 if weekstr=="星期一": 476 data_list.append(True) 477 else: 478 data_list.append(False) 479 if weekstr == "星期五": 480 data_list.append(True) 481 else: 482 data_list.append(False) 483 print(data_list) 484 if data_list[1]: 485 print(self.indata.shape) 486 for i in range(self.indata.shape[0]): 487 print(i) 488 if self.indata["完成状态"][i]=="close": 489 continue 490 if self.indata["是否提醒"][i]=="否": 491 continue 492 date_obj = datetime.strptime(str(self.indata["承诺解决日期"][i]), "%Y/%m/%d") 493 if date_obj<now: 494 print("chaoqi") 495 state1=str(self.indata["超期提醒"][i]) == "每天" 496 state2=(str(self.indata["超期提醒"][i])=="每周Double")&(data_list[2]|data_list[3]) 497 state3=(str(self.indata["超期提醒"][i])=="每月")&data_list[0] 498 else: 499 state1 = str(self.indata["提醒周期"][i]) == "每天" 500 state2 = (str(self.indata["提醒周期"][i]) == "每周") & data_list[2] 501 state3 = (str(self.indata["提醒周期"][i]) == "每月") & data_list[0] 502 if state1 | state2 | state3: 503 print("获取相关数据,发送邮件") 504 self.finishsignal.emit(back_list) 505 506 def get_weekday(self,date_str): 507 # 将输入的日期字符串转换为datetime对象 508 date_obj = datetime.strptime(date_str, "%Y-%m-%d") 509 # 使用date.weekday()方法获取星期几(0-6,0表示星期一) 510 weekday = date_obj.weekday() 511 weekday_str = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] 512 return weekday_str[weekday] 513 514 if __name__=="__main__": 515 my_mainwindow()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2021-06-30 FPGA的Signaltap 文件
2020-06-30 ZLAN6042使用源码(modbus-tcp)