class WindowClass(QWidget): def __init__(self, parent=None): super(WindowClass, self).__init__(parent) self.btn = QPushButton(self) #self参数则让该按钮显示当前窗体中 self.btn.setText("选择日期") self.btn.move(0, 0) self.btn.clicked.connect(self.openCalendar) self.le = QLabel(self) self.cal = QCalendarWidget(self) self.cal.setMinimumDate(QDate(2017, 1, 1)) #设置日期最小范围 self.cal.setMaximumDate(QDate(2019, 12, 30)) #设置日期最大范围 self.cal.setGridVisible(True) #是否显示日期之间的网格 self.cal.move(5, 30) self.cal.hide() #隐藏日期控件 self.cal.clicked[QDate].connect( self.showDate) #clicked[参数],即定义showDate是传入的参数类型设置 date = self.cal.selectedDate() #获取选中日期,默认当前系统时间 self.le.setText(date.toString('yyyy-MM-dd dddd')) self.le.move(100, 8) self.setGeometry(100, 100, 400, 350) #设置当前窗体位置和大小 self.setWindowTitle("日历控件使用") def showDate(self, date): self.le.setText(date.toString("yyyy-MM-dd dddd")) self.cal.close() #关闭日期控件 def openCalendar(self): self.cal.show() #显示日期控件
class MyTable(QTableWidget): def __init__(self, r, c): super().__init__(r, c) self.FileOpenProcess = False self.ChangeDateProcess = False self.initUI() self.ProjectName = "" self.ProjectManager = "" self.Start = "" self.cal = QCalendarWidget(self) def initUI(self): self.cellChanged.connect(self.c_Current) self.cellClicked.connect(self.c_Clicked) self.show() def c_Current(self): if self.FileOpenProcess == False: row = self.currentRow() col = self.currentColumn() self.FileOpenProcess = True print ("row =" + str(row) + "coloumn = " + str(col) ) try: if int(col) == 6 : print ("in calculation") endDate = self.calculateEndDate(row) print (endDate) self.setItem(row, 7, QTableWidgetItem(str(endDate))) elif int(col) in (2,4): if self.circularcheck() : print("in change dependency" ) self.recalcDates(row) except: print ("in Exception") type, value, traceback = sys.exc_info() print (value) if (self.item(row,4) is None ): self.setItem(row,4,QTableWidgetItem("FS")) elif (self.item(row,2) is None ): self.setItem(row,2, QTableWidgetItem("0")) elif (self.item(row, 5) is None): self.setItem(row, 5, QTableWidgetItem(str(datetime.datetime.today()))) if (self.item(row, 6) is None): self.setItem(row, 6, QTableWidgetItem("1d")) elif (self.item(row, 6) is None): self.setItem(row, 6, QTableWidgetItem("1d")) self.recalcDates(row) else: warn = QMessageBox(QMessageBox.Warning, "Error!", "Could Not Calculate") warn.setStandardButtons(QMessageBox.Ok); warn.exec_() self.setItem(row, col, QTableWidgetItem(str(""))) self.FileOpenProcess = False def c_Clicked(self): if self.FileOpenProcess == False: row = self.currentRow() col = self.currentColumn() self.FileOpenProcess == True if int(col) in(5,7): self.myCal() def myCal(self): self.cal.setGridVisible(True) self.cal.move(QtGui.QCursor.pos().x(), QtGui.QCursor.pos().y()-60) print (self.mapToGlobal(QtGui.QCursor.pos())) self.ChangeDateProcess = True self.cal.clicked.connect(self.getDate) self.cal.setGridVisible(True) self.cal.show() def getDate(self): row = self.currentRow() col = self.currentColumn() if self.ChangeDateProcess: print (self.cal.selectedDate().toString()) date = str(datetime.datetime.strptime( self.cal.selectedDate().toString(), '%a %b %d %Y') + datetime.timedelta(hours=8)) self.setItem(row,col,QTableWidgetItem(date)) print (date) self.ChangeDateProcess = False self.cal.hide() else: pass def recalcDates(self, row): type = self.item(int(row),4).text() print (type) if row !=0: if type.lower() == "fs": startDate = self.item(int(self.item(int(row), 2).text()), 7).text() elif type.lower() == 'ss': startDate = self.item(int(self.item(int(row-1), 2).text()), 5).text() self.setItem(int(row),5, QTableWidgetItem(str(startDate))) self.setItem(int(row),7, QTableWidgetItem(str(self.calculateEndDate (row)))) def calculateEndDate(self, row): r = re.compile("([0-9]+)([a-zA-Z]+)") duration = str(self.item(row,6).text()) print(duration) m = r.match(duration) duration = int(m.group(1)) period = str(m.group(2)) ##2018-05-12 08:00:00 endDate = self.item(row,6).text() date = datetime.datetime.strptime( self.item(row,5).text() , '%Y-%m-%d %H:%M:%S') if period.lower() == 'h': enddate = date + datetime.timedelta(hours=int(duration)) print (endDate) elif period.lower() == 'm': enddate = date + datetime.timedelta(minutes=int(duration)) elif period.lower() == 'd': enddate = date + datetime.timedelta(days=int(duration)) elif period.lower() == 'w': enddate = date + datetime.timedelta(weeks=int(duration)) else: QMessageBox.warning(self.view, 'Wrong Format', msg) return(enddate) def openProject(self): self.FileOpenProcess = True file = QFileDialog.getOpenFileName(self, 'Open NPF', os.getenv('HOME'), 'NPF(*.npf)') if file[0] != '': print (file[0]) with open(file[0], newline='') as csv_file: self.setRowCount(0) self.setColumnCount(9) my_file = csv.reader(csv_file, dialect='excel') for row_data in my_file: row = self.rowCount() self.insertRow(row) if len(row_data) > 8: self.setColumnCount(len(row_data)) for column, stuff in enumerate(row_data): item = QTableWidgetItem(stuff) self.setItem(row, column, item) self.FileOpenProcess = False def saveProject(self): path = QFileDialog.getSaveFileName(self, 'Save Project', os.getenv('HOME'), 'NPF(*.npf)') if path[0] != '': with open(path[0], 'w', newline = '') as csv_file: writer = csv.writer(csv_file, dialect='excel') for row in range(self.rowCount()): row_data = [] for column in range(self.columnCount()): item = self.item(row, column) if item is not None: row_data.append(item.text()) else: row_data.append('') writer.writerow(row_data) def add_row(self): rows = self.rowCount() self.setRowCount(self.rowCount() + 1) def remove_row(self): row = self.currentRow() cancel = False if row is not None: for i in range (0,8): data = self.item(row,i) if data is not None: reply = QMessageBox.question( self, 'Confirm Delete, There is data in this row', 'Are you sure you want to delete this row?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: i = 9 cancel = False else: cancel = True if cancel == False: self.removeRow(row) def indent_task(self): self.FileOpenProcess = True row = self.currentRow() print ("Current Row == " + str(row)) if row != 0: currentItemIndent = len(str(self.item(row,2).text())) - len(str(self.item(row,2).text()).lstrip()) parentrow = self.findParent(row,currentItemIndent) parent = str(self.item(parentrow,3).text()) parentIndent = len(parent) - len(parent.lstrip()) currentItem = str(self.item(row,3).text()).lstrip() print ("Indent Level == " + str(parentIndent+4)) if currentItemIndent < parentIndent: futureIndent = parentIndent +4 elif currentItemIndent == 0: futureIndent = 4 elif currentItemIndent > parentIndent: futureIndent = parentIndent + 4 for i in range (1,futureIndent): currentItem = " " + currentItem self.setItem(row, 3, QTableWidgetItem(currentItem)) self.renumber() self.FileOpenProcess = False def findParent(self,row,currentItemIndent): parentrow = row for i in range (row,0, -1): parent_indent = len(str(self.item(i,3).text())) - len(str(self.item(i,3).text()).lstrip()) if parent_indent > currentItemIndent: parentrow = i print ("Parent Indent = " + str (parent_indent) + "Current Indent ==" + str(currentItemIndent)) break print (parentrow) return (parentrow -1) def renumber(self): rowsNo = int(self.rowCount()) for i in range (0,rowsNo): if i == 0: self.setItem(i, 1, QTableWidgetItem("1.0")) else: #print ("i ====" + str(i)) #print ("Previous Item Value ====" + self.item(i-1,3).text()) #print("Previous WBS ID ====" + self.item(i-1,1).text()) currentText = str(self.item(i,3).text()) PrevWbsID = float(str(self.item(i-1,1).text())) prevIndent = len(currentText) - len(currentText.lstrip()) wbsDeapth = int(prevIndent/4) #print (wbsDeapth) self.setItem(i,1,QTableWidgetItem(str(PrevWbsID +1))) def outdent_task(self): row = self.currentRow() itemName = str(self.item(row,3).text()) checkforSpaces = itemName[:4] print ('Left' + itemName[:4]) if checkforSpaces.strip() == '': newText =itemName[4:] self.setItem(row,3,QTableWidgetItem(newText))
class GUI(): def __init__(self, app): self.app = app self.var = 1 self.initUI() def initUI(self): #Input text boxes self.text_company = QLineEdit(self.app) self.text_company.move(120, 100) self.cal = QCalendarWidget(self.app) self.cal.hide() self.cal.move(120, 180) self.lbl = QLabel('\t\t', self.app) self.lbl.hide() self.lbl.move(120, 350) self.text_amount = QLineEdit(self.app) self.text_amount.hide() self.text_amount.move(120, 140) #Lables self.company = QLabel('Comapny', self.app) self.company.move(30, 100) self.buy_label = QLabel('Buy date', self.app) self.buy_label.move(30, 180) self.buy_label.hide() self.amount = QLabel('Amount', self.app) self.amount.hide() self.amount.move(30, 140) #Buttons self.quit = QPushButton('Quit button', self.app) self.quit.resize(self.quit.sizeHint()) self.quit.move(630, 428) self.Enter = QPushButton('Enter', self.app) self.Enter.resize(self.Enter.sizeHint()) self.Enter.move(300, 100) #General self.LED = QPixmap("Logo.PNG") self.pic = QLabel(self.app) self.pic.setPixmap(self.LED) self.pic.show() #self.submit.clicked.connect(self.Push_Submit) self.Enter.clicked.connect(self.get_input) self.quit.clicked.connect(QCoreApplication.instance().quit) #Franme self.app.setGeometry(400, 180, 700, 450) self.app.setWindowTitle('SCE') self.app.setWindowIcon(QIcon('icon.png')) self.app.show() def get_input(self): if self.var == 1: if len(self.text_company.text()) == 0: QMessageBox.warning(self.app, 'Error!!', 'must type a name') else: self.text_company.setText(self.text_company.text().upper()) self.text_company.setText(self.text_company.text().upper()) self.text_company.setDisabled(True) self.text_amount.show() self.amount.show() self.var = self.var + 1 self.Enter.move(300, 140) elif self.var == 2: try: if int(self.text_amount.text()) <= 0: QMessageBox.warning(self.app, 'Error!!', 'Must be more then zero') else: self.text_amount.setText(self.text_amount.text()) self.text_amount.setDisabled(True) #self.cal.H() self.lbl.show() self.var = self.var + 1 self.Enter.move(300, 350) self.Enter.setText('Show Calender..') self.Enter.resize(self.Enter.sizeHint()) except: QMessageBox.warning(self.app, 'Error!!', 'Must be an integer number') elif self.var == 3: self.cal.show() self.Enter.setText('Select date..') self.Enter.resize(self.Enter.sizeHint()) self.cal.clicked[QtCore.QDate].connect(self.showDate) def showDate(self, date): date_var_date = parse_date(date.toString(), fuzzy=True) date_var = date_var_date.strftime("%d-%b-%Y") today = datetime.today() self.lbl.setText(date_var) self.lbl.move(120, 180) self.buy_label.show() if date_var_date < today: QMessageBox.warning(self.app, 'Error!!', 'Date must be future') else: self.cal.hide() self.Enter.hide() self.Data(date_var_date) def Data(self, date_var_date): Extract_Data(self.text_company.text(), Min_Date, Max_Date) Regression(str(self.company), date_var_date, int(self.text_amount.text())) self.text_Cost = QLineEdit(self.app) self.text_Cost.move(300, 220) self.cost = QLabel( 'The value of th stock at the day that you want to buy ', self.app) self.cost.resize(self.cost.sizeHint()) self.cost.move(30, 220) self.text_profit = QLineEdit(self.app) self.text_profit.move(300, 260) self.profit = QLabel('Your amount after a week from the buy date', self.app) self.profit.resize(self.profit.sizeHint()) self.profit.move(30, 260) self.text_Cost.show() self.cost.show() self.text_profit.show() self.profit.show() self.text_Cost.setText(str(extracted_items.Cost[0][0])) self.text_profit.setText(str(extracted_items.Profit[0][0]))
class FourthMode(MiddleWidget): def __init__(self, obj, name): super().__init__(obj, name) self._thread = None self._obj = obj self.name = name self.row = 2 self.set_up() def set_up(self): middle_widget = QWidget() self.middle_layout = QGridLayout() middle_widget.setLayout(self.middle_layout) for i in range(self.row): middle_icon = QLabel(chr(0xf002) + f'目录_{i}:') middle_icon.setFont(qtawesome.font('fa', 12)) middle_icon.setFixedSize(50, self.height) middle_input = QLineEdit() middle_input.setFixedHeight(self.height) middle_input.setObjectName(f'middle_input_{i}') middle_btn = QPushButton("…") middle_btn.setFixedSize(50, self.height) middle_btn.setObjectName(f'middle_btn_{i}') middle_btn.setToolTip('点击选择文件') middle_btn.clicked.connect(lambda: self.open_file(middle_widget)) self.middle_layout.addWidget(middle_icon, i, 0, 1, 1) self.middle_layout.addWidget(middle_input, i, 1, 1, self.row - 1) self.middle_layout.addWidget(middle_btn, i, self.row, 1, 1) middle_icon = QLabel(chr(0xf002) + f'目录_{i}:') middle_icon.setFont(qtawesome.font('fa', 12)) middle_icon.setFixedSize(50, self.height) self.middle_time = QLineEdit() self.middle_time.setFixedHeight(self.height) self.middle_time.setObjectName(f'middle_input_{i}') btn = QPushButton("选择日期") btn.clicked.connect(self.openCalendar) self.cal = QCalendarWidget() self.cal.setGridVisible(True) # 是否显示日期之间的网格 self.cal.setFixedSize(250, 200) self.cal.hide() # 隐藏日期控件 self.cal.clicked[QDate].connect( self.showDate) # clicked[参数],即定义showDate是传入的参数类型设置 self.middle_layout.addWidget(middle_icon, 2, 0, 1, 1) self.middle_layout.addWidget(self.middle_time, 2, 1, 1, self.row - 1) self.middle_layout.addWidget(btn, 2, self.row, 1, 1) self.middle_layout.addWidget(self.cal, 3, 1, 1, 1) self.middle_layout.setAlignment(Qt.AlignTop) self._obj.mid_layout.addWidget(middle_widget, 0, 0, 1, 1) set_first_mode_style(middle_widget) return True def showDate(self, date): self.middle_time.setText(date.toString("yyyy-MM-dd dddd")) self.cal.close() # 关闭日期控件 def openCalendar(self): self.cal.show() # 显示日期控件 def get_data(self): self.children = self.middle_layout.count() print(self.children) keys = [ self.middle_layout.itemAt(i).widget().text() for i in range(self.children) if not (i % 3) ] values = [ self.middle_layout.itemAt(i).widget().text() for i in range(self.children) if i % 3 == 1 ] for i in range(self.children // 3): input_val = values[i].strip() if not input_val: continue elif not os.path.exists(input_val): print("file path error") return else: self.data[keys[i]] = input_val return True def set_widget_enable(self, flag=False): # 禁止btn等 if flag: self.reset_progress() else: self._obj.tail_btn.setEnabled(True) for widget in (self.middle_layout.itemAt(i).widget() for i in range(self.children) if i % 3): widget.setDisabled(flag) def run(self): if not self.get_data(): raise GetDataError("获取页面路径错误") if not self.data: print("界面参数不能为空") return try: self.create_thread_run() except: self.set_widget_enable() traceback.print_exc() def create_thread_run(self): self._thread = MyThread() self._thread.sig_str.connect(self.output_log_info) self._thread.sig_int.connect(self.set_progress) # self._thread.get_data(self.data) self._thread.get_obj(self) # 线程启动时禁止button和重置进度条 # 运行后控件禁止再点击 self.set_widget_enable(True) self._thread.start()
class NewFilterWidget(QGroupBox): def __init__(self, parent, filter_widget): super().__init__(parent=parent) self.parent=parent self.filter_widget=filter_widget self.global_layout=QHBoxLayout() self.setLayout(self.global_layout) self.item1=QComboBox() for column in Filter.columns: self.item1.addItem(column) self.global_layout.addWidget(self.item1) self.item2=QComboBox() for operation in ['<','<=','=','>','>=']: self.item2.addItem(operation) self.global_layout.addWidget(self.item2) self.item3=QLineEdit() self.global_layout.addWidget(self.item3) self.calendar=QCalendarWidget() self.global_layout.addWidget(self.calendar) self.calendar.hide() self.remove_button=QToolButton() folder=os.path.split(inspect.getfile(Curve))[0] self.remove_button.setIcon(QtGui.QIcon(os.path.join(folder,'minus.png'))) self.global_layout.addWidget(self.remove_button) self.remove_button.clicked.connect(self.remove) self.activate_box = QCheckBox('activate') self.global_layout.addWidget(self.activate_box) self.item1.currentTextChanged.connect(self.columnchanged) def columnchanged(self, text): if text=='date': self.item3.hide() self.calendar.show() self.item2.clear() for operation in ['<','<=','=','>','>=']: self.item2.addItem(operation) elif text in ['name', 'project', 'sample']: self.calendar.hide() self.item2.clear() self.item3.show() for operation in ['=', 'contains']: self.item2.addItem(operation) else: self.calendar.hide() self.item3.show() self.item2.clear() for operation in ['<','<=','=','>','>=']: self.item2.addItem(operation) def remove(self): for widget in [self.remove_button,self.item1, self.item2, self.item3, self.activate_box]: widget.hide() self.global_layout.removeWidget(widget) self.filter_widget.remove_filter(self) self.hide() def get_query(self): if self.item1.currentText() in ['id', 'parent', 'sample', 'project', 'name']: return Filter(self.item1.currentText(), self.item2.currentText(), self.item3.text()) if self.item1.currentText()=='date': date=self.calendar.selectedDate() if self.item2.currentText() in ['<','>=']: t=datetime(date.year(), date.month(), date.day()).timestamp() return Filter(self.item1.currentText(), self.item2.currentText(), str(t)) elif self.item2.currentText() in ['>','<=']: t=datetime(date.year(), date.month(), date.day()+1).timestamp() return Filter(self.item1.currentText(), self.item2.currentText(), str(t)) elif self.item2.currentText()=='=': t1=datetime(date.year(), date.month(), date.day()).timestamp() t2=datetime(date.year(), date.month(), date.day()+1).timestamp() return [Filter(self.item1.currentText(), '>', str(t1)), Filter(self.item1.currentText(), '<', str(t2))]