Exemple #1
0
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()  #显示日期控件
Exemple #2
0
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()