Example #1
0
    def __init__(self):
        super(MainWindow, self).__init__()

        self.selectedDate = QDate.currentDate()
        self.fontSize = 15

        centralWidget = QWidget()
        centralWidget.setStyleSheet("background-color:white;")
        dateLabel = QLabel("Date:")
        monthCombo = QComboBox()

        for month in range(1, 13):
            monthCombo.addItem(QDate.longMonthName(month))

        yearEdit = QDateTimeEdit()
        yearEdit.setDisplayFormat('yyyy')
        yearEdit.setDateRange(QDate(1753, 1, 1), QDate(8000, 1, 1))

        monthCombo.setCurrentIndex(self.selectedDate.month() - 1)
        yearEdit.setDate(self.selectedDate)

        self.fontSizeLabel = QLabel("Font size:")
        self.fontSizeSpinBox = QSpinBox()
        self.fontSizeSpinBox.setRange(1, 64)
        self.fontSizeSpinBox.setValue(10)

        self.editor = QTextBrowser()
        self.insertCalendar()

        self.l1 = QLabel()
        self.l1.setText(QDate.longMonthName(self.selectedDate.month()))
        self.l1.setAlignment(Qt.AlignCenter)
        self.l1.setStyleSheet(
            "border: 2px solid #F44336;color:white;"
            "border-radius: 10px;font-size:19px;margin-left:100px;margin-right:100px; background-color:#F44336;"
        )

        monthCombo.activated.connect(self.setMonth)
        yearEdit.dateChanged.connect(self.setYear)
        self.fontSizeSpinBox.valueChanged.connect(self.setfontSize)

        controlsLayout = QHBoxLayout()
        # controlsLayout.setStyleSheet("background-color:red;")
        # controlsLayout.addWidget(dateLabel)
        controlsLayout.addWidget(monthCombo)
        controlsLayout.addWidget(yearEdit)
        controlsLayout.addSpacing(20)
        #       controlsLayout.addWidget(self.fontSizeLabel)
        #       controlsLayout.addWidget(self.fontSizeSpinBox)
        controlsLayout.addStretch(1)

        centralLayout = QVBoxLayout()
        centralLayout.addWidget(self.l1)
        centralLayout.addWidget(self.editor, 1)
        centralLayout.addLayout(controlsLayout)

        centralWidget.setLayout(centralLayout)

        self.setCentralWidget(centralWidget)
        self.editor.setStyleSheet("background-color:white;padding:10px;")
Example #2
0
class Start_Window(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(settings.START_WINDOW_WIDTH,
                    settings.START_WINDOW_HEIGHT)  #Устанавливаем размер окна

        self.work_frame = QFrame(self)

        self.create_evening_game_button = QPushButton("Создать игровой вечер")
        self.date_edit = QDateTimeEdit()
        self.ask_date_label = QLabel("Введите дату игрового вечера")

        self.customise()

    def move_to_center(self):
        # Перенесем окошко в центр
        form_rectangle = self.frameGeometry()
        window_center = QDesktopWidget().availableGeometry().center()
        form_rectangle.moveCenter(window_center)
        self.move(form_rectangle.topLeft())

    def customise(self):
        """Метод настраивает виджеты для работы"""
        self.setWindowTitle("Mafia-Driver")  #Название программы
        self.work_frame.setFrameStyle(QFrame.Box)

        self.move_to_center()

        #Внесем текущую дату с компьютера
        now_date = QDate.currentDate()
        now_time = QTime.currentTime()

        self.date_edit.setDate(now_date)
        self.date_edit.setTime(now_time)

        #Перенесем фрейм в центр
        form_horizontalLayout = QHBoxLayout(self)
        form_horizontalLayout.setContentsMargins(settings.START_WINDOW_SHIFT,
                                                 settings.START_WINDOW_SHIFT,
                                                 settings.START_WINDOW_SHIFT,
                                                 settings.START_WINDOW_SHIFT)

        form_horizontalLayout.addWidget(self.work_frame)

        #Настроим макет и виджеты внутри фрейма
        work_frame_horizontallLayout = QHBoxLayout()
        work_frame_veritcallLayout = QVBoxLayout(self.work_frame)

        work_frame_horizontallLayout.addWidget(self.date_edit)
        work_frame_horizontallLayout.addWidget(self.ask_date_label)

        work_frame_veritcallLayout.addLayout(work_frame_horizontallLayout)
        work_frame_veritcallLayout.addWidget(self.create_evening_game_button)
Example #3
0
 def add_input(self, k, v):
     lbl = QLabel(self)
     lbl.setText(k)
     self.vbox.addWidget(lbl)
     if isinstance(v, datetime.date):
         qle = QDateTimeEdit(self)
         qle.setDate(v)
         qle.setDisplayFormat("yyyy.MM.dd")
         qle.setCalendarPopup(True)
     else:
         qle = QLineEdit(self)
         qle.setText(str(v))
     self.vbox.addWidget(qle)
     return qle
Example #4
0
    def __init__(self):
        super(MainWindow, self).__init__()

        self.selectedDate = QDate.currentDate()
        self.fontSize = 10

        centralWidget = QWidget()

        dateLabel = QLabel("Date:")
        monthCombo = QComboBox()

        for month in range(1, 13):
            monthCombo.addItem(QDate.longMonthName(month))

        yearEdit = QDateTimeEdit()
        yearEdit.setDisplayFormat("yyyy")
        yearEdit.setDateRange(QDate(1753, 1, 1), QDate(8000, 1, 1))

        monthCombo.setCurrentIndex(self.selectedDate.month() - 1)
        yearEdit.setDate(self.selectedDate)

        self.fontSizeLabel = QLabel("Font size:")
        self.fontSizeSpinBox = QSpinBox()
        self.fontSizeSpinBox.setRange(1, 64)
        self.fontSizeSpinBox.setValue(10)

        self.editor = QTextBrowser()
        self.insertCalendar()

        monthCombo.activated.connect(self.setMonth)
        yearEdit.dateChanged.connect(self.setYear)
        self.fontSizeSpinBox.valueChanged.connect(self.setfontSize)

        controlsLayout = QHBoxLayout()
        controlsLayout.addWidget(dateLabel)
        controlsLayout.addWidget(monthCombo)
        controlsLayout.addWidget(yearEdit)
        controlsLayout.addSpacing(24)
        controlsLayout.addWidget(self.fontSizeLabel)
        controlsLayout.addWidget(self.fontSizeSpinBox)
        controlsLayout.addStretch(1)

        centralLayout = QVBoxLayout()
        centralLayout.addLayout(controlsLayout)
        centralLayout.addWidget(self.editor, 1)
        centralWidget.setLayout(centralLayout)

        self.setCentralWidget(centralWidget)
Example #5
0
    def __init__(self):
        super(MainWindow, self).__init__()

        self.selectedDate = QDate.currentDate()
        self.fontSize = 10

        centralWidget = QWidget()

        dateLabel = QLabel("Date:")
        monthCombo = QComboBox()

        for month in range(1, 13):
            monthCombo.addItem(QDate.longMonthName(month))

        yearEdit = QDateTimeEdit()
        yearEdit.setDisplayFormat('yyyy')
        yearEdit.setDateRange(QDate(1753, 1, 1), QDate(8000, 1, 1))

        monthCombo.setCurrentIndex(self.selectedDate.month() - 1)
        yearEdit.setDate(self.selectedDate)

        self.fontSizeLabel = QLabel("Font size:")
        self.fontSizeSpinBox = QSpinBox()
        self.fontSizeSpinBox.setRange(1, 64)
        self.fontSizeSpinBox.setValue(10)

        self.editor = QTextBrowser()
        self.insertCalendar()

        monthCombo.activated.connect(self.setMonth)
        yearEdit.dateChanged.connect(self.setYear)
        self.fontSizeSpinBox.valueChanged.connect(self.setfontSize)

        controlsLayout = QHBoxLayout()
        controlsLayout.addWidget(dateLabel)
        controlsLayout.addWidget(monthCombo)
        controlsLayout.addWidget(yearEdit)
        controlsLayout.addSpacing(24)
        controlsLayout.addWidget(self.fontSizeLabel)
        controlsLayout.addWidget(self.fontSizeSpinBox)
        controlsLayout.addStretch(1)

        centralLayout = QVBoxLayout()
        centralLayout.addLayout(controlsLayout)
        centralLayout.addWidget(self.editor, 1)
        centralWidget.setLayout(centralLayout)

        self.setCentralWidget(centralWidget)
Example #6
0
class Scheduler(QDialog):
    def __init__(self, photo, caption, ig):
        super(Scheduler, self).__init__()
        self.photo = photo
        self.caption = caption
        self.ig = ig
        self.init_ui()
        self.exec_()

    def init_ui(self):
        self.setWindowTitle("Schedule Post")
        self.date_edit = QDateTimeEdit(QDateTime.currentDateTime())
        self.date_edit.setDisplayFormat("dd.MM.yyyy hh:mm")
        self.date_edit.setMinimumDateTime(QDateTime.currentDateTime())

        self.calendar = QCalendarWidget(self)
        self.calendar.setGridVisible(True)

        self.calendar.setMinimumDate(QDate.currentDate())
        self.calendar.setSelectedDate(QDate.currentDate())
        self.calendar.clicked.connect(self.set_date_time)

        self.confirm_button = QPushButton("Confirm")
        self.confirm_button.clicked.connect(self.set_schedule)

        vbox = QVBoxLayout(self)
        vbox.addWidget(self.date_edit)
        vbox.addWidget(self.calendar)
        vbox.addWidget(self.confirm_button)

    def set_date_time(self, qDate):
        self.date_edit.setDate(qDate)

    def set_schedule(self):
        self.date_time = self.date_edit.dateTime()
        schedule = self.date_time.toPyDateTime()
        now = datetime.now()
        delta_t = schedule - now
        secs = delta_t.seconds + 1

        t = Timer(secs, self.ig.upload, [self.photo, self.caption])
        t.start()

        self.accept()
Example #7
0
class DateEditField(DataEditField):
    """
    Class for editing date fields.
    """
    def __init__(self, parent, title, help_text):
        self.field = QDateTimeEdit(datetime.now().date())
        self.field.setCalendarPopup(True)
        self.field.setDisplayFormat("dd-MM-yyyy")

        DataEditField.__init__(self, parent, title, help_text, self.field)

    def clearField(self):
        """
        Set field to current date
        """
        self.field.setDate(datetime.now().date())

    def getValue(self):
        """
        Get value of DateEditField
        """
        return qDate2Date(self.field.date())
Example #8
0
class Reservations(QWidget):
    """
    Klasa odpowiedzialna za widget klienci
    """
    def __init__(self, parent, db):
        super(QWidget, self).__init__(parent)
        self.parent = parent
        self.btn_mod = QPushButton('Zmiana statusu')
        self.btn_usun = QPushButton('Usuń')
        self.btn_dodaj = QPushButton('Dodaj')
        self.lbl_klient_ = QLabel('')
        self.lbl_usluga_ = QLabel('')
        self.lbl_termin_ = QDateTimeEdit()
        self.gb_layout = QVBoxLayout()
        self.kalendarz = QCalendarWidget()
        self.view_u = QTableView()
        self.view_k = QTableView()
        self.view_p = QTableView()
        self.view = QTableView()
        self.proxy_u = QSortFilterProxyModel(self)
        self.proxy_k = QSortFilterProxyModel(self)
        self.proxy_p = QSortFilterProxyModel(self)
        self.proxy = QSortFilterProxyModel(self)
        self.id_klient = -1
        self.id_usluga = -1
        self.id_pracownik = -1
        self.id_rezerwacje = -1
        self.data = None
        self.data_do = None
        self.dzien_tyg = 0
        self.czas = []

        # Lista składana przycisków godzin
        self.btn_godz = [QPushButton(str(i + 1)) for i in range(16)]

        # Parametry połączenia z bazą
        self.model_u = QSqlTableModel(self, db)
        self.model_k = QSqlTableModel(self, db)
        self.model_p = QSqlTableModel(self, db)
        self.model = QSqlTableModel(self, db)

        self.initUI()

    def initUI(self):
        """
        Inicjuje UI
        """
        self.view_u.setObjectName('Usługi')
        self.view_k.setObjectName('Klienci')
        self.view_p.setObjectName('Pracownicy')
        self.view.setObjectName('Rezerwacje')
        self.table_init_u()
        self.table_init_k()
        self.table_init_p()
        self.table_init()
        self.btn_mod.setDisabled(True)
        self.btn_usun.setDisabled(True)
        self.btn_dodaj.setDisabled(True)

        # Tworzenie kontrolek
        lbl_wysz_u = QLabel('Wyszukaj usługę:')
        lbl_wysz_k = QLabel('Wyszukaj klienta:')
        lbl_wysz_p = QLabel('Wyszukaj pracownika:')
        txt_wysz_u = QLineEdit(self)
        txt_wysz_k = QLineEdit(self)
        txt_wysz_p = QLineEdit(self)
        lbl_klient = QLabel('Klient:')
        lbl_usluga = QLabel('Usługa:')
        lbl_termin = QLabel('Termin:')

        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.kalendarz.sizePolicy().hasHeightForWidth())
        self.kalendarz.setSizePolicy(sizePolicy)

        # Tworzenie widoków
        centralbox = QHBoxLayout()
        hbox_wysz_u = QHBoxLayout()
        hbox_wysz_k = QHBoxLayout()
        hbox_wysz_p = QHBoxLayout()
        vbox_u = QVBoxLayout()
        vbox_k = QVBoxLayout()
        vbox_p = QVBoxLayout()
        vbox_right = QVBoxLayout()
        hbox_btn = QHBoxLayout()
        hbox_k = QHBoxLayout()
        hbox_u = QHBoxLayout()
        hbox_t = QHBoxLayout()
        vbox_cal = QVBoxLayout()
        groupbox = QGroupBox('Godziny:')
        groupbox.setLayout(self.gb_layout)
        hbox_left = QHBoxLayout()

        # Metody
        self.lbl_termin_.setCalendarWidget(self.kalendarz)
        self.lbl_termin_.setDate(self.kalendarz.selectedDate())
        self.dzien_tyg = self.kalendarz.selectedDate().dayOfWeek()
        txt_wysz_u.textChanged.connect(self.searching_u)
        txt_wysz_k.textChanged.connect(self.searching_k)
        txt_wysz_p.textChanged.connect(self.searching_p)
        self.view_k.clicked.connect(lambda: self.clicked_table(self.view_k))
        self.view_p.clicked.connect(lambda: self.clicked_table(self.view_p))
        self.view_u.clicked.connect(lambda: self.clicked_table(self.view_u))
        self.view.clicked.connect(lambda: self.clicked_table(self.view))
        self.kalendarz.clicked.connect(self.show_data)
        self.btn_dodaj.clicked.connect(self.add)
        self.btn_mod.clicked.connect(self.modify)
        self.btn_usun.clicked.connect(self.remove)

        # Ustawianie widoków
        hbox_wysz_k.addWidget(lbl_wysz_k)
        hbox_wysz_k.addWidget(txt_wysz_k)
        hbox_wysz_p.addWidget(lbl_wysz_p)
        hbox_wysz_p.addWidget(txt_wysz_p)
        hbox_wysz_u.addWidget(lbl_wysz_u)
        hbox_wysz_u.addWidget(txt_wysz_u)
        vbox_u.addLayout(hbox_wysz_u)
        vbox_u.addWidget(self.view_u)
        vbox_k.addLayout(hbox_wysz_k)
        vbox_k.addWidget(self.view_k)
        vbox_p.addLayout(hbox_wysz_p)
        vbox_p.addWidget(self.view_p)
        vbox_right.addLayout(vbox_p)
        vbox_right.addLayout(vbox_u)
        vbox_right.addLayout(vbox_k)
        hbox_btn.addWidget(self.btn_usun)
        hbox_btn.addWidget(self.btn_mod)
        hbox_k.addWidget(lbl_klient)
        hbox_k.addWidget(self.lbl_klient_)
        hbox_u.addWidget(lbl_usluga)
        hbox_u.addWidget(self.lbl_usluga_)
        hbox_t.addWidget(lbl_termin)
        hbox_t.addWidget(self.lbl_termin_)
        vbox_cal.addWidget(self.kalendarz)
        vbox_cal.addLayout(hbox_u)
        vbox_cal.addLayout(hbox_t)
        vbox_cal.addLayout(hbox_k)
        self.view.setSizePolicy(
            QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum))
        vbox_cal.addWidget(self.view)
        vbox_cal.addLayout(hbox_btn)
        vbox_cal.addWidget(self.btn_dodaj)
        hbox_left.addLayout(vbox_cal)
        hbox_left.addWidget(groupbox)
        centralbox.addLayout(hbox_left)
        centralbox.addLayout(vbox_right)

        self.setLayout(centralbox)
        self.show()

    def show_data(self):
        self.lbl_termin_.setDate(self.kalendarz.selectedDate())
        self.dzien_tyg = self.kalendarz.selectedDate().dayOfWeek()
        self.clicked_table(self.view_p)

    def table_init_u(self):
        """
        Inicjuje wygląd tabeli usługi
        """
        # self.model_u.setTable('uslugi')
        query = QSqlQuery(
            'SELECT uslugi.uslugi_id, uslugi.nazwa, uslugi.cena, date_format(uslugi.czas, "%H:%i") AS czas FROM uslugi NATURAL JOIN uzytkownik_usluga WHERE uzytkownik_usluga.uzytkownik_id = '
            + str(self.id_pracownik) + ';')
        self.model_u.setQuery(query)
        # self.model_u.select()

        self.proxy_u.setSourceModel(self.model_u)

        naglowki = {
            'uslugi_id': 'ID',
            'nazwa': 'Nazwa',
            'cena': 'Cena',
            "czas": 'Czas',
        }
        # Ustawianie nagłówków
        ilosc_kolumn = self.model_u.columnCount()
        for i in range(ilosc_kolumn):
            nazwa_kolumn = self.model_u.headerData(i, Qt.Horizontal)
            self.model_u.setHeaderData(i, Qt.Horizontal,
                                       naglowki[nazwa_kolumn])

        self.view_u.setSizeAdjustPolicy(
            QAbstractScrollArea.AdjustToContentsOnFirstShow)
        self.view_u.setSortingEnabled(True)
        self.view_u.setAlternatingRowColors(True)

        # Wczytanie danych
        self.view_u.setModel(self.proxy_u)
        self.view_u.hideColumn(0)
        self.view_u.sortByColumn(1, Qt.AscendingOrder)
        self.view_u.setEditTriggers(QAbstractItemView.NoEditTriggers)

    def table_init_k(self):
        """
        Inicjuje wygląd tabeli klienta
        """
        self.model_k.setTable('klienci')
        query = QSqlQuery(
            'SELECT klienci_id, imie, nazwisko, email, telefon, ulica, numer_mieszkania, miejscowosc, poczta FROM '
            'klienci;')
        self.model_k.setQuery(query)
        # self.model_k.select()

        self.proxy_k.setSourceModel(self.model_k)

        naglowki = {
            'klienci_id': 'ID',
            'imie': 'Imię',
            'nazwisko': 'Nazwisko',
            "email": 'Email',
            'telefon': 'Telefon',
            'ulica': 'Ulica',
            'numer_mieszkania': 'Numer mieszkania',
            'miejscowosc': 'Miejscowosc',
            'poczta': 'Kod pocztowy',
        }
        # Ustawianie nagłówków
        ilosc_kolumn = self.model_k.columnCount()
        for i in range(ilosc_kolumn):
            nazwa_kolumn = self.model_k.headerData(i, Qt.Horizontal)
            self.model_k.setHeaderData(i, Qt.Horizontal,
                                       naglowki[nazwa_kolumn])

        self.view_k.setSizeAdjustPolicy(
            QAbstractScrollArea.AdjustToContentsOnFirstShow)
        self.view_k.setSortingEnabled(True)
        self.view_k.setAlternatingRowColors(True)

        # Wczytanie danych
        self.view_k.setModel(self.proxy_k)
        self.view_k.hideColumn(0)
        self.view_k.sortByColumn(1, Qt.AscendingOrder)
        self.view_k.setEditTriggers(QAbstractItemView.NoEditTriggers)

    def table_init_p(self):
        """
        Inicjuje wygląd tabeli pracownik
        """
        self.model_p.setTable('uzytkownik')
        query = QSqlQuery(
            'SELECT uzytkownik_id,  imie, nazwisko FROM uzytkownik WHERE '
            'pracownik = 1;')
        self.model_p.setQuery(query)
        # self.model_p.select()

        self.proxy_p.setSourceModel(self.model_p)

        naglowki = {
            'uzytkownik_id': 'ID',
            'imie': 'Imię',
            "nazwisko": 'Nazwisko',
        }
        # Ustawianie nagłówków
        ilosc_kolumn = self.model_p.columnCount()
        for i in range(ilosc_kolumn):
            nazwa_kolumn = self.model_p.headerData(i, Qt.Horizontal)
            self.model_p.setHeaderData(i, Qt.Horizontal,
                                       naglowki[nazwa_kolumn])

        self.view_p.setSizeAdjustPolicy(
            QAbstractScrollArea.AdjustToContentsOnFirstShow)
        self.view_p.setSortingEnabled(True)
        self.view_p.setAlternatingRowColors(True)

        # Wczytanie danych
        self.view_p.setModel(self.proxy_p)
        self.view_p.hideColumn(0)
        self.view_p.sortByColumn(1, Qt.AscendingOrder)
        self.view_p.setEditTriggers(QAbstractItemView.NoEditTriggers)

    def table_init(self):
        """
        Inicjuje wygląd tabeli
        """
        query = QSqlQuery(
            'SELECT wizyty.wizyty_id, CONCAT(klienci.imie, " ", klienci.nazwisko) AS klient, uslugi.nazwa, '
            'wizyty.rezerwacja_od, wizyty.rezerwacja_do, wizyty.status FROM klienci, uslugi NATURAL JOIN wizyty WHERE wizyty.rezerwacja_od > CURRENT_TIMESTAMP AND wizyty.uzytkownik_id = '
            + str(self.id_pracownik) + ';')
        self.model.setQuery(query)
        self.proxy.setSourceModel(self.model)

        naglowki = {
            'wizyty_id': 'ID',
            'klient': 'Klient',
            'nazwa': 'Usługa',
            'rezerwacja_od': 'Rezerwacja od',
            "rezerwacja_do": 'Rezerwacja do',
            'status': 'Status rezerwacji'
        }
        # Ustawianie nagłówków
        ilosc_kolumn = self.model.columnCount()
        for i in range(ilosc_kolumn):
            nazwa_kolumn = self.model.headerData(i, Qt.Horizontal)
            self.model.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn])

        self.view.setSizeAdjustPolicy(
            QAbstractScrollArea.AdjustToContentsOnFirstShow)
        self.view.setSortingEnabled(True)
        self.view.setAlternatingRowColors(True)

        # Wczytanie danych
        self.view.setModel(self.proxy)
        self.view.hideColumn(0)
        self.view.sortByColumn(4, Qt.AscendingOrder)
        self.view.setEditTriggers(QAbstractItemView.NoEditTriggers)

    def clicked_table(self, view):
        """
        Metoda edytująca zaznaczone wiersze - Wstawia wartości z wierszy w odpowiednie pola
        """
        index = (view.selectionModel().currentIndex())
        if view.objectName() == 'Klienci':
            self.id_klient = index.sibling(index.row(), 0).data()
            self.lbl_klient_.setText('<b>' +
                                     index.sibling(index.row(), 1).data() +
                                     ' ' +
                                     index.sibling(index.row(), 2).data() +
                                     '</b>')
        elif view.objectName() == 'Usługi':
            self.id_usluga = index.sibling(index.row(), 0).data()
            self.lbl_usluga_.setText('<b>' +
                                     index.sibling(index.row(), 1).data() +
                                     '</b>')
            self.data_do = index.sibling(index.row(), 3).data()
        elif view.objectName() == 'Rezerwacje':
            self.id_rezerwacje = index.sibling(index.row(), 0).data()
            if self.id_rezerwacje > 0:
                self.btn_mod.setEnabled(True)
                self.btn_usun.setEnabled(True)
        elif view.objectName() == 'Pracownicy':
            self.id_pracownik = index.sibling(index.row(), 0).data()
            self.czas = []
            for i in reversed(range(self.gb_layout.count())):
                self.gb_layout.itemAt(i).widget().setParent(None)
            czas = datetime.datetime(2000, 1, 1, 8, 0)
            dzien = {
                1: ('pon_od', 'pon_do'),
                2: ('wt_od', 'wt_do'),
                3: ('sr_od', 'sr_do'),
                4: ('czw_od', 'czw_do'),
                5: ('pt_od', 'pt_do'),
                6: ('sob_od', 'sob_do'),
                7: ('', '')
            }
            query = 'SELECT date_format({}, "%H") AS g_start, date_format({}, "%H") AS g_stop FROM godziny WHERE ' \
                    'uzytkownik_id = {};'.format(dzien[self.dzien_tyg][0], dzien[self.dzien_tyg][1], self.id_pracownik)
            wynik = query_to_db(query)
            if wynik:
                godzina_stop = (int(wynik[1]) - int(wynik[0])) * 2
                godzina = int(wynik[0])
                for btn in self.btn_godz:
                    btn.setEnabled(True)
            else:
                godzina_stop = 0
                godzina = 1
                for btn in self.btn_godz:
                    btn.setDisabled(True)
            minuta = 0
            czas = datetime.time(godzina, minuta)
            for i in range(godzina_stop):
                self.btn_godz[i].setText(czas.strftime("%H:%M"))
                self.czas.append(czas)
                self.btn_godz[i].setObjectName(str(i))
                self.gb_layout.addWidget(self.btn_godz[i])
                if i % 2 != 0:
                    godzina += 1
                    minuta = 0
                else:
                    minuta = 30
                czas = datetime.time(godzina, minuta)
            QMetaObject.connectSlotsByName(self)

            # Czyszczenie, odświeżanie
            self.refresh()
            query = QSqlQuery(
                'SELECT uslugi.uslugi_id, uslugi.nazwa, uslugi.cena, date_format(uslugi.czas, "%H:%i") AS czas FROM uslugi NATURAL JOIN uzytkownik_usluga WHERE uzytkownik_usluga.uzytkownik_id = '
                + str(self.id_pracownik) + ';')
            self.model_u.setQuery(query)
            self.lbl_klient_.setText('')
            self.lbl_usluga_.setText('')

        if self.id_klient > 0 and self.id_pracownik > 0 and self.id_usluga > 0:
            self.btn_dodaj.setEnabled(True)

    def if_checked(self, txt, q, val=None):
        """
        Sprawdza poprawność wprowadzonych damych.
        :param val: wartości do zapytania
        :param q: zapytanie query MySql
        :param txt: komunikat
        """
        if self.id_klient < 0 and self.id_pracownik < 0 and self.id_usluga < 0 and self.data is None:
            msg = QMessageBox(self)
            msg.setIcon(QMessageBox.Warning)
            msg.setText(txt)
            msg.setWindowTitle("Popraw dane")
            msg.exec_()
            return False
        else:
            print('Trwa zmiana w bazie danych')
            if val:
                print('Połączenie')
                query_to_db(q, val)
            else:
                print('Transakcja')
                return transaction_to_db(q)

            return True

    def refresh(self):
        """
        Odświeża widok tabeli rezerwacji
        """
        # Odświeżanie widoku tabeli
        query = QSqlQuery(
            'SELECT wizyty.wizyty_id, CONCAT(klienci.imie, " ", klienci.nazwisko) AS klient, uslugi.nazwa, '
            'wizyty.rezerwacja_od, wizyty.rezerwacja_do, wizyty.status FROM wizyty,klienci,uslugi WHERE wizyty.klienci_id= klienci.klienci_id AND wizyty.uslugi_id = uslugi.uslugi_id AND wizyty.rezerwacja_od > CURRENT_TIMESTAMP AND wizyty.uzytkownik_id = '
            + str(self.id_pracownik) + ';')
        self.model.setQuery(query)
        self.view.reset()

    def add(self):
        """
        Dodaje rezerwację do bazy danych i odświeża widok.
        """
        tekst = 'Nie wprowadzono wszystkich danych'
        self.data = self.lbl_termin_.dateTime().toString(Qt.ISODate)
        self.data_do = datetime.datetime.fromisoformat(
            self.data) + datetime.timedelta(
                hours=datetime.time.fromisoformat(self.data_do).hour,
                minutes=datetime.time.fromisoformat(self.data_do).minute)
        # Dodanie nowego użytkownika
        query = 'INSERT INTO wizyty (klienci_id, uslugi_id, uzytkownik_id, rezerwacja_od, rezerwacja_do, ' \
                'status) VALUES (%s, %s, %s, %s, %s, %s);'
        val = (self.id_klient, self.id_usluga, self.id_pracownik, self.data,
               str(self.data_do.isoformat()), 'oczekuje')
        print(val)

        if self.if_checked(tekst, query, val):
            msg = QMessageBox(self)
            msg.setIcon(QMessageBox.Information)
            msg.setText('Rezerwacja została dodana do bazy danych')
            msg.setWindowTitle("Dodano nową rezerwację")
            msg.exec_()
            self.refresh()

    def modify(self):
        """
        Zmienia status rezerwacji i odświeża widok.
        """
        tekst = 'Nie wprowadzono wszystkich danych'

        items = ('Oczekuje', 'Wykonana', 'Rezygnacja')
        item, ok = QInputDialog.getItem(self, "Wybierz status",
                                        "Wybierz nowy status rezerwacji",
                                        items, 0, False)

        if ok and item:
            # Zmodyfikowanie statusu
            query = 'UPDATE wizyty SET status = %s WHERE wizyty_id = %s;'
            val = (item.lower(), self.id_rezerwacje)

            if self.if_checked(tekst, query, val):
                msg = QMessageBox(self)
                msg.setIcon(QMessageBox.Information)
                msg.setText('Status rezerwacji został zmodyfikowany')
                msg.setWindowTitle("Zmodyfikowano status")
                msg.exec_()
                self.refresh()

    def remove(self):
        """
        Usuwa rezerwację z bazy danych
        """
        test = 'Błąd! Nie można usunąć danej rezerwacji!'
        query = 'DELETE FROM wizyty WHERE wizyty_id = %s'
        val = (self.id_rezerwacje, )
        ret = QMessageBox.question(
            self, 'Usuwanie rezerwacji',
            "Czy na pewno chcesz usunąć daną rezerwację klienta?",
            QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if ret == QMessageBox.Yes:
            if self.if_checked(test, query, val):
                msg = QMessageBox()
                msg.setIcon(QMessageBox.Information)
                msg.setText('Rezerwacja została usunięta')
                msg.setWindowTitle("Usunięto")
                msg.exec_()

                self.refresh()

    @pyqtSlot()
    def on_0_clicked(self):
        self.lbl_termin_.setTime(self.czas[0])

    @pyqtSlot()
    def on_1_clicked(self):
        self.lbl_termin_.setTime(self.czas[1])

    @pyqtSlot()
    def on_2_clicked(self):
        self.lbl_termin_.setTime(self.czas[2])

    @pyqtSlot()
    def on_3_clicked(self):
        self.lbl_termin_.setTime(self.czas[3])

    @pyqtSlot()
    def on_4_clicked(self):
        self.lbl_termin_.setTime(self.czas[4])

    @pyqtSlot()
    def on_5_clicked(self):
        self.lbl_termin_.setTime(self.czas[5])

    @pyqtSlot()
    def on_6_clicked(self):
        self.lbl_termin_.setTime(self.czas[6])

    @pyqtSlot()
    def on_7_clicked(self):
        self.lbl_termin_.setTime(self.czas[7])

    @pyqtSlot()
    def on_8_clicked(self):
        self.lbl_termin_.setTime(self.czas[8])

    @pyqtSlot()
    def on_9_clicked(self):
        self.lbl_termin_.setTime(self.czas[9])

    @pyqtSlot()
    def on_10_clicked(self):
        self.lbl_termin_.setTime(self.czas[10])

    @pyqtSlot()
    def on_11_clicked(self):
        self.lbl_termin_.setTime(self.czas[11])

    @pyqtSlot()
    def on_12_clicked(self):
        self.lbl_termin_.setTime(self.czas[12])

    @pyqtSlot()
    def on_13_clicked(self):
        self.lbl_termin_.setTime(self.czas[13])

    @pyqtSlot()
    def on_14_clicked(self):
        self.lbl_termin_.setTime(self.czas[14])

    @pyqtSlot()
    def on_15_clicked(self):
        self.lbl_termin_.setTime(self.czas[15])

    @pyqtSlot(str)
    def searching_u(self, text):
        """
        Wyszukuje po wszystkich kolumnach tabeli
        :param text:
        """
        search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp)
        self.proxy_u.setFilterRegExp(search)
        # Odpowiedzialne za kolumnę, po której filtruje
        self.proxy_u.setFilterKeyColumn(-1)

    @pyqtSlot(str)
    def searching_k(self, text):
        """
        Wyszukuje po wszystkich kolumnach tabeli
        :param text:
        """
        search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp)
        self.proxy_k.setFilterRegExp(search)
        # Odpowiedzialne za kolumnę, po której filtruje
        self.proxy_k.setFilterKeyColumn(-1)

    @pyqtSlot(str)
    def searching_p(self, text):
        """
        Wyszukuje po wszystkich kolumnach tabeli
        :param text:
        """
        search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp)
        self.proxy_p.setFilterRegExp(search)
        # Odpowiedzialne za kolumnę, po której filtruje
        self.proxy_p.setFilterKeyColumn(-1)
Example #9
0
class BRFManager(myqt.QFrameLayout):
    def __init__(self, wldset=None, parent=None):
        super(BRFManager, self).__init__(parent)

        self.viewer = BRFViewer(wldset, parent)
        self.kgs_brf_installer = None
        self.__initGUI__()

    def __initGUI__(self):
        self.setContentsMargins(10, 10, 10, 10)

        self._bplag = {}
        self._bplag['label'] = QLabel('BP Lags Nbr:')
        self._bplag['widget'] = myqt.QDoubleSpinBox(100, 0)
        self._bplag['widget'].setRange(1, 9999)
        self._bplag['widget'].setValue(300)
        self._bplag['widget'].setKeyboardTracking(True)

        self._etlag = {}
        self._etlag['label'] = QLabel('ET Lags Nbr:')
        self._etlag['widget'] = myqt.QDoubleSpinBox(300, 0)
        self._etlag['widget'].setRange(-1, 9999)
        self._etlag['widget'].setValue(300)
        self._etlag['widget'].setKeyboardTracking(True)

        # ---- BRF Data Range ----

        self._datastart = QDateTimeEdit()
        self._datastart.setCalendarPopup(True)
        self._datastart.setDisplayFormat('dd/MM/yyyy')

        self._dataend = QDateTimeEdit()
        self._dataend.setCalendarPopup(True)
        self._dataend.setDisplayFormat('dd/MM/yyyy')

        self.btn_seldata = QToolButtonSmall(icons.get_icon('select_range'))
        self.btn_seldata.clicked.connect(self.get_datarange)

        # ---- Detrend and Correct Options ----

        self._detrend = QCheckBox('Detrend')
        self._detrend.setCheckState(Qt.Checked)

        self._correct = QCheckBox('Correct WL')
        self._correct.setEnabled(False)

        # ---- Toolbar

        btn_comp = QPushButton('Compute BRF')
        btn_comp.clicked.connect(self.calc_brf)
        btn_comp.setFocusPolicy(Qt.NoFocus)

        self.btn_show = btn_show = QToolButtonSmall(icons.get_icon('search'))
        btn_show.clicked.connect(self.viewer.show)

        # Layout

        tbar = myqt.QFrameLayout()
        tbar.addWidget(btn_comp, 0, 0)
        tbar.addWidget(btn_show, 0, 1)
        tbar.setColumnStretch(0, 100)

        # ---- Main Layout

        row = 0
        self.addWidget(self._bplag['label'], row, 0)
        self.addWidget(self._bplag['widget'], row, 1)
        row += 1
        self.addWidget(self._etlag['label'], row, 0)
        self.addWidget(self._etlag['widget'], row, 1)
        row += 1
        self.setRowMinimumHeight(row, 15)
        row += 1
        self.addWidget(QLabel('BRF Start :'), row, 0)
        self.addWidget(self._datastart, row, 1)
        self.addWidget(self.btn_seldata, row, 2)
        row += 1
        self.addWidget(QLabel('BRF End :'), row, 0)
        self.addWidget(self._dataend, row, 1)
        row += 1
        self.setRowMinimumHeight(row, 15)
        row += 1
        self.addWidget(self._detrend, row, 0, 1, 2)
        row += 1
        self.addWidget(self._correct, row, 0, 1, 2)
        row += 1
        self.setRowMinimumHeight(row, 5)
        self.setRowStretch(row, 100)
        row += 1
        self.addWidget(tbar, row, 0, 1, 3)

        self.setColumnStretch(self.columnCount(), 100)

        # ---- Install Panel

        if not KGSBRFInstaller().kgsbrf_is_installed():
            self.__install_kgs_brf_installer()

    # ---- Properties

    @property
    def lagBP(self):
        return self._bplag['widget'].value()

    @property
    def lagET(self):
        return self._etlag['widget'].value()

    @property
    def detrend(self):
        if self._detrend.checkState():
            return 'Yes'
        else:
            return 'No'

    @property
    def correct_WL(self):
        return 'No'

    @property
    def brfperiod(self):
        y, m, d = self._datastart.date().getDate()
        dstart = xldate_from_date_tuple((y, m, d), 0)

        y, m, d = self._dataend.date().getDate()
        dend = xldate_from_date_tuple((y, m, d), 0)

        return (dstart, dend)

    # ---- KGS BRF installer

    def __install_kgs_brf_installer(self):
        """
        Installs a KGSBRFInstaller that overlays the whole brf tool
        layout until the KGS_BRF program is installed correctly.
        """
        self.kgs_brf_installer = KGSBRFInstaller()
        self.kgs_brf_installer.sig_kgs_brf_installed.connect(
            self.__uninstall_kgs_brf_installer)
        self.addWidget(self.kgs_brf_installer, 0, 0, self.rowCount(),
                       self.columnCount())

    def __uninstall_kgs_brf_installer(self):
        """
        Uninstall the KGSBRFInstaller after the KGS_BRF program has been
        installed properly.
        """
        self.kgs_brf_installer.sig_kgs_brf_installed.disconnect()
        self.kgs_brf_installer = None

    def set_wldset(self, wldset):
        """Set the namespace for the wldset in the widget."""
        self.wldset = wldset
        self.viewer.set_wldset(wldset)
        self.setEnabled(wldset is not None)
        if wldset is not None:
            date_start, date_end = self.set_datarange(
                self.wldset['Time'][[0, -1]])
            self._datastart.setMinimumDate(date_start)
            self._dataend.setMaximumDate(date_end)

    def get_datarange(self):
        child = self
        while True:
            try:
                child.parent().raise_()
            except Exception:
                break
            else:
                child = child.parent()

    def set_datarange(self, times):
        date_start = xldate_as_tuple(times[0], 0)
        date_start = QDate(date_start[0], date_start[1], date_start[2])
        self._datastart.setDate(date_start)

        date_end = xldate_as_tuple(times[1], 0)
        date_end = QDate(date_end[0], date_end[1], date_end[2])
        self._dataend.setDate(date_end)

        return date_start, date_end

    def calc_brf(self):
        """Prepare the data, calcul the brf, and save and plot the results."""

        # Prepare the datasets.

        well = self.wldset['Well']

        t1 = min(self.brfperiod)
        i1 = np.where(self.wldset['Time'] >= t1)[0][0]

        t2 = max(self.brfperiod)
        i2 = np.where(self.wldset['Time'] <= t2)[0][-1]

        time = np.copy(self.wldset['Time'][i1:i2 + 1])
        wl = np.copy(self.wldset['WL'][i1:i2 + 1])
        bp = np.copy(self.wldset['BP'][i1:i2 + 1])
        if len(bp) == 0:
            msg = ("The barometric response function cannot be computed"
                   " because the currently selected water level dataset does"
                   " not contain any barometric data for the selected period.")
            QMessageBox.warning(self, 'Warning', msg, QMessageBox.Ok)
            return
        et = np.copy(self.wldset['ET'][i1:i2 + 1])
        if len(et) == 0:
            et = np.zeros(len(wl))

        lagBP = self.lagBP
        lagET = self.lagET
        detrend = self.detrend
        correct = self.correct_WL

        # Fill the gaps in the dataset.

        dt = np.min(np.diff(time))
        tc = np.arange(t1, t2 + dt / 2, dt)
        if len(tc) != len(time):
            print('Filling gaps in data with linear interpolation.')
            indx = np.where(~np.isnan(wl))[0]
            wl = np.interp(tc, time[indx], wl[indx])

            indx = np.where(~np.isnan(bp))[0]
            bp = np.interp(tc, time[indx], bp[indx])

            indx = np.where(~np.isnan(et))[0]
            et = np.interp(tc, time[indx], et[indx])

            time = tc

        QApplication.setOverrideCursor(Qt.WaitCursor)
        print('calculating BRF')

        bm.produce_BRFInputtxt(well, time, wl, bp, et)
        msg = 'Not enough data. Try enlarging the selected period'
        msg += ' or reduce the number of BP and ET lags.'
        if lagBP >= len(time) or lagET >= len(time):
            QApplication.restoreOverrideCursor()
            QMessageBox.warning(self, 'Warning', msg, QMessageBox.Ok)
            return

        bm.produce_par_file(lagBP, lagET, detrend, correct)
        bm.run_kgsbrf()

        try:
            lag, A, err = bm.read_BRFOutput()
            date_start = self._datastart.date().getDate()
            date_end = self._dataend.date().getDate()
            self.wldset.save_brf(lag, A, err, date_start, date_end)
            self.viewer.new_brf_added()
            self.viewer.show()
            QApplication.restoreOverrideCursor()
        except Exception:
            QApplication.restoreOverrideCursor()
            QMessageBox.warning(self, 'Warning', msg, QMessageBox.Ok)
            return
Example #10
0
class EventController(QWidget):
    def __init__(self, parent=None, default_style='Fusion'):
        super(EventController, self).__init__(parent)

        # main window attribute
        self.setGeometry(300, 100, 800, 800)
        self.setWindowTitle('Event controller')
        QApplication.setStyle(QStyleFactory.create(default_style))

        # needed information
        self.course_list = []
        self.event_list = []

        # call google api
        self.google_cal = GoogleApi('calendar', 'v3')
        self.attendee = []

        # create groups to control widgets position
        self.create_course_group()

        # set style
        style_layout = QHBoxLayout()
        style_label = QLabel('Style:')
        # QLabel.setBuddy

        style_combo = QComboBox()
        style_combo.addItems(QStyleFactory.keys())
        style_combo.activated[str].connect(self.change_style)

        # set style combo box index
        style_index = QStyleFactory.keys()
        style_index = style_index.index(default_style)
        style_combo.setCurrentIndex(style_index)

        style_layout.addWidget(style_label)
        style_layout.addWidget(style_combo)
        style_layout.addStretch(1)

        # set submit button
        submit_layout = QHBoxLayout()
        
        submit_btn = QPushButton('Submit')
        submit_btn.clicked.connect(self.submit_event)

        clean_btn = QPushButton('Clean')
        clean_btn.clicked.connect(self.clean_all)

        submit_layout.addStretch(1)
        submit_layout.addWidget(submit_btn)
        submit_layout.addWidget(clean_btn)

        # set main layout
        main_layout = QGridLayout()
        main_layout.addLayout(style_layout, 0, 0, 1, 2)
        main_layout.addWidget(self.course_group, 1, 0)
        main_layout.addLayout(submit_layout, 2, 0, 1, 2)

        self.setLayout(main_layout)

    def change_style(self, style_name):
        QApplication.setStyle(QStyleFactory.create(style_name))
        QApplication.setPalette(QApplication.style().standardPalette())

    def submit_event(self):
        course_name = self.course_combo.currentText()
        event_type = self.event_combo.currentText()
        desc = self.desc_line_edit.text()

        event_info = f'{course_name}-{event_type}{desc}'
        print(event_info, end=' ')

        start_time = self.start_datetime.dateTime().toString(Qt.ISODate)[:-3]
        end_time = self.end_datetime.dateTime().toString(Qt.ISODate)[:-3]

        print(f'{start_time} -- {end_time}')
        self.google_cal.add_event(event_info, start_time=start_time, event_time=end_time, attendees=self.attendee)

    def clean_all(self):
        """
        reset all parameter
        """
        # reset course_group
        self.course_combo.setCurrentIndex(0)
        self.event_combo.setCurrentIndex(0)
        
        # reset desc line edit
        self.desc_line_edit.clear()

        # reset start
        self.start_datetime.setDateTime(QDateTime.currentDateTime())

        # reset terminal time
        self.end_datetime.setDate(QDate.currentDate())
        self.end_datetime.setTime(QTime(23, 59))
        

    def create_course_group(self):
        self.course_group = QGroupBox('course group')

        self.course_list.extend(['ML', 'DL', 'CD'])
        
        self.event_list.extend(['HW', 'assignment', 'exam', 'lab', 'midterm', 'final'])

        # course name block
        course_layout = QVBoxLayout()
        course_label = QLabel('Course name')

        self.course_combo = QComboBox()
        self.course_combo.addItems(self.course_list)

        # course_layout.addStretch(1)
        course_layout.addWidget(course_label)
        course_layout.addWidget(self.course_combo)
        course_layout.addStretch(1)

        # event type block
        event_layout = QVBoxLayout()
        event_label = QLabel('Event type')

        self.event_combo = QComboBox()
        self.event_combo.addItems(self.event_list)

        # event_layout.addStretch(1)
        event_layout.addWidget(event_label)
        event_layout.addWidget(self.event_combo)
        event_layout.addStretch(1)

        # event description
        desc_layout = QVBoxLayout()
        desc_label = QLabel('Description')

        self.desc_line_edit = QLineEdit()
        self.desc_line_edit.setMaxLength(5)

        # desc_layout.addStretch(1)
        desc_layout.addWidget(desc_label)
        desc_layout.addWidget(self.desc_line_edit)
        desc_layout.addStretch(1)

        # start datetime block
        start_layout = QVBoxLayout()
        start_label = QLabel('Start time')

        self.start_datetime = QDateTimeEdit()
        self.start_datetime.setCalendarPopup(True)
        self.start_datetime.setMinimumDateTime(QDateTime.currentDateTime())
        self.start_datetime.dateChanged.connect(self.datetime_synch)

        # start_layout.addStretch(1)
        start_layout.addWidget(start_label)
        start_layout.addWidget(self.start_datetime)
        start_layout.addStretch(1)

        # end datetime block
        end_layout = QVBoxLayout()
        end_label = QLabel('Terminate time')

        self.end_datetime = QDateTimeEdit()
        self.end_datetime.setCalendarPopup(True)
        self.end_datetime.setMinimumDate(QDate.currentDate())
        self.end_datetime.setTime(QTime(23, 59))

        # end_layout.addStretch(1)
        end_layout.addWidget(end_label)
        end_layout.addWidget(self.end_datetime)
        end_layout.addStretch(1)

        # layout box
        layout = QHBoxLayout()
        layout.addLayout(course_layout)
        layout.addLayout(event_layout)
        layout.addLayout(desc_layout)
        layout.addLayout(start_layout)
        layout.addLayout(end_layout)
        layout.addStretch(1)
        
        self.course_group.setLayout(layout)

    # change end datetime binding to start_datetime
    def datetime_synch(self, date):

        self.end_datetime.setDate(date)
        self.end_datetime.setTime(
            QTime(23, 59)
        )
Example #11
0
class ri(QWidget):  #日报table框组建
    def __init__(self, config, parent=None):
        super(ri, self).__init__(parent)
        self.workThread = WorkThread()  #多线程
        self.workThread.sinOut.connect(self.setp)  #多线程链接信号输出
        layout = QGridLayout()  #创建一个表格排列

        self.sheetbox = QGroupBox("表名")
        self.sheetbox_lo = QGridLayout()
        self.sheetbox.setLayout(self.sheetbox_lo)
        self.rp_config = QGroupBox("日报配置")
        self.rp_config_lo = QGridLayout()
        self.rp_config.setLayout(self.rp_config_lo)
        layout.addWidget(self.sheetbox, 0, 0)
        layout.addWidget(self.rp_config, 1, 0)

        self.fileName1 = ''
        ###############第一行 文件选择框
        ########
        self.rp_config_lo.addWidget(QLabel('报表文件', self.rp_config), 0, 0)
        self.qtfile = QLineEdit('', self.rp_config)
        self.qtfile.insert(config['sheet_day']['filename'] if 'filename' in
                           config['sheet_day'].keys() else '')
        self.qtfile.editingFinished.connect(self.creatsheetCheckBox)
        self.qbfile = QPushButton('选择文件', self.rp_config)
        self.qbfile.clicked.connect(self.button_click)
        self.qbfile.setEnabled(True)
        self.rp_config_lo.addWidget(self.qtfile, 0, 1, 1, 6)
        self.rp_config_lo.addWidget(self.qbfile, 0, 7)
        ######################第二行################################################
        self.rp_config_lo.addWidget(QLabel('规则行', self.rp_config), 1, 0)
        self.gzh = QLineEdit('', self.rp_config)
        self.gzh.insert(config['sheet_day']['gzh'])
        self.gzh.setFixedWidth(40)
        self.rp_config_lo.addWidget(QLabel('时间列', self.rp_config), 1, 2)
        self.sjl = QLineEdit('', self.rp_config)
        self.sjl.insert(config['sheet_day']['sjl'])
        self.sjl.setFixedWidth(40)
        self.rp_config_lo.addWidget(QLabel('BMS厂家', self.rp_config), 1, 4)
        jslist = ['共济', '中联', '栅格']
        self.jsComboBox = QComboBox(self.rp_config)  #下拉菜单
        for i in jslist:
            self.jsComboBox.addItem(i)
        self.jsComboBox.setCurrentIndex(int(config['sheet_day']['cj']))
        self.rp_config_lo.addWidget(QLabel('模式', self.rp_config), 1, 6)
        jslist2 = ['0--寻找日期', '1--最后填充']
        self.js2ComboBox = QComboBox(self.rp_config)  #下拉菜单
        for i in jslist2:
            self.js2ComboBox.addItem(i)
        self.js2ComboBox.setCurrentIndex(int(config['sheet_day']['mode']))
        self.rp_config_lo.addWidget(self.gzh, 1, 1)
        self.rp_config_lo.addWidget(self.sjl, 1, 3)
        self.rp_config_lo.addWidget(self.jsComboBox, 1, 5)
        self.rp_config_lo.addWidget(self.js2ComboBox, 1, 7)
        ######################第三行时间选择行#############################
        self.rp_config_lo.addWidget(QLabel('起始时间', self.rp_config), 2, 0)
        self.dt1 = QDateTimeEdit(QDate.currentDate(),
                                 self.rp_config)  # 创建日期,并初始值
        self.dt1.setDisplayFormat('yyyy-MM-dd')
        #self.dt1.setMinimumDate(QDate.currentDate().addDays(-90)) # 限定时间最小值,当前时间-365天
        self.dt1.setMaximumDate(
            QDate.currentDate().addDays(1))  # 限定时间最大值,当前时间+365天
        self.dt1.setCalendarPopup(
            True)  # 允许弹出窗口选择日期,setMinimumDate()的限定对这个窗口也有效
        # #############结束时间选择
        self.rp_config_lo.addWidget(QLabel('结束时间', self.rp_config), 2, 4)
        self.dt2 = QDateTimeEdit(QDate.currentDate(),
                                 self.rp_config)  # 创建日期,并初始值
        self.dt2.setDate(QDate.currentDate())
        #self.dt2.setMinimumDate(QDate.currentDate().addDays(-90)) # 限定时间最小值,当前时间-365天
        self.dt2.setMaximumDate(
            QDate.currentDate().addDays(1))  # 限定时间最大值,当前时间+365天
        self.dt2.setCalendarPopup(
            True)  # 允许弹出窗口选择日期,setMinimumDate()的限定对这个窗口也有效

        ###########查询按钮###########
        self.qtb1 = QPushButton('查询', self.rp_config)
        self.qtb1.clicked.connect(self.work)

        self.rp_config_lo.addWidget(self.dt1, 2, 1, 1, 3)
        self.rp_config_lo.addWidget(self.dt2, 2, 5, 1, 2)
        self.rp_config_lo.addWidget(self.qtb1, 2, 7)

        #######第四行进度条
        self.rp_config_lo.addWidget(QLabel('进度', self.rp_config), 3, 0)
        self.pbar = QProgressBar(self.rp_config)
        #self.pbar.setFixedWidth(560)
        self.rp_config_lo.addWidget(self.pbar, 3, 1, 1, 6)
        self.setLayout(layout)
        self.creatsheetCheckBox()

    def creatsheetCheckBox(self):
        qlist = self.sheetbox.findChildren((QCheckBox, QLabel))
        #print(help(self.sheetbox_lo))
        for i in qlist:
            self.sheetbox_lo.removeWidget(i)
            sip.delete(i)
        filename = str(self.qtfile.text())
        if not path.exists(filename):
            self.sheetbox_lo.addWidget(QLabel('文件不存在', self.sheetbox), 0, 0)
        else:
            wb = load_workbook(filename)
            sheetname = wb.get_sheet_names()
            for index, i in enumerate(sheetname):
                lc[i] = QCheckBox(self.sheetbox)
                lc[i].setObjectName(i)
                lc[i].setText(i)
                lc[i].setStatusTip(i)
                lc[i].setChecked(True)
                a, b = divmod(index, 5)
                self.sheetbox_lo.addWidget(lc[i], a, b)
        gc.collect()

    def initserverinfo(self, host, port, user, passwd, db):
        self.workThread.init1(host, port, user, passwd, db)

    def setp(self, num):
        if num < 100:
            self.pbar.setValue(num)
        elif num == 1000:
            self.qtb1.setEnabled(True)
            self.pbar.setValue(0)
            self.workThread.quit()
            QMessageBox.information(self, "错误", "文件保存失败,检查文件是否被打开",
                                    QMessageBox.Yes)
        elif num == 2000:
            self.qtb1.setEnabled(True)
            self.pbar.setValue(0)
            #self.workThread.quit()
            QMessageBox.information(self, "错误", "无法导入pymysql依赖包",
                                    QMessageBox.Yes)
        elif num == 2001:
            self.qtb1.setEnabled(True)
            self.pbar.setValue(0)
            #self.workThread.quit()
            QMessageBox.information(self, "错误", "无法导入msmysql依赖包",
                                    QMessageBox.Yes)

        elif num >= 100 and num < 101:
            self.qtb1.setEnabled(True)
            self.pbar.setValue(num)
            QMessageBox.information(self, "提示", "报表导出成功1", QMessageBox.Yes)

    def work(self):
        self.t1 = time.mktime(
            time.strptime(self.dt1.date().toString(Qt.ISODate), "%Y-%m-%d"))
        self.t2 = time.mktime(
            time.strptime(self.dt2.date().toString(Qt.ISODate),
                          "%Y-%m-%d")) + 60 * 60 * 24
        c_cheetname = []
        for i in self.sheetbox.findChildren(QCheckBox):
            if i.isChecked():
                c_cheetname.append(i.statusTip())

        if time.mktime(
                time.strptime(self.dt1.date().toString(
                    Qt.ISODate), "%Y-%m-%d")) > time.mktime(
                        time.strptime(self.dt2.date().toString(Qt.ISODate),
                                      "%Y-%m-%d")):
            QMessageBox.information(self, "信息", "起始时间不能大于结束时间",
                                    QMessageBox.Yes)
        else:
            gzh = self.gzh.text()
            sjl = self.sjl.text()
            cj = self.jsComboBox.currentText()
            self.fileName1 = self.qtfile.text()
            mode = int(self.js2ComboBox.currentText().split('--')[0])
            if not path.exists(self.fileName1):
                QMessageBox.information(self, "提示", "检查配置,找不到模板文件",
                                        QMessageBox.No)
            elif len(c_cheetname) == 0:
                QMessageBox.information(self, "提示", "没有选中任何工作表",
                                        QMessageBox.No)
            else:
                self.qtb1.setEnabled(False)
                self.workThread.init2(self.fileName1, self.t1, self.t2, gzh,
                                      sjl, cj, mode, c_cheetname)
                self.workThread.start()  #计时开始
                #self.workThread.trigger.connect(over)   #当获得循环完毕的信号时,停止计数

    def button_click(self):
        # absolute_path is a QString object
        self.fileName1, self.filetype = QFileDialog.getOpenFileName(
            self, "选取文件", "", "xlsx (*.xlsx)")  #设置文件扩展名过滤,注意用双分号间隔
        if self.fileName1 == '': pass
        else:
            self.qtfile.clear()
            self.qtfile.insert(self.fileName1)
        self.creatsheetCheckBox()
Example #12
0
class StartTimeSetup(QWidget):
    """Start Time Setup

    This widget allows the user to set up start times. Start times can be the same for the entire
    race, or it can be the same for a particular field. Or, the start times can be assigned
    at a set interval.
    """

    def __init__(self, modeldb, parent=None):
        """Initialize the StartTimeSetup instance."""
        super().__init__(parent=parent)

        self.modeldb = modeldb

        field_table_model = self.modeldb.field_table_model
        field_name_column = field_table_model.name_column

        # Scope selection (whole race vs a field).
        field_selection_widget = QGroupBox('Set up start times for:')

        scope_button_group = QButtonGroup()
        self.all_fields_radiobutton = QRadioButton('Entire race')
        self.all_fields_radiobutton.setChecked(True)
        scope_button_group.addButton(self.all_fields_radiobutton)
        self.selected_field_radiobutton = QRadioButton('A single field:')
        scope_button_group.addButton(self.selected_field_radiobutton)

        self.selected_field_combobox = QComboBox()
        self.selected_field_combobox.setModel(field_table_model)
        self.selected_field_combobox.setModelColumn(field_name_column)
        self.selected_field_combobox.setEnabled(False)

        field_selection_widget.setLayout(QHBoxLayout())
        field_selection_widget.layout().addWidget(self.all_fields_radiobutton)
        field_selection_widget.layout().addWidget(self.selected_field_radiobutton)
        field_selection_widget.layout().addWidget(self.selected_field_combobox)

        # Start time.
        start_time_widget = QGroupBox('Start time:')

        start_time_button_group = QButtonGroup()
        self.start_time_now_radiobutton = QRadioButton('Now')
        self.start_time_now_radiobutton.setChecked(True)
        start_time_button_group.addButton(self.start_time_now_radiobutton)
        self.start_time_specified_radiobutton = QRadioButton('At:')
        start_time_button_group.addButton(self.start_time_specified_radiobutton)
        self.start_time_datetimeedit = QDateTimeEdit() # Time "now" set in showEvent()
        self.start_time_datetimeedit.setDisplayFormat(defaults.DATETIME_FORMAT)
        self.start_time_datetimeedit.setEnabled(False)

        start_time_widget.setLayout(QHBoxLayout())
        start_time_widget.layout().addWidget(self.start_time_now_radiobutton)
        start_time_widget.layout().addWidget(self.start_time_specified_radiobutton)
        start_time_widget.layout().addWidget(self.start_time_datetimeedit)

        # Start time interval.
        interval_widget = QGroupBox('Interval:')

        interval_button_group = QButtonGroup()
        self.same_start_time_radiobutton = QRadioButton('Same for all')
        self.same_start_time_radiobutton.setChecked(True)
        interval_button_group.addButton(self.same_start_time_radiobutton)
        self.interval_start_time_radiobutton = QRadioButton('Use interval:')
        interval_button_group.addButton(self.interval_start_time_radiobutton)

        self.interval_lineedit = QLineEdit()
        self.interval_lineedit.setText(str(defaults.START_TIME_INTERVAL_SECS))
        self.interval_lineedit.setValidator(QRegExpValidator(QRegExp('[1-9][0-9]*')))
        interval_lineedit_group = QWidget()
        interval_lineedit_group.setLayout(QHBoxLayout())
        interval_lineedit_group.layout().addWidget(self.interval_lineedit)
        interval_lineedit_group.layout().addWidget(QLabel('secs'))
        interval_lineedit_group.setEnabled(False)

        interval_widget.setLayout(QHBoxLayout())
        interval_widget.layout().addWidget(self.same_start_time_radiobutton)
        interval_widget.layout().addWidget(self.interval_start_time_radiobutton)
        interval_widget.layout().addWidget(interval_lineedit_group)

        confirm_button = QPushButton('Assign Start Times')

        # Top-level widgets.
        self.setLayout(QVBoxLayout())
        self.layout().addWidget(field_selection_widget)
        self.layout().addWidget(start_time_widget)
        self.layout().addWidget(interval_widget)
        self.layout().addWidget(confirm_button)

        # Signals/slots plumbing.
        confirm_button.clicked.connect(self.handle_assign_start_times)
        self.selected_field_radiobutton.toggled.connect(self.selected_field_combobox.setEnabled)
        self.start_time_specified_radiobutton.toggled.connect(self.start_time_datetimeedit
                                                              .setEnabled)
        self.interval_start_time_radiobutton.toggled.connect(interval_lineedit_group
                                                             .setEnabled)

    def handle_assign_start_times(self):
        """Assign the start times, given the contents of the various input widgets."""
        race_table_model = self.modeldb.race_table_model
        racer_table_model = self.modeldb.racer_table_model

        # Validate inputs.
        if not self.interval_lineedit.text().isdigit:
            raise Exception('Invalid interval')

        field = None
        if self.selected_field_radiobutton.isChecked():
            field = self.selected_field_combobox.currentText()

        reference_datetime = race_table_model.get_reference_clock_datetime()
        if self.start_time_now_radiobutton.isChecked():
            start_time = reference_datetime.msecsTo(QDateTime.currentDateTime())
        else:
            start_time = reference_datetime.msecsTo(self.start_time_datetimeedit.dateTime())

        interval = 0
        if self.interval_start_time_radiobutton.isChecked():
            interval = int(self.interval_lineedit.text())

        try:
            # If we're potentially going to be overwriting existing start times,
            # warn before committing.
            starts_overwritten = racer_table_model.assign_start_times(field, start_time, interval,
                                                                      True)
            if starts_overwritten > 0:
                if QMessageBox.question(self, 'Question',
                                        'About to overwrite %s existing ' % starts_overwritten +
                                        'start times. Proceed anyway?') != QMessageBox.Yes:
                    return
            racer_table_model.assign_start_times(field, start_time, interval)
        except InputError as e:
            QMessageBox.warning(self, 'Error', str(e))

        success_message = 'Start times have been assigned'
        if field:
            success_message += ' to field "%s"' % field

        start_datetime = reference_datetime.addMSecs(start_time)
        success_message += ' for %s' % start_datetime.toString(Qt.SystemLocaleLongDate)
        if interval:
            success_message += ' at %s secomd intervals' % interval

        success_message += '.'

        QMessageBox.information(self, 'Success', success_message)

    def showEvent(self, event): #pylint: disable=invalid-name
        """Set up input widgets when this widget is shown.

        Basically, this amounts to populating the start time edit box with the current date and
        time, plus some time ahead, rounded to the nearest 5 minutes.
        """
        self.start_time_datetimeedit.setDate(QDate.currentDate())

        now = QTime.currentTime().addSecs(defaults.START_TIME_FROM_NOW_SECS)
        now.setHMS(now.hour(), now.minute() + 5 - now.minute()%5, 0, 0)
        self.start_time_datetimeedit.setTime(now)

        super().showEvent(event)
Example #13
0
    def initUI(self):
        btn_gen = QPushButton('Generate', self)
        btn_gen.setToolTip("Generate meal suggestions")
        btn_gen.setStyleSheet(
            'QPushButton {background-color : rgb(255,0,0); color : black}')

        btn_edit = QPushButton('Edit List', self)
        btn_edit.setToolTip("Edit Meals")

        sld = QSlider(Qt.Horizontal, self)
        sld.setToolTip(
            "The ratio of vegetarian dishes in the next list of suggestions")
        sld.setMinimum(0)
        sld.setMaximum(100)
        sld.setValue(70)

        sld_lab = QLabel("Veg Dishes " + str(sld.value()) + "%", self)

        def onChanged():
            text = "Veg Dishes " + str(sld.value()) + "%"
            sld_lab.setText(text)

        sld.valueChanged.connect(onChanged)

        start_cal = QDateTimeEdit(self)
        start_cal.setCalendarPopup(True)
        start_cal.setMinimumDate(QDate.currentDate())
        start_cal.setDisplayFormat("ddd dd.MM")
        start_cal.setToolTip("Select a starting date")
        start_cal_lab = QLabel("Start:", self)

        end_cal = QDateTimeEdit(self)
        end_cal.setCalendarPopup(True)
        end_cal.setDate(QDate.currentDate().addDays(5))
        end_cal.setMinimumDate(QDate.currentDate().addDays(0))
        end_cal.setDisplayFormat("ddd dd.MM")
        end_cal.setToolTip("Select an end date")
        end_cal_lab = QLabel("End:", self)

        def startrange():
            if end_cal.date() < start_cal.date():
                start_cal.setDate(end_cal.date())

        end_cal.dateChanged.connect(startrange)

        self.setFixedSize(300, 150)
        self.center()
        self.setWindowTitle('suggestible')
        self.setWindowIcon(QIcon('icon.png'))

        def createGridLayout(self):
            self.horizontalGroupBox = QWidget()
            layout = QGridLayout()
            layout.setColumnStretch(0, 5)
            layout.setColumnStretch(1, 5)
            layout.setRowStretch(5, 1)
            layout.setVerticalSpacing(8)

            layout.addWidget(start_cal_lab, 0, 0)
            layout.addWidget(end_cal_lab, 0, 1)
            layout.addWidget(start_cal, 1, 0)
            layout.addWidget(end_cal, 1, 1)
            layout.addWidget(btn_edit, 2, 0)
            layout.addWidget(sld, 2, 1)
            layout.addWidget(sld_lab, 2, 1, 3, 1, alignment=Qt.AlignCenter)
            layout.addWidget(btn_gen, 4, 0, 2, 2)
            layout.setRowMinimumHeight(4, 15)
            layout.setRowMinimumHeight(5, 15)

            self.horizontalGroupBox.setLayout(layout)

        createGridLayout(self)

        windowLayout = QVBoxLayout()
        windowLayout.addWidget(self.horizontalGroupBox)
        self.setLayout(windowLayout)

        self.show()

        def dates(starting, ending):
            end = ending.date()
            start = starting.date()
            en = end.toString("yyyy-MM-dd")
            en = parse(en)
            st = start.toString("yyyy.MM.dd")
            st = parse(st)

            def daterange(st, en):
                for n in range(int((en - st).days) + 1):
                    yield st + timedelta(n)

            fin_dates = []
            for dt in daterange(st, en):
                fin_dates.append(dt.strftime("%A %d.%m"))

            return fin_dates

        def dates_header(starting, ending):
            end = ending.date()
            start = starting.date()
            en = end.toString("dd.MM")
            st = start.toString("dd.MM")
            return st + "-" + en

        def html_creator(starting, ending, ratio0):
            templateLoader = jinja2.FileSystemLoader(searchpath="")
            templateEnv = jinja2.Environment(loader=templateLoader)
            TEMPLATE_FILE = "template_suggestions.html"
            template = templateEnv.get_template(TEMPLATE_FILE)

            outputText = template.render(range=dates_header(starting, ending),
                                         table=main(dates(starting, ending),
                                                    ratio0))
            html_file = open("suggestions" + '.html', 'w')
            html_file.write(outputText)
            html_file.close()

        def generate():
            html_creator(start_cal, end_cal, sld.value() / 100)
            webbrowser.open("suggestions.html", new=1)

        def popupwindow():
            self.editor = tablegui.App()

        btn_gen.clicked.connect(generate)
        btn_edit.clicked.connect(popupwindow)
Example #14
0
class Ui_MainWindow(QMainWindow):
    def setupUi(self, MainWindow):
        MainWindow.resize(773, 452)

        #메인 화면 색상py
        self.setStyleSheet("color: black;"
                        "background-color: white")

        font = QFont()
        font.setFamily("NanumGothic")
        MainWindow.setFont(font)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setFont(font)
        self.label = QLabel(self.centralwidget)
        self.label.setGeometry(QRect(30, 20, 181, 51))
        font = QFont()
        font.setFamily("NanumGothic")
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.edit_filePath = QLineEdit(self.centralwidget)
        self.edit_filePath.setGeometry(QRect(60, 80, 551, 21))
        self.edit_filePath.setInputMask("")
        self.edit_filePath.setReadOnly(True)
        self.edit_url = QLineEdit(self.centralwidget)
        self.edit_url.setGeometry(QRect(200, 130, 521, 21))
        self.edit_id = QLineEdit(self.centralwidget)
        self.edit_id.setGeometry(QRect(200, 170, 341, 21))
        self.edit_passwd = QLineEdit(self.centralwidget)
        self.edit_passwd.setGeometry(QRect(200, 210, 341, 21))
        self.button_file = QPushButton(self.centralwidget)
        self.button_file.setGeometry(QRect(630, 77, 93, 28))
        
        #버튼 스타일 변경
        self.button_file.setStyleSheet(staticValues.grayButtonStyleSheet)
        self.button_file.setFont(staticValues.buttonFont)

        font = QFont()
        font.setFamily("NanumGothic")
        self.button_file.setFont(font)

        self.button_login = QPushButton(self.centralwidget)
        self.button_login.setGeometry(QRect(630, 210, 93, 28))
        
        #버튼 스타일 변경
        self.button_login.setStyleSheet(staticValues.blueButtonStyleSheet)
        self.button_login.setFont(staticValues.buttonFont)

        font = QFont()
        font.setFamily("NanumGothic")
        self.button_login.setFont(font)
        
        self.label_2 = QLabel(self.centralwidget)
        self.label_2.setGeometry(QRect(60, 132, 100, 15))
        font = QFont()
        font.setFamily("NanumGothic")
        font.setBold(True)
        font.setWeight(75)
        self.label_2.setFont(font)
        self.label_3 = QLabel(self.centralwidget)
        self.label_3.setGeometry(QRect(60, 172, 120, 15))
        font = QFont()
        font.setFamily("NanumGothic")
        font.setBold(True)
        font.setWeight(75)
        self.label_3.setFont(font)
        self.label_4 = QLabel(self.centralwidget)
        self.label_4.setGeometry(QRect(60, 212, 101, 16))
        font = QFont()
        font.setFamily("NanumGothic")
        font.setBold(True)
        font.setWeight(75)
        self.label_4.setFont(font)
        self.label_5 = QLabel(self.centralwidget)
        self.label_5.setGeometry(QRect(60, 270, 101, 16))
        font = QFont()
        font.setFamily("NanumGothic")
        font.setBold(True)
        font.setWeight(75)
        self.label_5.setFont(font)
        self.label_6 = QLabel(self.centralwidget)
        self.label_6.setGeometry(QRect(80, 312, 101, 16))
        font = QFont()
        font.setFamily("NanumGothic")
        font.setBold(False)
        font.setWeight(50)
        self.label_6.setFont(font)
        self.label_7 = QLabel(self.centralwidget)
        self.label_7.setGeometry(QRect(80, 352, 101, 16))
        font = QFont()
        font.setFamily("NanumGothic")
        font.setBold(False)
        font.setWeight(50)
        self.label_7.setFont(font)
        self.dateTime_upload = QDateTimeEdit(self.centralwidget)
        self.dateTime_upload.setGeometry(QRect(200, 310, 194, 22))

        #오늘 날짜 세팅
        self.dateTime_upload.setDate(QDate.currentDate())
        self.dateTime_upload.setTime(QTime.currentTime())
        
        self.edit_period = QLineEdit(self.centralwidget)
        self.edit_period.setGeometry(QRect(200, 350, 90, 21))

        #가로/세로 입력창 숫자만 입력하도록 수정
        self.edit_period.setValidator(QIntValidator(1, 1440))

        self.label_8 = QLabel(self.centralwidget)
        self.label_8.setGeometry(QRect(310, 353, 64, 15))
        self.button_write = QPushButton(self.centralwidget)
        self.button_write.setGeometry(QRect(180, 400, 391, 28))

        #버튼 스타일 변경
        self.button_write.setStyleSheet(staticValues.grayButtonStyleSheet)
        self.button_write.setFont(staticValues.buttonFont)
        self.button_write.setEnabled(False)
        
        self.label_countdown = QLabel(self.centralwidget)
        font = QFont()
        font.setFamily("NanumGothic")
        font.setBold(False)
        font.setWeight(10)
        self.label_countdown.setFont(font)
        self.label_countdown.setText(str(0))
        self.label_countdown.setGeometry(QRect(610, 400, 50, 22))

        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle("MainWindow")
        self.label.setText("TISAUTORY")
        self.edit_filePath.setPlaceholderText("문단 파일 경로")
        self.button_file.setText("파일 열기")
        self.button_login.setText("로그인")
        self.label_2.setText("URL")
        self.label_3.setText("ID")
        self.label_4.setText("PASSWORD")
        self.label_5.setText("게시 시간 설정")
        self.label_6.setText("게시 시작 날짜")
        self.label_7.setText("게시 주기")
        self.edit_period.setPlaceholderText("분단위 주기")
        self.label_8.setText("분")
        self.button_write.setText("자동 등록 시작")
        def add_node():

            #add node dialog
            addNodeDialog = QDialog()
            addNodeDialog.ok = False
            addNodeDialog.node_name = ""
            addNodeDialog.node_label = ""
            addNodeDialog.node_timestamp = ""
            addNodeDialog.node_description = ""
            addNodeDialog.node_logEntryReference = ""
            addNodeDialog.node_logCreator = ""
            addNodeDialog.node_logEntrySource = ""
            addNodeDialog.node_type = "None"

            # Layouts
            main_layout = QVBoxLayout()
            addNodeLayout = QFormLayout()
            buttons_layout = QHBoxLayout()

            main_layout.addLayout(addNodeLayout)
            main_layout.addLayout(buttons_layout)
            addNodeDialog.setLayout(main_layout)

            #line edits
            leNodeName = QLineEdit()
            leNodeLabel = QLineEdit()
            teNodeDescription = QTextEdit()
            dtNodeTimestamp = QDateTimeEdit()
            dtNodeTimestamp.setDate(QtCore.QDate(2020, 1, 1))
            dtNodeTimestamp.setCalendarPopup(True)
            leLogEntryReference = QLineEdit()
            cbxLogCreator = QComboBox()
            leLogEntrySource = QLineEdit()
            cbxNodeType = QComboBox()
            cbxImage = QComboBox()

            #buttons
            pbOK = QPushButton()
            pbCancel = QPushButton()

            cbxNodeType.addItems(["None", "circle", "box"])
            cbxLogCreator.addItems(["None", "Red", "Blue", "White"])
            cbxImage.addItem("None")
            self.iconList = Configuration.get_list_of_icon_dicts(
                self.configuration)
            for icon in self.iconList:
                cbxImage.addItem(icon["name"])
            pbOK.setText("&OK")
            pbCancel.setText("&Cancel")

            addNodeLayout.setWidget(0, QFormLayout.LabelRole,
                                    QLabel("Node Name"))
            addNodeLayout.setWidget(0, QFormLayout.FieldRole, leNodeName)
            addNodeLayout.setWidget(1, QFormLayout.LabelRole,
                                    QLabel("Node Description"))
            addNodeLayout.setWidget(1, QFormLayout.FieldRole,
                                    teNodeDescription)
            addNodeLayout.setWidget(2, QFormLayout.LabelRole,
                                    QLabel("Node Timestamp"))
            addNodeLayout.setWidget(2, QFormLayout.FieldRole, dtNodeTimestamp)
            addNodeLayout.setWidget(3, QFormLayout.LabelRole,
                                    QLabel("Log Entry Reference"))
            addNodeLayout.setWidget(3, QFormLayout.FieldRole,
                                    leLogEntryReference)
            addNodeLayout.setWidget(4, QFormLayout.LabelRole,
                                    QLabel("Log Creator"))
            addNodeLayout.setWidget(4, QFormLayout.FieldRole, cbxLogCreator)
            addNodeLayout.setWidget(5, QFormLayout.LabelRole,
                                    QLabel("Log Entry Source"))
            addNodeLayout.setWidget(5, QFormLayout.FieldRole, leLogEntrySource)
            addNodeLayout.setWidget(6, QFormLayout.LabelRole,
                                    QLabel("Node Type"))
            addNodeLayout.setWidget(6, QFormLayout.FieldRole, cbxNodeType)
            addNodeLayout.setWidget(7, QFormLayout.LabelRole,
                                    QLabel("Node Image"))
            addNodeLayout.setWidget(7, QFormLayout.FieldRole, cbxImage)

            #ok button handler
            def ok():
                addNodeDialog.OK = True
                addNodeDialog.node_name = leNodeName.text()
                addNodeDialog.node_label = leNodeName.text()
                addNodeDialog.node_timestamp = dtNodeTimestamp.text()
                addNodeDialog.node_description = teNodeDescription.toPlainText(
                )
                addNodeDialog.node_logEntryReference = leLogEntryReference.text(
                )
                addNodeDialog.node_logCreator = cbxLogCreator.currentText()
                addNodeDialog.node_logEntrySource = leLogEntrySource.text()
                if (cbxImage.currentText()):
                    for icon in self.iconList:
                        if (cbxImage.currentText() == icon["name"]):
                            addNodeDialog.node_type = icon["source"]
                else:
                    addNodeDialog.node_type = cbxNodeType.currentText()
                addNodeDialog.close()

            #cancel button handler
            def cancel():
                addNodeDialog.OK = False
                addNodeDialog.close()

            pbOK.clicked.connect(ok)
            pbOK.clicked.connect(lambda: self.addNewNode(
                self.tableWidgetNodes, str(self.nodeId), leNodeName.text(),
                dtNodeTimestamp.text(), teNodeDescription.toPlainText(),
                leLogEntryReference.text(), cbxLogCreator.currentText(),
                addNodeDialog.node_type, leLogEntrySource.text()))
            pbCancel.clicked.connect(cancel)

            buttons_layout.addWidget(pbOK)
            buttons_layout.addWidget(pbCancel)
            addNodeDialog.exec_()

            if addNodeDialog.OK and addNodeDialog.node_name != '':
                self.qgv.addNode(
                    self.qgv.engine.graph,
                    addNodeDialog.node_name,
                    id=str(self.nodeId),
                    label=addNodeDialog.node_label,
                    description=addNodeDialog.node_description,
                    timestamp=addNodeDialog.node_timestamp,
                    leReference=addNodeDialog.node_logEntryReference,
                    creator=addNodeDialog.node_logCreator,
                    leSource=addNodeDialog.node_logEntrySource,
                    shape=addNodeDialog.node_type)
                self.qgv.build()
                self.nodeId += 1