def add_date_field(self, f_title, top, left, f_date, widthchange=0, need_calendar=True, default_value=QDate(1980, 1, 1), readonly=False, label_margin=2, label_font_size=LABEL_FONT_SIZE, field_size=4): label = QLabel(self.parent) label.setText(f_title) font = QFont() font.setPointSize(label_font_size) label.setFont(font) geo_label = QRect(left * self.width_step, top, label_margin * self.width_step, 30) label.setGeometry(geo_label) field = QDateEdit(self.parent) field.setCalendarPopup(need_calendar) geo_field = QRect((left + label_margin) * self.width_step, top, field_size * self.width_step, 30) field.setGeometry(geo_field) if f_date: Defdate = QDate(int(f_date.split('.')[2]), int(f_date.split('.')[1]), int(f_date.split('.')[0])) else: Defdate = default_value field.setDate(Defdate) field.setReadOnly(readonly) return field
class dateWidget(QWidget): def __init__(self, parent): super(dateWidget, self).__init__(parent=parent) self.start = 0 self.end = 0 # -------------------------------------------------------------------- # Date picker self.label_from = QLabel('From', parent) self.label_from.setAlignment(Qt.AlignCenter) self.label_from.setFont(QFont("Open Sans Bold", 12)) self.label_from.setStyleSheet("background-color: rgb(134,194,50);" "color: rgb(255,255,255);") self.label_from.resize(100, 20) self.label_from.move(20, 60) self.d1 = QDateEdit(parent, calendarPopup=True) self.d1.setDateTime(QDateTime.currentDateTime()) self.d1.setStyleSheet("background-color: rgb(255, 255, 255);") self.d1.setGeometry(20, 80, 100, 25) #self.d1.dateChanged.connect(self.date_change) label_to = QLabel('To', parent) label_to.setAlignment(Qt.AlignCenter) label_to.setFont(QFont("Open Sans Bold", 12)) label_to.setStyleSheet("background-color: rgb(134,194,50);" "color: rgb(255,255,255);") label_to.resize(100, 20) label_to.move(140, 60) self.d2 = QDateEdit(parent, calendarPopup=True) self.d2.setDateTime(QDateTime.currentDateTime()) self.d2.setStyleSheet("background-color: rgb(255, 255, 255);") self.d2.setGeometry(140, 80, 100, 25) def date_change(self): self.start = self.d1.dateTime().toString('yyyy-MM-dd') self.end = self.d2.dateTime().toString('yyyy-MM-dd')
def initUI(self): frame = QFrame() # frame.setStyleSheet("background-color: rgb(30, 45, 66);") frame.setFrameShape(QFrame.StyledPanel) frame.setFrameShadow(QFrame.Raised) # frame.setMinimumWidth(430) # frame.setFixedHeight(395) frame.setStyleSheet("border: none") add_employee_button = QLabel(frame) add_employee_button.setAlignment(Qt.AlignCenter) add_employee_button.setGeometry(QRect(110, 30, 210, 41)) add_employee_button.setStyleSheet( "font: 75 12pt \"MS Shell Dlg 2\";\n" "background-color: rgb(30, 45, 66);\n" "color: rgb(255, 255, 255);") add_employee_button.setText("Add Product Details") namelabel = QLabel(frame) namelabel.setText("Name") namelabel.setGeometry(QRect(70, 100, 47, 13)) nametextbox = QLineEdit(frame) nametextbox.setGeometry(QRect(160, 90, 181, 31)) nametextbox.setFixedWidth(180) categorylabel = QLabel(frame) categorylabel.setText("Category") categorylabel.setGeometry(QRect(70, 140, 61, 16)) categorytextbox = QComboBox(frame) categorytextbox.setGeometry(QRect(160, 130, 181, 31)) categorytextbox.setFixedWidth(180) categorytextbox.addItems(["Pizza", "Burger"]) quantitylabel = QLabel(frame) quantitylabel.setText("Quantity") quantitylabel.setGeometry(QRect(70, 180, 47, 13)) quantitytextbox = QLineEdit(frame) quantitytextbox.setGeometry(QRect(160, 170, 181, 31)) quantitytextbox.setFixedWidth(180) pricelabel = QLabel(frame) pricelabel.setText("Price") pricelabel.setGeometry(QRect(70, 220, 47, 13)) pricetextbox = QLineEdit(frame) pricetextbox.setGeometry(QRect(160, 210, 181, 31)) pricetextbox.setFixedWidth(180) sellingpricelabel = QLabel(frame) sellingpricelabel.setText("Selling Price") sellingpricelabel.setGeometry(QRect(70, 260, 90, 16)) sellingpricetextbox = QDateEdit(frame) sellingpricetextbox.setGeometry(QRect(160, 250, 181, 31)) sellingpricetextbox.setFixedWidth(180) sellingpricetextbox.setDate(QDate.currentDate()) sellingpricetextbox.setMinimumDate(QDate.currentDate()) addbutton = QPushButton(frame) addbutton.setText("Add Product") addbutton.setGeometry(QRect(160, 300, 111, 31)) addbutton.setStyleSheet("font: 75 12pt \"MS Shell Dlg 2\";\n" "background-color: rgb(30, 45, 66);\n" "color: rgb(255, 255, 255);") layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(frame) self.setLayout(layout) self.setWindowTitle("Add Employee Details") self.resize(430, 395) self.show() self.center()
class AddBookingDetails(QMainWindow): closing = pyqtSignal(int) def __init__(self, parent, update, id=None): super().__init__(parent) self.db = DB() self.initUI(update, id) def initUI(self, update, id): self.setWindowModality(Qt.ApplicationModal) frame = QFrame() # frame.setStyleSheet("background-color: rgb(30, 45, 66);") frame.setFrameShape(QFrame.StyledPanel) frame.setFrameShadow(QFrame.Raised) # frame.setMinimumWidth(430) # frame.setFixedHeight(395) # frame.setStyleSheet("border: none") add_booking_button = QLabel(frame) add_booking_button.setAlignment(Qt.AlignCenter) add_booking_button.setGeometry(QRect(110, 30, 210, 41)) add_booking_button.setStyleSheet("font: 75 12pt \"MS Shell Dlg 2\";\n" "background-color: rgb(30, 45, 66);\n" "color: rgb(255, 255, 255);") add_booking_button.setText("Add Reservation Details") # tablelabel = QLabel(frame) # tablelabel.setText("Table") # tablelabel.setGeometry(QRect(50, 120, 81, 20)) # # tabletextbox = QComboBox(frame) # tabletextbox.setGeometry(QRect(170, 110, 181, 31)) # tabletextbox.setFixedWidth(180) # tabletextbox.addItems(["Table 1", "Table 2"]) customernamelabel = QLabel(frame) customernamelabel.setText("Customer Name") customernamelabel.setGeometry(QRect(50, 120, 100, 20)) self.customernametextbox = QLineEdit(frame) self.customernametextbox.setGeometry(QRect(170, 110, 181, 31)) self.customernametextbox.setFixedWidth(180) customercontactlabel = QLabel(frame) customercontactlabel.setText("Customer Contact") customercontactlabel.setGeometry(QRect(50, 160, 145, 19)) self.customercontacttextbox = QLineEdit(frame) self.customercontacttextbox.setGeometry(QRect(170, 150, 181, 31)) self.customercontacttextbox.setFixedWidth(180) datelabel = QLabel(frame) datelabel.setText("Date") datelabel.setGeometry(QRect(50, 200, 145, 19)) self.datetextbox = QDateEdit(frame) self.datetextbox.setGeometry(QRect(170, 190, 181, 31)) self.datetextbox.setFixedWidth(180) self.datetextbox.setDate(QDate.currentDate()) self.datetextbox.setMinimumDate(QDate.currentDate()) self.datetextbox.setDisplayFormat("dd-MM-yyyy") starttimelabel = QLabel(frame) starttimelabel.setText("Start Time") starttimelabel.setGeometry(QRect(50, 240, 121, 16)) self.starttimetextbox = QTimeEdit(frame) self.starttimetextbox.setGeometry(QRect(170, 230, 181, 31)) self.starttimetextbox.setFixedWidth(180) # self.starttimetextbox.setTime(QDate.currentDate()) # self.starttimetextbox.setMinimumDate(QDate.currentDate()) self.addbutton = QPushButton(frame) self.addbutton.setText("Add Booking") self.addbutton.setGeometry(QRect(160, 300, 151, 31)) self.addbutton.setStyleSheet("font: 75 12pt \"MS Shell Dlg 2\";\n" "background-color: rgb(30, 45, 66);\n" "color: rgb(255, 255, 255);") # self.addbutton.clicked.connect(lambda: self.add_button_click("reservations")) if update == 'add': print("Add") print(id) self.addbutton.setText("Add Reservation") self.addbutton.clicked.connect( lambda: self.add_button_click("reservations")) else: print("Update") print(id) self.addbutton.setText("Update Reservation") self.addbutton.clicked.connect( lambda: self.update_button_click("reservations", id)) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(frame) centralWidget = QWidget() centralWidget.setLayout(layout) self.setCentralWidget(centralWidget) # self.setLayout(layout) self.setWindowTitle("Add Reservation Details") self.resize(430, 395) self.show() self.center() def center(self): '''centers the window on the screen''' screen = QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2) def update_button_click(self, where, id): if where == "reservations": print("Tables Finally here") customer_name = self.customernametextbox.text() customer_contact = self.customercontacttextbox.text() start_time = self.starttimetextbox.text() try: date = datetime.datetime.strptime(self.datetextbox.text(), "%d-%m-%Y") booking_date = datetime.datetime.strftime(date, "%Y-%m-%d") except Exception as e: ''' Make sure to add an error message. ''' print(e) return if customer_name != "" and customer_contact != "": query = "update customerBooking set `customer_name`=%s, " \ "`phone_number`=%s, `booking_date`=concat(%s, ' ', %s)" \ "where id=%s;" values = (customer_name, customer_contact, booking_date, start_time, id) result = self.db.execute(query, values) self.closeEvent = self.message() def add_button_click(self, where): if where == "reservations": print("Finally here") customer_name = self.customernametextbox.text() customer_contact = self.customercontacttextbox.text() start_time = self.starttimetextbox.text() try: date = datetime.datetime.strptime(self.datetextbox.text(), "%d-%m-%Y") booking_date = datetime.datetime.strftime(date, "%Y-%m-%d") except Exception as e: ''' Make sure to add an error message. ''' print(e) return if customer_name != "" and customer_contact != "": print("Got Here") query = "insert into customerBooking (`customer_name`, `phone_number`, `booking_date`)" \ "values (%s, %s, concat(%s, ' ', %s));" values = (customer_name, customer_contact, booking_date, start_time) result = self.db.execute(query, values) self.closeEvent = self.message() def message(self): self.closing.emit(1) self.close()
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.textSuffix = QTextEdit(self.centralwidget) self.textSuffix.setGeometry(QRect(20, 230, 261, 31)) self.textSuffix.setObjectName("textSuffix") self.textRiskf = QTextEdit(self.centralwidget) self.textRiskf.setGeometry(QRect(20, 360, 261, 31)) self.textRiskf.setObjectName("textRiskf") self.label = QLabel(self.centralwidget) self.label.setGeometry(QRect(20, 330, 261, 20)) self.label.setObjectName("label") self.label_2 = QLabel(self.centralwidget) self.label_2.setGeometry(QRect(20, 270, 281, 21)) self.label_2.setObjectName("label_2") self.label_3 = QLabel(self.centralwidget) self.label_3.setGeometry(QRect(20, 200, 261, 16)) self.label_3.setObjectName("label_3") self.label_4 = QLabel(self.centralwidget) self.label_4.setGeometry(QRect(20, 130, 261, 21)) self.label_4.setObjectName("label_4") self.label_5 = QLabel(self.centralwidget) self.label_5.setGeometry(QRect(20, 60, 261, 21)) self.label_5.setObjectName("label_5") self.startButton = QPushButton(self.centralwidget) self.startButton.setGeometry(QRect(20, 510, 111, 31)) self.startButton.setObjectName("startButton") self.label_6 = QLabel(self.centralwidget) self.label_6.setGeometry(QRect(20, 10, 261, 41)) font = QFont() font.setFamily("Times New Roman") font.setPointSize(12) font.setBold(True) font.setUnderline(True) font.setWeight(75) self.label_6.setFont(font) self.label_6.setObjectName("label_6") self.resultBrowser = QTextBrowser(self.centralwidget) self.resultBrowser.setGeometry(QRect(310, 30, 461, 501)) self.resultBrowser.setObjectName("resultBrowser") self.DateStart = QDateEdit(self.centralwidget) self.DateStart.setGeometry(QRect(20, 90, 121, 31)) self.DateStart.setMaximumDate(QDate(2050, 12, 31)) self.DateStart.setMinimumDate(QDate(1990, 12, 31)) self.DateStart.setDate(QDate(2018, 1, 1)) self.DateStart.setObjectName("DateStart") self.DateEnd = QDateEdit(self.centralwidget) self.DateEnd.setGeometry(QRect(19, 163, 121, 31)) self.DateEnd.setDateTime(QDateTime(QDate(2018, 1, 1), QTime(0, 0, 0))) self.DateEnd.setMaximumDateTime(QDateTime(QDate(2050, 12, 31), QTime(23, 59, 59))) self.DateEnd.setMinimumDate(QDate(1990, 12, 31)) self.DateEnd.setObjectName("DateEnd") self.spinBoxMode = QSpinBox(self.centralwidget) self.spinBoxMode.setGeometry(QRect(20, 290, 71, 31)) self.spinBoxMode.setMinimum(1) self.spinBoxMode.setMaximum(3) self.spinBoxMode.setObjectName("spinBoxMode") self.label_7 = QLabel(self.centralwidget) self.label_7.setGeometry(QRect(170, 300, 101, 21)) self.label_7.setObjectName("label_7") self.endButton = QPushButton(self.centralwidget) self.endButton.setGeometry(QRect(160, 510, 121, 31)) self.endButton.setObjectName("endButton") self.fileButton = QPushButton(self.centralwidget) self.fileButton.setGeometry(QRect(20, 410, 261, 31)) self.fileButton.setObjectName("fileButton") self.pathBrowser = QTextBrowser(self.centralwidget) self.pathBrowser.setGeometry(QRect(20, 450, 261, 41)) self.pathBrowser.setObjectName("pathBrowser") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setGeometry(QRect(0, 0, 800, 23)) self.menubar.setObjectName("menubar") self.menuAnalysis = QMenu(self.menubar) self.menuAnalysis.setObjectName("menuAnalysis") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.menubar.addAction(self.menuAnalysis.menuAction()) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) #################################################### self.mythread = MyThread() self.mainthread = MyMainThread() self.fileButton.clicked.connect(lambda : self.file_path()) self.mythread.trigger.connect(self.update_text) self.mainthread.result.connect(self.update_result) self.startButton.clicked.connect(lambda : self.input_Parameters()) self.startButton.clicked.connect(lambda : self.mainthread.start()) self.startButton.clicked.connect(lambda : self.mythread.start()) self.endButton.clicked.connect(lambda : self.end_calculation()) def input_Parameters(self): self.aa = str(self.DateStart.date().toString("yyyyMMdd")) self.bb = str(self.DateEnd.date().toString("yyyyMMdd")) self.cc = str(self.textSuffix.toPlainText()) self.dd = int(self.spinBoxMode.value()) self.ee = float(self.textRiskf.toPlainText()) if self.dd==1: self.dx='p1f1' elif self.dd==2: self.dx='p0f1' elif self.dd==3: self.dx='p1f0' else: raise Exception('Running Mode is wrong') self.mainthread.parameters_in = [self.aa ,self.bb, self.cc, self.dx, self.ee, self.directory1] def file_path(self): self.directory1 = QFileDialog.getExistingDirectory(self.centralwidget,"Please choose folder","/")+'/' self.pathBrowser.append(str(self.directory1)) def update_text(self, message): self.resultBrowser.append(str(message)) def update_result(self,message): self.mythread.stop_() sleep(1) self.resultBrowser.append(str(message)) print(self.mainthread.str_result) for i in self.mainthread.str_result: print(i) self.resultBrowser.append(i) def end_calculation(self): self.mythread.stop_() self.mainthread.stop_() sleep(1) self.resultBrowser.append('\nCalculation terminated by user...') def retranslateUi(self, MainWindow): _translate = QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label.setText(_translate("MainWindow", "Please input risk free rate(0.035)")) self.label_2.setText(_translate("MainWindow", "Choose a running mode(e.g (1)p1f1/(2)p0f1")) self.label_3.setText(_translate("MainWindow", "Please input the suffix for result file")) self.label_4.setText(_translate("MainWindow", "Please input earliest date(e.g 2018-01-01)")) self.label_5.setText(_translate("MainWindow", "Please input latest date(e.g 2018-12-30)")) self.startButton.setText(_translate("MainWindow", "Start Analysis")) self.label_6.setText(_translate("MainWindow", "Barra Contribution Analysis(v_test)")) self.label_7.setText(_translate("MainWindow", " (3)p1f0")) self.endButton.setText(_translate("MainWindow", "End Process")) self.fileButton.setText(_translate("MainWindow", "Choose a folder")) self.menuAnalysis.setTitle(_translate("MainWindow", "Analysis"))
class YuToolsDailyPlan(QWidget): def __init__(self): super().__init__() ActionDao.auto_update_action() self.txt_content = QPlainTextEdit(self) self.txt_content.setGeometry(10, 10, 350, 50) self.rb_begin = QRadioButton(self) self.rb_begin.setText('Begin') self.rb_begin.setChecked(True) self.rb_begin.setGeometry(10, 70, 50, 22) self.de_begin = QDateEdit(self) self.de_begin.setDate(QDate.currentDate()) self.de_begin.setGeometry(70, 70, 90, 22) self.rb_begin.clicked.connect( lambda: self.rb_select_date(self.de_begin)) self.rb_deadline = QRadioButton(self) self.rb_deadline.setText("Deadline") self.rb_deadline.setGeometry(180, 70, 60, 22) self.de_deadline = QDateEdit(self) self.de_deadline.setDate(QDate.currentDate().addDays(7)) self.de_deadline.setGeometry(250, 70, 90, 22) self.rb_deadline.clicked.connect( lambda: self.rb_select_date(self.de_deadline)) self.calendar_select = QCalendarWidget(self) self.calendar_select.setGeometry(10, 100, 256, 190) self.calendar_select.clicked.connect(self.select_date) self.combo_frequency = QComboBox(self) self.combo_frequency.addItem(PlanFrequency.NoRepeat.name) self.combo_frequency.addItem(PlanFrequency.Day.name) self.combo_frequency.addItem(PlanFrequency.Week.name) self.combo_frequency.addItem(PlanFrequency.Month.name) self.combo_frequency.addItem(PlanFrequency.Quarter.name) self.combo_frequency.addItem(PlanFrequency.Year.name) self.combo_frequency.setGeometry(280, 100, 80, 26) self.sb_repeat = QSpinBox(self) self.sb_repeat.setMinimum(1) self.sb_repeat.setGeometry(280, 130, 80, 26) self.cb_include = QCheckBox(self) self.cb_include.setText("Include Begin") self.cb_include.setChecked(True) self.cb_include.setGeometry(280, 160, 80, 26) self.combo_importance = QComboBox(self) self.combo_importance.addItem('Important') self.combo_importance.addItem('Unimportant') self.combo_importance.setGeometry(280, 190, 80, 26) self.combo_urgency = QComboBox(self) self.combo_urgency.addItem('Urgent') self.combo_urgency.addItem('Non-Urgent') self.combo_urgency.setGeometry(280, 220, 80, 26) self.btn_save = QPushButton(self) self.btn_save.setGeometry(280, 260, 80, 26) self.btn_save.setText("Save") self.btn_save.clicked.connect(self.save_plan) self.tb_plan = QTableView(self) self.tb_plan.horizontalHeader().setStretchLastSection(True) self.tb_plan.horizontalHeader().setSectionResizeMode( QHeaderView.Custom) self.tb_plan.verticalHeader().hide() self.tb_plan.setGeometry(370, 10, 421, 281) self.line_importance = QFrame(self) self.line_importance.setGeometry(390, 295, 20, 435) self.line_importance.setFrameShape(QFrame.VLine) self.line_importance.setFrameShadow(QFrame.Sunken) self.line_urgency = QFrame(self) self.line_urgency.setGeometry(5, 480, 791, 16) self.line_urgency.setFrameShape(QFrame.HLine) self.line_urgency.setFrameShadow(QFrame.Sunken) self.combo_ac_list_filter = QComboBox(self) self.combo_ac_list_filter.addItem('Wait') self.combo_ac_list_filter.addItem('Going') self.combo_ac_list_filter.addItem('Done') self.combo_ac_list_filter.addItem('Cancel') self.combo_ac_list_filter.addItem('Expire') self.combo_ac_list_filter.addItem('Will') self.combo_ac_list_filter.addItem('All') self.combo_ac_list_filter.setCurrentIndex(1) self.combo_ac_list_filter.setGeometry(375, 478, 50, 20) self.combo_ac_list_filter.currentIndexChanged.connect( self.change_tb_ac_list) self.tb_ac_first = QTableView(self) self.tb_ac_first.horizontalHeader().setStretchLastSection(True) self.tb_ac_first.horizontalHeader().setSectionResizeMode( QHeaderView.Custom) self.tb_ac_first.verticalHeader().hide() self.tb_ac_first.setItemDelegateForColumn( 3, ActionStatusDelegate(self.tb_ac_first)) self.tb_ac_first.setGeometry(410, 300, 381, 178) self.tb_ac_second = QTableView(self) self.tb_ac_second.horizontalHeader().setStretchLastSection(True) self.tb_ac_second.horizontalHeader().setSectionResizeMode( QHeaderView.Custom) self.tb_ac_second.verticalHeader().hide() self.tb_ac_second.setItemDelegateForColumn( 3, ActionStatusDelegate(self.tb_ac_second)) self.tb_ac_second.setGeometry(10, 300, 381, 178) self.tb_ac_third = QTableView(self) self.tb_ac_third.horizontalHeader().setStretchLastSection(True) self.tb_ac_third.horizontalHeader().setSectionResizeMode( QHeaderView.Custom) self.tb_ac_third.verticalHeader().hide() self.tb_ac_third.setItemDelegateForColumn( 3, ActionStatusDelegate(self.tb_ac_third)) self.tb_ac_third.setGeometry(10, 498, 381, 178) self.tb_ac_fourth = QTableView(self) self.tb_ac_fourth.horizontalHeader().setStretchLastSection(True) self.tb_ac_fourth.horizontalHeader().setSectionResizeMode( QHeaderView.Custom) self.tb_ac_fourth.verticalHeader().hide() self.tb_ac_fourth.setItemDelegateForColumn( 3, ActionStatusDelegate(self.tb_ac_fourth)) self.tb_ac_fourth.setGeometry(410, 498, 381, 178) self.tb_acs = { 1: self.tb_ac_first, 2: self.tb_ac_second, 3: self.tb_ac_third, 4: self.tb_ac_fourth } self.refresh_tb_plan() for index in range(1, 5): self.refresh_tb_action(index) def rb_select_date(self, de_target): self.calendar_select.setSelectedDate(de_target.date()) def select_date(self): date = self.calendar_select.selectedDate() if self.rb_begin.isChecked(): self.de_begin.setDate(date) elif self.rb_deadline.isChecked(): self.de_deadline.setDate(date) def save_plan(self): code, data = self.valid_check() if code == -1: QMessageBox.critical(self, 'Error', data) return code2, actions = self.generate_actions(data) if code2 == -1: QMessageBox.critical(self, 'Error', actions) return plan_id = PlanDao.add_plan(data) ActionDao.add_actions(actions, plan_id) self.txt_content.clear() self.refresh_tb_plan() self.refresh_tb_action(tb_index=code) def valid_check(self): content = self.txt_content.toPlainText().replace('\n', '.') if content.strip(' ').strip('.').strip(' ') == '': return -1, 'Content must be a normal string!' begin = self.de_begin.date() deadline = self.de_deadline.date() now = QDate.currentDate() diff_begin = now.daysTo(begin) diff_deadline = now.daysTo(deadline) if diff_begin < 0 or diff_deadline < 0 or diff_deadline < diff_begin: return -1, 'Deadline date must be farther than begin date and both of them must be farther than Now' begin_date = datetime.date(begin.year(), begin.month(), begin.day()) deadline = datetime.date(deadline.year(), deadline.month(), deadline.day()) frequency = self.combo_frequency.currentText() repeat = self.sb_repeat.value() importance = self.combo_importance.currentText() degree_importance = False if importance.lower().startswith( 'un') else True urgent = self.combo_urgency.currentText() degree_urgent = False if urgent.lower().startswith('non') else True plan = Plan(content=content, begin_date=begin_date, deadline=deadline, frequency=PlanFrequency[frequency], repeat=repeat, degree_importance=degree_importance, degree_urgency=degree_urgent) if degree_importance and degree_urgent: code = 1 elif degree_importance and not degree_urgent: code = 2 elif not degree_importance and not degree_urgent: code = 3 elif not degree_importance and degree_urgent: code = 4 return code, plan def generate_actions(self, plan): action_list = [] begin = QDate(plan.begin_date) deadline = QDate(plan.deadline) include = self.cb_include.isChecked() if plan.frequency == PlanFrequency.NoRepeat: days = begin.daysTo(deadline) if not include: if days == 0: return -1, 'There is not time to complete the plan' for i in range(plan.repeat): action = Action(content=plan.content, begin_date=plan.begin_date, deadline=plan.deadline, degree_importance=plan.degree_importance, degree_urgency=plan.degree_urgency, status=1) action_list.append(action) elif plan.frequency == PlanFrequency.Day: days = begin.daysTo(deadline) if not include: if days == 0: return -1, 'There is not time to complete the plan' for day in range(days + 1): if not include and day == 0: continue begin_date = begin.addDays(day) begin_date = datetime.date(begin_date.year(), begin_date.month(), begin_date.day()) for i in range(plan.repeat): action = Action(content=plan.content, begin_date=begin_date, deadline=begin_date, degree_importance=plan.degree_importance, degree_urgency=plan.degree_urgency, status=1) action_list.append(action) elif plan.frequency == PlanFrequency.Week: begin_week, begin_year = begin.weekNumber() begin_day_of_week = begin.dayOfWeek() deadline_week, deadline_year = deadline.weekNumber() weeks = deadline_week + (deadline_year - begin_year) * 52 - begin_week if not include: if weeks == 0: return -1, 'There is not time to complete the plan' current_week_deadline = begin.addDays(7 - begin_day_of_week) for week in range(weeks + 1): if not include and week == 0: continue current_week_deadline = current_week_deadline.addDays(7 * week) current_week_begin = current_week_deadline.addDays(-6) if week == 0: begin_date = plan.begin_date if week == weeks: deadline = plan.deadline else: deadline = datetime.date(current_week_deadline.year(), current_week_deadline.month(), current_week_deadline.day()) elif week == weeks: begin_date = datetime.date(current_week_begin.year(), current_week_begin.month(), current_week_begin.day()) deadline = plan.deadline else: begin_date = datetime.date(current_week_begin.year(), current_week_begin.month(), current_week_begin.day()) deadline = datetime.date(current_week_deadline.year(), current_week_deadline.month(), current_week_deadline.day()) for i in range(plan.repeat): action = Action(content=plan.content, begin_date=begin_date, deadline=deadline, degree_importance=plan.degree_importance, degree_urgency=plan.degree_urgency, status=1) action_list.append(action) elif plan.frequency == PlanFrequency.Month: begin_year = begin.year() deadline_year = deadline.year() years = deadline_year - begin_year begin_month = begin.month() deadline_month = deadline.month() months = deadline_month + 12 * years - begin_month if not include: if months == 0: return -1, 'There is not time to complete the plan' current_year = begin_year for month in range(months + 1): if not include and month == 0: continue current_month = begin_month + month if current_month > 12: current_month -= 12 current_year += 1 if month == 0: begin_date = plan.begin_date if month == months: deadline = plan.deadline else: deadline = datetime.date(current_year, current_month, begin.daysInMonth()) elif month == months: begin_date = datetime.date(current_year, current_month, 1) deadline = plan.deadline else: begin_date = datetime.date(current_year, current_month, 1) deadline = datetime.date(current_year, current_month, 1) deadline = datetime.date( current_year, current_month, QDate(deadline.year(), deadline.month(), deadline.day()).daysInMonth()) for i in range(plan.repeat): action = Action(content=plan.content, begin_date=begin_date, deadline=deadline, degree_importance=plan.degree_importance, degree_urgency=plan.degree_urgency, status=1) action_list.append(action) elif plan.frequency == PlanFrequency.Quarter: begin_year = begin.year() deadline_year = deadline.year() years = deadline_year - begin_year begin_month = begin.month() deadline_month = deadline.month() begin_quarter = (begin_month + 2) / 3 deadline_quarter = (deadline_month + 2) / 3 quarters = deadline_quarter + years * 4 - begin_quarter if not include: if quarters == 0: return -1, 'There is not time to complete the plan' current_year = begin_year for quarter in range(quarters + 1): if not include and quarter == 0: continue current_quarter = begin_quarter + quarter if current_quarter > 4: current_quarter -= 4 current_year += 1 begin_month = (current_quarter - 1) * 3 + 1 deadline_month = begin_month + 2 if quarter == 0: begin_date = plan.begin_date if quarter == quarters: deadline = plan.deadline else: deadline = datetime.date( current_year, deadline_month, (30 if deadline_month == 4 else 31)) elif quarter == quarters: begin_date = datetime.date(current_year, begin_month, 1) deadline = plan.deadline else: begin_date = datetime.date(current_year, begin_month, 1) deadline = datetime.date( current_year, deadline_month, (30 if deadline_month == 4 else 31)) for i in range(plan.repeat): action = Action(content=plan.content, begin_date=begin_date, deadline=deadline, degree_importance=plan.degree_importance, degree_urgency=plan.degree_urgency, status=1) action_list.append(action) elif plan.frequency == PlanFrequency.Year: begin_year = begin.year() deadline_year = deadline.year() years = deadline_year - begin_year if not include: if years == 0: return -1, 'There is not time to complete the plan' for year in range(years + 1): if not include and year == 0: continue current_year = begin_year + year if year == 0: begin_date = plan.begin_date if year == years: deadline = plan.deadline else: deadline = datetime.date(current_year, 12, 31) elif year == years: begin_date = datetime.date(current_year, 1, 1) deadline = plan.deadline else: begin_date = datetime.date(current_year, 1, 1) deadline = datetime.date(current_year, 12, 31) for i in range(plan.repeat): action = Action(content=plan.content, begin_date=begin_date, deadline=deadline, degree_importance=plan.degree_importance, degree_urgency=plan.degree_urgency, status=1) action_list.append(action) return 0, action_list def change_tb_ac_list(self): for index in range(1, 5): self.refresh_tb_action(index) def refresh_tb_plan(self): plans = PlanDao.query_plans() model = QStandardItemModel(len(plans), 3) model.setHorizontalHeaderLabels(['Content', 'Frequency', 'Flag']) row_index = 0 for plan in plans: qsi_content = QStandardItem(plan.content) qsi_content.setEditable(False) qsi_frequency = QStandardItem(plan.frequency.name) qsi_frequency.setEditable(False) qsi_flag = QStandardItem('{},{}'.format( 'Important' if plan.degree_importance else 'Unimportant', 'Urgency' if plan.degree_urgency else 'Non-urgency')) qsi_flag.setEditable(False) model.setItem(row_index, 0, qsi_content) model.setItem(row_index, 1, qsi_frequency) model.setItem(row_index, 2, qsi_flag) row_index += 1 self.tb_plan.setModel(model) self.tb_plan.setColumnWidth(0, 220) self.tb_plan.setColumnWidth(1, 70) self.tb_plan.setColumnWidth(2, 100) def refresh_tb_action(self, tb_index): tb_action = self.tb_acs[tb_index] ac_list_filter = self.combo_ac_list_filter.currentIndex() actions = ActionDao.query_actions(tb_index, ac_list_filter) model = QStandardItemModel(len(actions), 3) model.setHorizontalHeaderLabels( ['Content', 'Begin', 'Deadline', 'Status']) row_index = 0 for action in actions: qsi_content = QStandardItem(action.content) qsi_content.setEditable(False) qsi_begin_date = QStandardItem( action.begin_date.strftime("%Y/%m/%d")) qsi_content.setEditable(False) qsi_deadline = QStandardItem(action.deadline.strftime("%Y/%m/%d")) qsi_deadline.setEditable(False) qsi_status = QStandardItem() qsi_status.setData({'id': action.id, 'status': action.status}) qsi_status.setEditable(False) model.setItem(row_index, 0, qsi_content) model.setItem(row_index, 1, qsi_begin_date) model.setItem(row_index, 2, qsi_deadline) model.setItem(row_index, 3, qsi_status) row_index += 1 tb_action.setModel(model) tb_action.setColumnWidth(0, 150) tb_action.setColumnWidth(1, 75) tb_action.setColumnWidth(2, 75) tb_action.setColumnWidth(3, 40) def change_status(self, tb_action, act_id, status): if status == 0: QMessageBox.information(self, 'Tip', 'Please wait for beginning') elif status == 1: menu = QMenu(tb_action) done_act = menu.addAction(QIcon('icons/daily_plan/done.png'), 'Done') cancel_act = menu.addAction(QIcon('icons/daily_plan/cancel.png'), 'Cancel') act = menu.exec_( tb_action.mapToGlobal( QPoint(self.sender().x(), self.sender().y() + 10))) refresh = False if act == done_act: ActionDao.update_action(act_id, 2) refresh = True elif act == cancel_act: ActionDao.update_action(act_id, 3) refresh = True if refresh: self.refresh_tb_action( list(self.tb_acs.keys())[list( self.tb_acs.values()).index(tb_action)]) elif status == 2: QMessageBox.information( self, 'Tip', 'You are good that had completed the task') elif status == 3: QMessageBox.information(self, 'Tip', 'It is sadly you had canceled this task') elif status == 4: QMessageBox.information( self, 'Tip', 'It is sorry that this task had expired and you cannot operate it' )
class WidgetGallery(QDialog): def __init__(self, parent=None, submit_icon=None): super(WidgetGallery, self).__init__(parent) appctx = ApplicationContext() spreadsheet_hdl = SpreadsheetHandler() categories = spreadsheet_hdl.read_categories() self.tabsWidget = QTabWidget() # Add 'Expenses' tab to main widget self.createExpensesLayout() self.tabsWidget.addTab(self.expensesWidget, QIcon(appctx.get_resource("submit.ico")), "Expenses") # Add 'Incomes' tab to main widget self.createIncomesLayout() self.tabsWidget.addTab(self.incomesWidget, QIcon(appctx.get_resource("submit.ico")), "Incomes") # Add 'Latest Uploads' tab to main widget self.createLatestUploads() self.tabsWidget.addTab(self.latestUploadsWidget, QIcon(appctx.get_resource("sheets.ico")), "Latest Uploads") # Add 'Spreadsheet Actions' tab to main widget self.createSpreadsheetActionsLayout() self.tabsWidget.addTab(self.spreadsheetActionsWidget, QIcon(appctx.get_resource("sheets.ico")), "Spreadsheet Actions") # Set the current available expenses categories self.addCategories(categories) # Set main window size self.resize(570, 320) self.tabsWidget.currentChanged.connect(self.adjustTabWidgetSize) self.layout = QVBoxLayout() self.layout.addWidget(self.tabsWidget) self.setLayout(self.layout) self.setWindowTitle("Expenses Tracker") QApplication.setStyle(QStyleFactory.create("Fusion")) def createExpensesLayout(self): self.expensesWidget = QWidget() self.expensesWidget.setGeometry(QRect(10, 10, 550, 300)) self.expensesWidget.size = (570, 320) expenseDoubleSpinBox_label = QLabel("Value", self.expensesWidget) expenseDoubleSpinBox_label.setGeometry(QRect(30, 80, 40, 20)) expenseDoubleSpinBox_label.setAlignment(Qt.AlignBottom | Qt.AlignHCenter) self.expenseDoubleSpinBox = QDoubleSpinBox(self.expensesWidget) self.expenseDoubleSpinBox.setMaximum(10000) self.expenseDoubleSpinBox.setDecimals(2) self.expenseDoubleSpinBox.setMinimum(0) self.expenseDoubleSpinBox.setGeometry(QRect(10, 100, 80, 20)) expenseDateEdit_label = QLabel("Date", self.expensesWidget) expenseDateEdit_label.setGeometry(QRect(120, 80, 40, 20)) expenseDateEdit_label.setAlignment(Qt.AlignBottom | Qt.AlignHCenter) self.expenseDateEdit = QDateEdit(self.expensesWidget) self.expenseDateEdit.setCalendarPopup(True) self.expenseDateEdit.setDisplayFormat("dd/MM/yy") self.expenseDateEdit.setDate(QDate.currentDate()) self.expenseDateEdit.setGeometry(QRect(100, 100, 80, 20)) expenseCategoriesComboBox_label = QLabel("Category", self.expensesWidget) expenseCategoriesComboBox_label.setGeometry(QRect(210, 80, 60, 20)) expenseCategoriesComboBox_label.setAlignment(Qt.AlignBottom | Qt.AlignHCenter) self.expenseCategoriesComboBox = QComboBox(self.expensesWidget) self.expenseCategoriesComboBox.setGeometry(QRect(190, 100, 100, 20)) expenseSpecificationLine_label = QLabel("Specification", self.expensesWidget) expenseSpecificationLine_label.setGeometry(QRect(320, 80, 70, 20)) expenseSpecificationLine_label.setAlignment(Qt.AlignBottom | Qt.AlignHCenter) self.expenseSpecificationLine = QLineEdit(self.expensesWidget) self.expenseSpecificationLine.setGeometry(QRect(300, 100, 115, 20)) expenseObservationLine_label = QLabel("Observation", self.expensesWidget) expenseObservationLine_label.setGeometry(QRect(440, 80, 80, 20)) expenseObservationLine_label.setAlignment(Qt.AlignBottom | Qt.AlignHCenter) self.expenseObservationLine = QLineEdit(self.expensesWidget) self.expenseObservationLine.setGeometry(QRect(420, 100, 115, 20)) self.nonRecurringExpenseBox = QCheckBox("Non-recurring expense", self.expensesWidget) self.nonRecurringExpenseBox.setGeometry(QRect(10, 140, 130, 20)) submitbutton = QPushButton("Submit Expense", self.expensesWidget) submitbutton.clicked.connect(self.submitExpenseButtonClicked) submitbutton.setGeometry(QRect(10, 170, 520, 25)) def createLatestUploads(self): self.latestUploadsWidget = QWidget() self.latestUploadsWidget.setGeometry(QRect(10, 10, 550, 300)) self.latestUploadsWidget.size = (824, 403) # Construct Latest Expenses Group expenses_group = QGroupBox("Latest Expenses", self.latestUploadsWidget) self.expensesTable = QTableWidget(expenses_group) self.expensesTable.setColumnCount(4) self.expensesTable.verticalHeader().setVisible(False) self.expensesTable.setEditTriggers(QAbstractItemView.NoEditTriggers) self.expensesTable.setSelectionMode(QAbstractItemView.NoSelection) self.expensesTable.setFixedSize(415, 265) self.expensesTable.setHorizontalHeaderLabels(["Date", "Value", "Category", "Specification"]) self.fillExpensesTableData() update_expenses_table_button = QPushButton("Update Expenses Table") update_expenses_table_button.clicked.connect(self.updateExpensesTableButtonClicked) layout = QVBoxLayout() layout.addWidget(self.expensesTable) layout.addWidget(update_expenses_table_button) expenses_group.setLayout(layout) expenses_group.move(10, 5) expenses_group.setStyleSheet("QGroupBox { font-weight: bold; } ") # Construct Latest Incomes Group incomes_group = QGroupBox("Latest Incomes", self.latestUploadsWidget) self.incomesTable = QTableWidget(incomes_group) self.incomesTable.setColumnCount(3) self.incomesTable.verticalHeader().setVisible(False) self.incomesTable.setEditTriggers(QAbstractItemView.NoEditTriggers) self.incomesTable.setSelectionMode(QAbstractItemView.NoSelection) self.incomesTable.setFixedSize(301, 265) self.incomesTable.setHorizontalHeaderLabels(["Date", "Value", "Category"]) self.fillIncomesTableData() update_incomes_table_button = QPushButton("Update Incomes Table") update_incomes_table_button.clicked.connect(self.updateIncomesTableButtonClicked) layout = QVBoxLayout() layout.addWidget(self.incomesTable) layout.addWidget(update_incomes_table_button) incomes_group.setLayout(layout) incomes_group.move(460, 5) incomes_group.setStyleSheet("QGroupBox { font-weight: bold; } ") def createIncomesLayout(self): self.incomesWidget = QWidget() self.incomesWidget.setGeometry(QRect(10, 10, 460, 300)) self.incomesWidget.size = (480, 320) incomesDoubleSpinBox_label = QLabel("Value", self.incomesWidget) incomesDoubleSpinBox_label.setAlignment(Qt.AlignBottom | Qt.AlignHCenter) incomesDoubleSpinBox_label.setGeometry(QRect(40, 80, 40, 20)) self.incomesDoubleSpinBox = QDoubleSpinBox(self.incomesWidget) self.incomesDoubleSpinBox.setMaximum(10000) self.incomesDoubleSpinBox.setDecimals(2) self.incomesDoubleSpinBox.setMinimum(0) self.incomesDoubleSpinBox.setGeometry(QRect(20, 100, 80, 20)) incomesDateEdit_label = QLabel("Date", self.incomesWidget) incomesDateEdit_label.setAlignment(Qt.AlignBottom | Qt.AlignHCenter) incomesDateEdit_label.setGeometry(QRect(130, 80, 40, 20)) self.incomesDateEdit = QDateEdit(self.incomesWidget) self.incomesDateEdit.setCalendarPopup(True) self.incomesDateEdit.setDisplayFormat("dd/MM/yy") self.incomesDateEdit.setDate(QDate.currentDate()) self.incomesDateEdit.setGeometry(QRect(110, 100, 80, 20)) incomesSpecificationLine_label = QLabel("Specification", self.incomesWidget) incomesSpecificationLine_label.setAlignment(Qt.AlignBottom | Qt.AlignHCenter) incomesSpecificationLine_label.setGeometry(QRect(220, 80, 70, 20)) self.incomesSpecificationLine = QLineEdit(self.incomesWidget) self.incomesSpecificationLine.setGeometry(QRect(200, 100, 115, 20)) incomesObservationLine_label = QLabel("Observation", self.incomesWidget) incomesObservationLine_label.setAlignment(Qt.AlignBottom | Qt.AlignHCenter) incomesObservationLine_label.setGeometry(QRect(340, 80, 80, 20)) self.incomesObservationLine = QLineEdit(self.incomesWidget) self.incomesObservationLine.setGeometry(QRect(320, 100, 115, 20)) submitbutton = QPushButton("Submit Income", self.incomesWidget) submitbutton.setGeometry(QRect(10, 170, 430, 25)) submitbutton.clicked.connect(self.submitIncomeButtonClicked) def createSpreadsheetActionsLayout(self): self.spreadsheetActionsWidget = QWidget() self.spreadsheetActionsWidget.setGeometry(QRect(10, 10, 550, 300)) self.spreadsheetActionsWidget.size = (570, 320) access_spreadsheet_button = QPushButton("Access Spreadsheet", self.spreadsheetActionsWidget) access_spreadsheet_button.clicked.connect(self.accessSpreadsheetButtonClicked) access_spreadsheet_button.setGeometry(QRect(10, 10, 525, 25)) create_and_maintain_button = QPushButton("Create New Spreadsheet Maintaining the Old One", self.spreadsheetActionsWidget) create_and_maintain_button.clicked.connect(self.createAndMaintainButtonClicked) create_and_maintain_button.setGeometry(QRect(10, 40, 525, 25)) create_and_delete_button = QPushButton("Create New Spreadsheet Deleting the Old One", self.spreadsheetActionsWidget) create_and_delete_button.clicked.connect(self.createAndDeleteButtonClicked) create_and_delete_button.setGeometry(QRect(10, 70, 525, 25)) categories_group = QGroupBox("Expenses Categories", self.spreadsheetActionsWidget) categories_group.setGeometry(QRect(10, 110, 525, 140)) categories_group.setStyleSheet("QGroupBox { font-weight: bold; } ") categories_layout = QHBoxLayout() self.addCategoryLine = QLineEdit() add_category_button = QPushButton("Add New Category") add_category_button.clicked.connect(self.addCategoryButtonClicked) self.delCategoryComboBox = QComboBox() del_category_button = QPushButton("Delete Category") del_category_button.clicked.connect(self.delCategoryButtonClicked) add_categories_layout = QVBoxLayout() del_categories_layout = QVBoxLayout() add_categories_layout.addWidget(self.addCategoryLine) add_categories_layout.addWidget(add_category_button) del_categories_layout.addWidget(self.delCategoryComboBox) del_categories_layout.addWidget(del_category_button) add_categories_widget = QWidget() del_categories_widget = QWidget() add_categories_widget.setLayout(add_categories_layout) del_categories_widget.setLayout(del_categories_layout) categories_layout.addWidget(add_categories_widget) categories_layout.addWidget(del_categories_widget) categories_group.setLayout(categories_layout) def fillExpensesTableData(self): latest_expenses = SpreadsheetHandler().get_latest_upload("expenses") self.expensesTable.setRowCount(len(latest_expenses)) for row_index, row in enumerate(latest_expenses): for column_index, cell_content in enumerate(row): self.expensesTable.setItem(row_index, column_index, QTableWidgetItem(cell_content)) def fillIncomesTableData(self): latest_incomes = SpreadsheetHandler().get_latest_upload("incomes") self.incomesTable.setRowCount(len(latest_incomes)) for row_index, row in enumerate(latest_incomes): for column_index, cell_content in enumerate(row): self.incomesTable.setItem(row_index, column_index, QTableWidgetItem(cell_content)) def addCategories(self, new_items): self.expenseCategoriesComboBox.insertItems(0, new_items) self.delCategoryComboBox.insertItems(0, new_items) def resetCategoriesComboBox(self): spreadsheet_hdl = SpreadsheetHandler() categories = spreadsheet_hdl.read_categories() self.expenseCategoriesComboBox.clear() self.delCategoryComboBox.clear() self.addCategories(categories) def submitExpenseButtonClicked(self): spreadsheet_hdl = SpreadsheetHandler() appctx = ApplicationContext() if self.nonRecurringExpenseBox.checkState() == 2: recurring_status = "Non-Recurring" else: recurring_status = "Recurring" data = [ ["=MONTH(\""+self.expenseDateEdit.date().toString("MM/dd/yyyy")+"\")", self.expenseDateEdit.date().toString("MM/dd/yyyy"), str(self.expenseDoubleSpinBox.value()), self.expenseCategoriesComboBox.currentText(), self.expenseSpecificationLine.text(), recurring_status, self.expenseObservationLine.text() ] ] for index in range(len(data[0])): if data[0][index] == "": data[0][index] = "-" spreadsheet_hdl.append_data(data, range="Expenses") spreadsheet_hdl.expenses_sort_by_date() alert = QMessageBox() alert.setWindowTitle("Expense Submitted") alert.setWindowIcon(QIcon(appctx.get_resource("submit.ico"))) alert.setText("The expense was submitted!") alert.exec_() def submitIncomeButtonClicked(self): spreadsheet_hdl = SpreadsheetHandler() appctx = ApplicationContext() data = [ ["=MONTH(\""+self.incomesDateEdit.date().toString("MM/dd/yyyy")+"\")", self.incomesDateEdit.date().toString("MM/dd/yyyy"), str(self.incomesDoubleSpinBox.value()), self.incomesSpecificationLine.text(), self.incomesObservationLine.text() ] ] for index in range(len(data[0])): if data[0][index] == "": data[0][index] = "-" spreadsheet_hdl.append_data(data, range="Incomes") spreadsheet_hdl.income_sort_by_date() alert = QMessageBox() alert.setWindowTitle("Income Submitted") alert.setWindowIcon(QIcon(appctx.get_resource("submit.ico"))) alert.setText("The income was submitted!") alert.exec_() def updateExpensesTableButtonClicked(self): self.expensesTable.clearContents() self.fillExpensesTableData() def updateIncomesTableButtonClicked(self): self.incomesTable.clearContents() self.fillIncomesTableData() def accessSpreadsheetButtonClicked(self): spreadsheet_hdl = SpreadsheetHandler() webbrowser.open("https://docs.google.com/spreadsheets/d/" + spreadsheet_hdl.spreadsheet_id) def createAndMaintainButtonClicked(self): appctx = ApplicationContext() spreadsheet_hdl = SpreadsheetHandler() spreadsheet_hdl.rename_spreadsheet(spreadsheet_hdl.file_name + '_OLD') spreadsheet_hdl.create_spreadsheet() self.resetCategoriesComboBox() alert = QMessageBox() alert.setWindowTitle("Spreadsheet Reset") alert.setWindowIcon(QIcon(appctx.get_resource("sheets.ico"))) alert.setText("A new spreadsheet was created! To access the old " "spreadsheet, look for Expenses Tracker_OLD in your Drive.") alert.exec_() def createAndDeleteButtonClicked(self): appctx = ApplicationContext() alert = QMessageBox() alert.setIcon(QMessageBox.Question) alert.setText("All information present " "on the current spreadsheet " "will be lost. " "Are you sure you wish to continue?") alert.setWindowTitle("Spreadsheet Reset Confirmation") alert.setWindowIcon(QIcon(appctx.get_resource("sheets.ico"))) alert.setStandardButtons(QMessageBox.Yes | QMessageBox.No) alert.setDefaultButton(QMessageBox.No) reply = alert.exec_() if reply == alert.Yes: spreadsheet_hdl = SpreadsheetHandler() spreadsheet_hdl.delete_spreadsheet() spreadsheet_hdl.create_spreadsheet() self.resetCategoriesComboBox() alert = QMessageBox() alert.setWindowTitle("Spreadsheet Reset") alert.setWindowIcon(QIcon(appctx.get_resource("sheets.ico"))) alert.setText("A new spreadsheet was created!") alert.exec_() def addCategoryButtonClicked(self): spreadsheet_hdl = SpreadsheetHandler() appctx = ApplicationContext() new_category = self.addCategoryLine.text() categories = spreadsheet_hdl.read_categories() if new_category in categories: alert = QMessageBox() alert.setWindowTitle("Category Adding") alert.setWindowIcon(QIcon(appctx.get_resource("sheets.ico"))) alert.setText("The category " + new_category + " already exists.") alert.exec_() return spreadsheet_hdl.add_category(new_category) self.resetCategoriesComboBox() alert = QMessageBox() alert.setWindowTitle("Category Adding") alert.setWindowIcon(QIcon(appctx.get_resource("sheets.ico"))) alert.setText("The category " + new_category + " was succesfully added!") alert.exec_() def delCategoryButtonClicked(self): spreadsheet_hdl = SpreadsheetHandler() appctx = ApplicationContext() category_to_be_del = self.delCategoryComboBox.currentText() spreadsheet_hdl.delete_category(category_to_be_del) self.resetCategoriesComboBox() alert = QMessageBox() alert.setWindowTitle("Category Deleting") alert.setWindowIcon(QIcon(appctx.get_resource("sheets.ico"))) alert.setText("The category " + category_to_be_del + " was succesfully deleted!") alert.exec_() def adjustTabWidgetSize(self): current_tab = self.tabsWidget.currentWidget() self.resize(current_tab.size[0], current_tab.size[1])
def updateEditorGeometry(self, editor: QDateEdit, option, index: QModelIndex) -> None: editor.setGeometry(option.rect)
class AddEmployeeDetails(QMainWindow): closing = pyqtSignal(int) def __init__(self, parent, update, id=None): super().__init__(parent) self.parent = parent self.db = DB() self.initUI(update, id) def initUI(self, update, id): self.setWindowModality(Qt.ApplicationModal) frame = QFrame() # frame.setStyleSheet("background-color: rgb(30, 45, 66);") frame.setFrameShape(QFrame.StyledPanel) frame.setFrameShadow(QFrame.Raised) # frame.setMinimumWidth(430) # frame.setFixedHeight(395) frame.setStyleSheet("border: none") add_employee_button = QLabel(frame) add_employee_button.setAlignment(Qt.AlignCenter) add_employee_button.setGeometry(QRect(110, 30, 210, 41)) add_employee_button.setStyleSheet("font: 75 12pt \"MS Shell Dlg 2\";\n" "background-color: rgb(30, 45, 66);\n" "color: rgb(255, 255, 255);") add_employee_button.setText("Add Employee Details") # name = QHBoxLayout() # jobtitle = QHBoxLayout() # salary = QHBoxLayout() # bonus = QHBoxLayout() # joindate = QHBoxLayout() namelabel = QLabel(frame) namelabel.setText("Name") namelabel.setGeometry(QRect(80, 100, 47, 13)) self.nametextbox = QLineEdit(frame) self.nametextbox.setGeometry(QRect(160, 90, 181, 31)) self.nametextbox.setFixedWidth(180) jobtitlelabel = QLabel(frame) jobtitlelabel.setText("Job Title") jobtitlelabel.setGeometry(QRect(80, 140, 61, 16)) self.jobtitletextbox = QComboBox(frame) self.jobtitletextbox.setGeometry(QRect(160, 130, 181, 31)) self.jobtitletextbox.setFixedWidth(180) self.jobtitletextbox.addItems(["Manager", "Waiter", "Chef", "Security"]) salarylabel = QLabel(frame) salarylabel.setText("Salary") salarylabel.setGeometry(QRect(80, 180, 47, 13)) self.salarytextbox = QLineEdit(frame) self.salarytextbox.setGeometry(QRect(160, 170, 181, 31)) self.salarytextbox.setFixedWidth(180) self.salarytextbox.setValidator(QIntValidator()) # bonuslabel = QLabel(frame) # bonuslabel.setText("Bonus") # bonuslabel.setGeometry(QRect(80, 220, 47, 13)) # bonustextbox = QLineEdit(frame) # bonustextbox.setGeometry(QRect(160, 210, 181, 31)) # bonustextbox.setFixedWidth(180) joindatelabel = QLabel(frame) joindatelabel.setText("Start Date") joindatelabel.setGeometry(QRect(80, 260, 71, 16)) self.joindatetextbox = QDateEdit(frame) self.joindatetextbox.setGeometry(QRect(160, 250, 181, 31)) self.joindatetextbox.setFixedWidth(180) self.joindatetextbox.setDate(QDate.currentDate()) self.joindatetextbox.setMinimumDate(QDate.currentDate()) self.joindatetextbox.setDisplayFormat("dd-MM-yyyy") self.addbutton = QPushButton(frame) self.addbutton.setGeometry(QRect(160, 300, 111, 31)) self.addbutton.setStyleSheet("font: 75 12pt \"MS Shell Dlg 2\";\n" "background-color: rgb(30, 45, 66);\n" "color: rgb(255, 255, 255);") if update == 'add': print("Add") print(id) self.addbutton.setText("Add Employee") self.addbutton.clicked.connect(lambda: self.add_button_click("employee")) else: print("Update") print(id) self.addbutton.setText("Update Employee") self.addbutton.clicked.connect(lambda: self.update_button_click("employee", id)) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(frame) centralWidget = QWidget() centralWidget.setLayout(layout) self.setCentralWidget(centralWidget) # self.setLayout(layout) self.setWindowTitle("Add Employee Details") self.resize(430, 395) self.show() self.center() def center(self): '''centers the window on the screen''' screen = QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2) def update_button_click(self, where, id): if where == "employee": print("Employees Finally here") print(self.nametextbox.text()) print(self.jobtitletextbox.currentText()) print(self.salarytextbox.text()) print(self.joindatetextbox.text()) employee_name = self.nametextbox.text() job_title = self.jobtitletextbox.currentText() salary = self.salarytextbox.text() try: date = datetime.datetime.strptime(self.joindatetextbox.text(), "%d-%m-%Y") joining_date = datetime.datetime.strftime(date, "%Y-%m-%d") except: ''' Make sure to add an error message. ''' return if employee_name != "" and salary != "": query = "update employee set `employee_name`=%s, `job_title`=%s, `salary`=%s, " \ "`joining_date`=%s where id=%s" values = (employee_name, job_title, salary, joining_date, id) result = self.db.execute(query, values) self.closeEvent = self.message() def add_button_click(self, where): if where == "employee": print("Employees Finally here") print(self.nametextbox.text()) print(self.jobtitletextbox.currentText()) print(self.salarytextbox.text()) print(self.joindatetextbox.text()) employee_name = self.nametextbox.text() job_title = self.jobtitletextbox.currentText() salary = self.salarytextbox.text() try: date = datetime.datetime.strptime(self.joindatetextbox.text(), "%d-%m-%Y") joining_date = datetime.datetime.strftime(date, "%Y-%m-%d") except: ''' Make sure to add an error message. ''' return if employee_name != "" and salary != "": query = "insert into employee (`employee_name`, `job_title`,`salary`, `joining_date`)" \ "values (%s, %s, %s, %s);" values = (employee_name, job_title, salary, joining_date) result = self.db.execute(query, values) self.closeEvent = self.message() def message(self): self.closing.emit(1) self.close() # def closeEvent(self, event): # print("Closed") # self.closing.emit() # # self.parent.update()
class Ui_Form(object): def setupUi(self, widget): now = datetime.now() widget.resize(2000, 1200) widget.setWindowIcon(QIcon("icons/bookkeeping.ico")) widget.setToolTipDuration(-1) widget.setStyleSheet("QPushButton:hover{\n" "background-color: silver;\n" "}") # SHOW CHART BUTTON self.chartBtn = QPushButton(widget) self.chartBtn.setGeometry(1620, 20, 250, 110) self.chartBtn.setStyleSheet("background: lightgreen;\n" "color: white;\n" "font-size: 40px;") self.chartBtn.setText("Диаграмма") # SELECT TYPES CHARTS self.TypesCharts = QComboBox(widget) self.TypesCharts.setGeometry(1650, 150, 200, 40) self.TypesCharts.setStyleSheet("font-size: 30px;") self.TypesCharts.addItem("общая") self.TypesCharts.addItem("по времени") self.TypesCharts.addItem("по типам") self.TypesCharts.addItem("по продуктам") # TAB WIDGET EXPENSES AND INCOME self.MainTab = QTabWidget(widget) self.MainTab.setGeometry(1, 10, 1480, 1110) # TEBLE EXPENSES self.tableExpenses = QTableWidget(widget) self.tableExpenses.setGeometry(5, 5, 1480, 1110) self.tableExpenses.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self.tableExpenses.setAutoScroll(True) self.tableExpenses.setRowCount(1000) self.tableExpenses.setColumnCount(5) self.tableExpenses.horizontalHeader().setDefaultSectionSize(270) self.tableExpenses.verticalHeader().setDefaultSectionSize(50) self.tableExpenses.setStyleSheet(u"font-size: 30px;") self.tableExpenses.setHorizontalHeaderLabels( ('Сумма', 'Продукт', 'Дата', 'Тип', 'Источник')) # TEBLE INCOME self.tableIncome = QTableWidget(widget) self.tableIncome.setGeometry(5, 5, 1480, 1110) self.tableIncome.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self.tableIncome.setAutoScroll(True) self.tableIncome.setRowCount(1000) self.tableIncome.setColumnCount(5) self.tableIncome.horizontalHeader().setDefaultSectionSize(270) self.tableIncome.verticalHeader().setDefaultSectionSize(50) self.tableIncome.setStyleSheet(u"font-size: 30px;") self.tableIncome.setHorizontalHeaderLabels( ('Сумма', 'Продукт', 'Дата', 'Тип', 'Источник')) self.tableGave = QTableWidget(widget) self.tableGave.setGeometry(5, 5, 1480, 1110) self.tableGave.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self.tableGave.setAutoScroll(True) self.tableGave.setRowCount(1000) self.tableGave.setColumnCount(4) self.tableGave.horizontalHeader().setDefaultSectionSize(338) self.tableGave.verticalHeader().setDefaultSectionSize(50) self.tableGave.setStyleSheet(u"font-size: 30px;") self.tableGave.setHorizontalHeaderLabels( ('Сумма', 'Кому', 'Когда', 'Вернули')) self.tableTook = QTableWidget(widget) self.tableTook.setGeometry(5, 5, 1480, 1110) self.tableTook.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self.tableTook.setAutoScroll(True) self.tableTook.setRowCount(1000) self.tableTook.setColumnCount(4) self.tableTook.horizontalHeader().setDefaultSectionSize(338) self.tableTook.verticalHeader().setDefaultSectionSize(50) self.tableTook.setStyleSheet(u"font-size: 30px;") self.tableTook.setHorizontalHeaderLabels( ('Сумма', 'У кого', 'Когда', 'Использовал')) # ADD TAB TO TabWidget FOR EXPENSES AND INCOME self.MainTab.addTab(self.tableExpenses, "Расходы") self.MainTab.addTab(self.tableIncome, "Доходы") self.MainTab.addTab(self.tableTook, "Взял") self.MainTab.addTab(self.tableGave, "Дал") # TOTAL EXPENSES AND INCOME LABEL self.TotalLabel = QLabel(widget) self.TotalLabel.setGeometry(10, 1130, 1000, 60) self.TotalLabel.setStyleSheet("font-size: 39px;") self.TotalLabel.setText("Итоговй расход: ") # TOTAL LABEL self.TotalLabel_2 = QLabel(widget) self.TotalLabel_2.setGeometry(550, 1130, 1000, 60) self.TotalLabel_2.setStyleSheet("font-size: 39px;") self.TotalLabel_2.setText("Итог: ") self.percentTotalLabel = QLabel(widget) self.percentTotalLabel.setGeometry(850, 1130, 1000, 60) self.percentTotalLabel.setStyleSheet("font-size: 39px;\n" "color: green;") # GROUP BOX (DELET EXPENSES AND INCOME) self.groupBoxType = QGroupBox(widget) self.groupBoxType.setGeometry(1500, 200, 480, 300) self.groupBoxType.setStyleSheet("font-size: 30px;") # ROW DELET self.RowDelet = QSpinBox(self.groupBoxType) self.RowDelet.setGeometry(250, 80, 200, 50) self.RowDelet.setMaximum(1000000) self.RowDelet.setMinimum(1) # BUTTON FOR DELETE EXPENSES OR INCOME self.DeletBtn = QPushButton(self.groupBoxType) self.DeletBtn.setGeometry(140, 210, 220, 70) self.DeletBtn.setStyleSheet("background: lightgreen;\n" "color: white;\n" "font-size: 40px;") self.DeletBtn.setText("Удалить") # ROW LABEL self.RowLabel = QLabel(self.groupBoxType) self.RowLabel.setGeometry(30, 80, 200, 50) self.RowLabel.setStyleSheet("font-size: 30px;") # GROUP BOX (ADD EXPENSES) self.groupBox = QGroupBox(widget) self.groupBox.setGeometry(1500, 560, 480, 600) self.groupBox.setStyleSheet("font-size: 30px;") self.groupBox.setTitle("Удалить Расход") # ADD BUTTON self.Add = QPushButton(self.groupBox) self.Add.setGeometry(110, 480, 230, 110) self.Add.setStyleSheet("background-color: lightgreen;\n" "color: white;\n" "font-size: 50px;") self.Add.setText("Добавить") # PRICE LABEL self.PriceLabel = QLabel(self.groupBox) self.PriceLabel.setGeometry(20, 50, 130, 31) self.PriceLabel.setStyleSheet("font-size: 30px;") # PRICE ENTERY self.PriceEntery = QLineEdit(self.groupBox) self.PriceEntery.setGeometry(200, 40, 200, 50) self.PriceEntery.setTabletTracking(False) self.PriceEntery.setContextMenuPolicy(Qt.DefaultContextMenu) self.PriceEntery.setAutoFillBackground(False) self.PriceEntery.setFrame(True) self.PriceEntery.setEchoMode(QLineEdit.Normal) self.PriceEntery.setCursorPosition(0) self.PriceEntery.setDragEnabled(False) self.PriceEntery.setCursorMoveStyle(Qt.LogicalMoveStyle) self.PriceEntery.setClearButtonEnabled(False) # PRODUCT LABEL self.ProductLabel = QLabel(self.groupBox) self.ProductLabel.setGeometry(20, 135, 130, 31) self.ProductLabel.setStyleSheet("font-size: 30px;") # PRODUCT ENTERY self.ProductEntery = QLineEdit(self.groupBox) self.ProductEntery.setGeometry(200, 125, 200, 50) self.ProductEntery.setTabletTracking(False) self.ProductEntery.setContextMenuPolicy(Qt.DefaultContextMenu) self.ProductEntery.setAutoFillBackground(False) self.ProductEntery.setFrame(True) self.ProductEntery.setEchoMode(QLineEdit.Normal) self.ProductEntery.setCursorPosition(0) self.ProductEntery.setDragEnabled(False) self.ProductEntery.setCursorMoveStyle(Qt.LogicalMoveStyle) self.ProductEntery.setClearButtonEnabled(False) # TYPE LABEL self.TypeLabel = QLabel(self.groupBox) self.TypeLabel.setGeometry(20, 200, 130, 40) self.TypeLabel.setStyleSheet("font-size: 30px;") # TYPE ENTERY self.TypeEntery = QComboBox(self.groupBox) self.TypeEntery.setGeometry(200, 200, 200, 40) self.TypeEntery.addItem("продукты") self.TypeEntery.addItem("транспорт") self.TypeEntery.addItem("развлечения") self.TypeEntery.addItem("техника") self.TypeEntery.addItem("одежда") self.TypeEntery.addItem("учёба") self.TypeEntery.addItem("книги") self.TypeEntery.addItem("другое") # DATE LABEL self.DateLabel = QLabel(self.groupBox) self.DateLabel.setGeometry(20, 270, 130, 31) self.DateLabel.setStyleSheet("font-size: 30px;") # DATE ENTERY self.DateEntery = QDateEdit(self.groupBox) self.DateEntery.setGeometry(200, 270, 200, 40) self.DateEntery.setDate(QDate(now.year, now.month, now.day)) self.sourceLabel = QLabel(self.groupBox) self.sourceLabel.setGeometry(20, 350, 130, 31) self.sourceLabel.setText("Источник") self.sourceEntery = QComboBox(self.groupBox) self.sourceEntery.setGeometry(200, 350, 200, 40) self.sourceEntery.addItem("мои деньги") self.retranslateUi(widget) QMetaObject.connectSlotsByName(widget) # setupUi def retranslateUi(self, widget): widget.setWindowTitle( QCoreApplication.translate("widget", u"Бухгалтерия", None)) #if QT_CONFIG(whatsthis) widget.setWhatsThis( QCoreApplication.translate( "widget", u"<html><head/><body><p align=\"center\">wdas</p></body></html>", None)) #endif // QT_CONFIG(whatsthis) __sortingEnabled = self.tableExpenses.isSortingEnabled() self.tableExpenses.setSortingEnabled(False) self.tableExpenses.setSortingEnabled(__sortingEnabled) self.RowLabel.setText( QCoreApplication.translate("widget", u"Строка", None)) self.groupBox.setTitle( QCoreApplication.translate("widget", u"Добавить Расход", None)) self.TypeLabel.setText( QCoreApplication.translate("widget", u"Тип", None)) self.PriceLabel.setText( QCoreApplication.translate("widget", u"Сумма", None)) self.ProductLabel.setText( QCoreApplication.translate("widget", u"Продукт", None)) self.DateLabel.setText( QCoreApplication.translate("widget", u"Дата", None))
class ProductSearcher(QDialog): def __init__(self): super().__init__(None, Qt.WindowCloseButtonHint | Qt.WindowSystemMenuHint) self.setFixedSize(880, 560) self.tableScrollArea = ProductTable(self) self.usrList = getUsrList() self.photoLabel = QLabel(self) self.photoLabel.setGeometry(QRect(10, 10, 450, 310)) self.prevPhotoButton = QPushButton("Previous", self) self.prevPhotoButton.setGeometry(QRect(10, 330, 88, 21)) self.prevPhotoButton.setFont(smallFont) self.nextPhotoButton = QPushButton("Next", self) self.nextPhotoButton.setGeometry(QRect(110, 330, 88, 21)) self.nextPhotoButton.setFont(smallFont) self.idLabel = QLabel("Id: ", self) self.idLabel.setGeometry(QRect(220, 330, 241, 18)) self.idLabel.setFont(smallFont) self.idLabel.setStyleSheet(""" border: 1px solid black;\n background-color: white;\n color: black; """) self.line = QFrame(self) self.line.setGeometry(QRect(10, 470, 861, 20)) self.line.setFrameShape(QFrame.HLine) self.line.setFrameShadow(QFrame.Sunken) self.titleLabel = QLabel("Results: 0", self) self.titleLabel.setGeometry(QRect(470, 10, 121, 20)) self.titleLabel.setFont(bigFont) self.dateToDEdit = QDateEdit(self) self.dateToDEdit.setGeometry(QRect(690, 520, 100, 30)) self.dateToDEdit.setDate(QDate.currentDate()) self.dateFromDEdit = QDateEdit(self) self.dateFromDEdit.setGeometry(QRect(580, 520, 100, 30)) self.dateFromDEdit.setDate(QDate.currentDate()) self.userComboBox = QComboBox(self) self.userComboBox.setGeometry(QRect(250, 520, 140, 30)) self.userComboBox.addItems(self.usrList) self.phraseLEdit = QLineEdit(self) self.phraseLEdit.setGeometry(QRect(400, 520, 170, 30)) self.findButton = QPushButton("Find", self) self.findButton.setGeometry(QRect(800, 490, 70, 61)) self.idLEdit = QLineEdit(self) self.idLEdit.setGeometry(QRect(10, 520, 230, 30)) self.dateFromCBox = QCheckBox("Date from", self) self.dateFromCBox.setGeometry(QRect(580, 490, 100, 20)) self.dateFromCBox.setFont(smallFont) self.dateToCBox = QCheckBox("Date to", self) self.dateToCBox.setGeometry(QRect(690, 490, 100, 20)) self.dateToCBox.setFont(smallFont) self.phraseCBox = QCheckBox("Phrase", self) self.phraseCBox.setGeometry(QRect(400, 490, 100, 20)) self.phraseCBox.setFont(smallFont) self.userCBox = QCheckBox("User", self) self.userCBox.setGeometry(QRect(250, 490, 100, 20)) self.userCBox.setFont(smallFont) self.idCBox = QCheckBox("Id", self) self.idCBox.setGeometry(QRect(10, 490, 100, 20)) self.idCBox.setFont(smallFont) self.createdDate = QLabel(self) self.createdDate.setGeometry(QRect(10, 460, 201, 16)) self.createdDate.setFont(smallFont) self.lastModLabel = QLabel(self) self.lastModLabel.setGeometry(QRect(240, 460, 221, 16)) self.lastModLabel.setFont(smallFont) self.descriptionLabel = QLabel(self) self.descriptionLabel.setGeometry(QRect(10, 360, 451, 91)) self.descriptionLabel.setFont(smallFont) self.descriptionLabel.setStyleSheet(""" border: 1px solid black;\n background-color: white;\n color: black; """) self.descriptionLabel.setAlignment(Qt.AlignLeading | Qt.AlignLeft | Qt.AlignTop) self.setWindowTitle("Search For Products") self.tableScrollArea.displayProductList(findProducts()) self.findButton.clicked.connect(self.findButtonClicked) self.nextPhotoButton.clicked.connect(self.nextPhotoClicked) self.prevPhotoButton.clicked.connect(self.previousPhotoClicked) def findButtonClicked(self): def dateCon(d: str): return d.replace(".", "-") productid = self.idLEdit.text() if self.idCBox.isChecked() else None usr = (self.userComboBox.currentText() if self.userCBox.isChecked() else None) phrase = (self.phraseLEdit.text() if self.phraseCBox.isChecked() else None) dateFrom = (dateCon(self.dateFromDEdit.text()) + "-00_00_00" if self.dateFromCBox.isChecked() else None) dateTo = (dateCon(self.dateToDEdit.text()) + "-23_59_59" if self.dateToCBox.isChecked() else None) self.tableScrollArea.displayProductList( findProducts( id=productid, username=usr, phrase=phrase, timeFrom=dateFrom, timeTo=dateTo, ), usr, ) def nextPhotoClicked(self): if self.currentItem is None: return self.photoCursor += 1 if len(self.currentItem["filenames"]) == self.photoCursor: self.photoCursor = 0 self.reloadPhoto() def previousPhotoClicked(self): if self.currentItem is None: return self.photoCursor -= 1 if self.photoCursor < 0: self.photoCursor = len(self.currentItem["filenames"]) - 1 self.reloadPhoto() def selectCurrentProduct(self, item): self.currentItem = item self.photoCursor = 0 self.reloadPhoto() self.idLabel.setText("Id: {}".format(item["id"])) self.descriptionLabel.setText(item["desc"]) self.createdDate.setText(f"Created: {item['creation_date'][0:10]}") self.lastModLabel.setText( f"Last modified: {item['last_updated'][0:10]}") def reloadPhoto(self): if not self.currentItem["filenames"]: pixmap = noImagePixmap else: pixmap = QPixmap() loaded = pixmap.load( self.currentItem["filenames"][self.photoCursor]) if not loaded: pixmap = noImagePixmap self.photoLabel.setPixmap( pixmap.scaled( self.photoLabel.width(), self.photoLabel.height(), Qt.IgnoreAspectRatio, Qt.FastTransformation, ))