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 VistaModificaMovimento(QWidget): def __init__(self, movimento_selezionato, controller, callback): super(VistaModificaMovimento, self).__init__() self.setFixedSize(500, 400) self.mov_sel = movimento_selezionato self.movimento = ControlloreMovimento(movimento_selezionato) self.controller = controller self.callback = callback self.info = {} btn_modifica = QPushButton("Modifica") btn_modifica.setStyleSheet( "background-color: #90ee90; font-size: 13px; font-weight: bold;") btn_modifica.setShortcut("Return") btn_modifica.clicked.connect(self.mod_movimento) btn_annulla = QPushButton("Annulla") btn_annulla.setStyleSheet( "background-color: #f08080; font-size: 13px; font-weight: bold;") btn_annulla.setShortcut("Esc") btn_annulla.clicked.connect(self.annulla) btn_data = QPushButton("Inserisci data") btn_data.clicked.connect(self.visualizza_calendario) self.v_layout = QVBoxLayout() self.v_layout.addLayout( self.get_label_line("<b>Causale</b>", "Causale", self.movimento.get_causale_movimento())) self.v_layout.addLayout( self.get_label_line("<b>Importo<b/>", "Importo", self.movimento.get_importo_movimento())) self.v_layout.addLayout(self.get_radio_button(['Incasso', 'Spesa'])) self.v_layout.addWidget(btn_data) self.v_layout.addItem( QSpacerItem(45, 45, QSizePolicy.Minimum, QSizePolicy.Minimum)) self.v_layout.addWidget(btn_modifica) self.v_layout.addWidget(btn_annulla) self.setLayout(self.v_layout) self.setWindowTitle("Modifica Movimento") #funzione che ritorna un layout con una lable ed una casella di testo poste in orizzontale def get_label_line(self, label, tipo, placeholder): layout = QHBoxLayout() layout.addWidget(QLabel(label)) current_text_edit = QLineEdit(self) current_text_edit.setText(str(placeholder)) layout.addWidget(current_text_edit) self.info[tipo] = current_text_edit return layout # funzione di scelta del tipo di movimento def get_radio_button(self, lista): h_lay = QHBoxLayout() h_lay.addWidget(QLabel("<b>Tipo di movimento<b/>")) for item in lista: self.radiobutton = QRadioButton(item) self.radiobutton.tipo = item self.radiobutton.toggled.connect(self.scelta_radio) h_lay.addWidget(self.radiobutton) return h_lay # funzione che ritorna true o false a seconda della selezione del radioButton def scelta_radio(self): self.radioButton = self.sender() # la scelta viene usata per il calcolo del saldo totale dei movimenti if self.radioButton.isChecked(): if self.radioButton.tipo == "Incasso": self.tipo = True if self.radioButton.tipo == "Spesa": self.tipo = False # funzione di visualizzazione del calendario che permette di selezionare la data def visualizza_calendario(self): self.window = QWidget() self.v1_layout = QVBoxLayout() self.calendario = QCalendarWidget() self.calendario.setGridVisible(True) self.v1_layout.addWidget(self.calendario) self.btn_conferma = QPushButton("Conferma") self.btn_conferma.clicked.connect(self.window.close) self.v1_layout.addWidget(self.btn_conferma) self.window.setLayout(self.v1_layout) self.window.show() # funzione che ritorna la data che viene selezionata nel calendario def data_selezionata(self): oggi = datetime.today() oggi_formattato = oggi.strftime("%d/%m/%Y") oggi_formattato_per_unix = datetime.strptime(oggi_formattato, '%d/%m/%Y') oggi_unix = datetime.timestamp(oggi_formattato_per_unix) try: data_selezionata = self.calendario.selectedDate() data = "{}/{}/{}".format(data_selezionata.day(), data_selezionata.month(), data_selezionata.year()) self.calendario.close() return data except: QMessageBox.critical(self, 'Errore', 'Per favore, inserisci la data', QMessageBox.Ok, QMessageBox.Ok) # funzione di annullamento di inserimento del movimento def annulla(self): self.close() from listamovimenti.views.VistaListaMovimenti import VistaListaMovimenti self.vistaListaMovimenti = VistaListaMovimenti() return self.vistaListaMovimenti.show() def mod_movimento(self): try: data = self.data_selezionata() causale = self.info["Causale"].text() descrizione = str(self.radioButton.tipo) if isinstance(float(self.info["Importo"].text()), float): importo = self.info["Importo"].text() else: QMessageBox.critical( self, 'Errore', 'Per favore, inserisci un importo valido', QMessageBox.Ok, QMessageBox.Ok) if descrizione == "": QMessageBox.critical( self, 'Errore', 'Per favore, inserisci tutte le informazioni richieste', QMessageBox.Ok, QMessageBox.Ok) else: movimento = Movimento(data, causale, descrizione, importo) movimento.isEntrata = self.tipo self.controller.rimuovi_movimento(self.mov_sel) self.controller.aggiungi_movimento(movimento) self.controller.save_data() self.callback() self.close() from listamovimenti.views.VistaListaMovimenti import VistaListaMovimenti VistaListaMovimenti().update() self.vistaListaMovimenti = VistaListaMovimenti() return self.vistaListaMovimenti.show() except: QMessageBox.critical( self, 'Errore', 'Per favore, inserisci tutte le informazioni richieste nel modo corretto', QMessageBox.Ok, QMessageBox.Ok)
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()