class TimeEdit(WidgetWithTZinfo): def __init__(self, parent=None): super(TimeEdit, self).__init__(parent) self.initQTimeEdit() self.initTZinfoEdit() def initQTimeEdit(self): self.timeEdit = QDateTimeEdit(self) self.timeEdit.setKeyboardTracking(False) self.timeEdit.setDisplayFormat("hh:mm:ss.zzz") self.layout().addWidget(self.timeEdit) def time(self) -> datetime.time: time = self.timeEdit.time().toPyTime() tzinfo = self.tzinfoEdit.getObj2add() time = time.replace(tzinfo=tzinfo) return time def setTime(self, val: datetime.time): if isinstance(val, datetime.time): self.timeEdit.setTime(val) self.tzinfoEdit.setVal(val.tzinfo) else: raise TypeError("arg1 must be instance of type datetime.time", type(val))
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)
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) elif isinstance(v, datetime.time): qle = QDateTimeEdit(self) qle.setTime(v) qle.setDisplayFormat("HH:mm:ss") else: qle = QLineEdit(self) qle.setText(str(v)) self.vbox.addWidget(qle) return qle
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)
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) )
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)
class Player(QMainWindow): """ A simple Media Player using VLC and Qt """ def __init__(self, master=None): super().__init__() self.setWindowTitle("CCTV by @XII") # creating a basic vlc instance self.instance = vlc.Instance() # creating an empty vlc media player self.mediaplayer = self.instance.media_player_new() self.path = '' self.initUI() self.isPaused = False self.setStyleSheet(open("style.qss", "r").read()) def initUI(self): """ Set up the user interface, signals & slots For better understaning, I made some shortcuts for variables, which is the instance of the QtWidgets classes. List of shortcuts(made): *btn - QPushButton; *lbl - QLabel; *slr - QSlider; *lyt - Q_lyt; *ctrl - ctrl; """ self.widget = QWidget(self) self.setCentralWidget(self.widget) #video widget self.videoframe = QFrame() self.palette = self.videoframe.palette() self.palette.setColor(QtGui.QPalette.Window, QtGui.QColor(0, 0, 0)) self.videoframe.setPalette(self.palette) self.videoframe.setAutoFillBackground(True) #time value self.timevalue = QDateTimeEdit() self.timevalue.setDisplayFormat('hh:mm:ss') self.timevalue.setReadOnly(True) self.timevalue.setFixedSize(80, 30) #position slider self.position_slr = QSlider(QtCore.Qt.Horizontal, self) self.position_slr.setToolTip("Position") self.position_slr.setMaximum(1000) self.position_slr.sliderMoved.connect(self.set_position) #play button self.play_btn = QPushButton() self.play_btn.setProperty("onplay", True) self.play_btn.setObjectName("play") self.play_btn.clicked.connect(self.play_pause) #stop button self.stop_btn = QPushButton() self.stop_btn.setObjectName('stop') self.stop_btn.clicked.connect(self.stop) #analyse button self.analyse_btn = QPushButton('Analyse') self.analyse_btn.setObjectName('analyse') self.analyse_btn.setFixedSize(70, 28) self.analyse_btn.clicked.connect(self.start_analyse) self.analyse_window = Analyse(self) self.analyse_window.off() self.analyse_btn.setEnabled(False) self.on_analyse = False self.details_btn = QPushButton('Details') self.details_btn.setVisible(False) self.details_btn.setObjectName('details') self.details_btn.setFixedSize(70, 28) self.details_btn.clicked.connect(self.show_details) self.details_wd = pictureViewer() self.details_wd.close() self.threadpool = QtCore.QThreadPool() self.threadpool.setMaxThreadCount(1) worker = loadModules(self) self.threadpool.start(worker) self.path_input = pathLineEdit(self) self.path_input.setObjectName('path') self.folder_btn = QPushButton() self.folder_btn.setObjectName('folder') self.folder_btn.clicked.connect( lambda x: self.select_folder(foldername='')) self.fileslist_lbl = QLabel('Playlist:') self.fileslist_lbl.setObjectName('lbl') self.fileslist_lbl.setIndent(12) self.fileslist = QListWidget() self.fileslist.itemClicked.connect(self.select_file) self.warnings_lbl = QLabel('Warnings time:') self.warnings_lbl.setObjectName('lbl') self.warnings_lbl.setIndent(12) self.warningslist = QListWidget() #volume slider self.volume_slr = QSlider(QtCore.Qt.Horizontal, self) self.volume_slr.setMaximum(100) self.volume_slr.setValue(self.mediaplayer.audio_get_volume()) self.volume_slr.setToolTip("Volume") self.volume_slr.valueChanged.connect(self.set_volume) #setting up layouts folder_lyt = QHBoxLayout() folder_lyt.addWidget(self.path_input) folder_lyt.addWidget(self.folder_btn) leftside_lyt = QVBoxLayout() leftside_lyt.setContentsMargins(0, 10, 0, 0) leftside_lyt.addSpacing(6) leftside_lyt.addWidget(self.fileslist_lbl) leftside_lyt.addWidget(self.fileslist) analyse_btns = QHBoxLayout() analyse_btns.addWidget(self.details_btn) analyse_btns.addWidget(self.analyse_btn) leftside_lyt.addLayout(analyse_btns) leftside_lyt.addWidget(self.warnings_lbl) leftside_lyt.addWidget(self.warningslist) leftside_lyt.addLayout(folder_lyt) leftside_lyt.addSpacing(6) self.leftside_bg = QWidget() self.leftside_bg.setObjectName("leftside_bg") self.leftside_bg.setLayout(leftside_lyt) ctrl_lyt = QHBoxLayout() ctrl_lyt.addSpacing(20) ctrl_lyt.addWidget(self.play_btn) ctrl_lyt.setSpacing(0) ctrl_lyt.addWidget(self.stop_btn) ctrl_lyt.addStretch(1) ctrl_lyt.addWidget(self.volume_slr) ctrl_panel_lyt = QVBoxLayout() ctrl_panel_lyt.setContentsMargins(60, 12, 60, 12) ctrl_panel_lyt.addWidget(self.timevalue, 0, QtCore.Qt.AlignLeft) ctrl_panel_lyt.addWidget(self.position_slr) ctrl_panel_lyt.addLayout(ctrl_lyt) rightside_lyt = QVBoxLayout() rightside_lyt.addWidget(self.videoframe) rightside_lyt.addLayout(ctrl_panel_lyt) main_lyt = QHBoxLayout() main_lyt.setSpacing(0) main_lyt.setContentsMargins(0, 0, 0, 0) main_lyt.addWidget(self.leftside_bg) main_lyt.addLayout(rightside_lyt, 60) self.widget.setLayout(main_lyt) self.timer = QtCore.QTimer(self) self.timer.setInterval(200) self.timer.timeout.connect(self.updateUI) #creates connection to db self.db = db_api.create_connection( os.path.join(os.getcwd(), 'db', 'data.db')) def play_pause(self): """ Toggle play/pause status """ if self.mediaplayer.is_playing(): self.mediaplayer.pause() self.play_btn.setProperty("onplay", True) self.play_btn.setStyle(self.play_btn.style()) self.isPaused = True else: if self.mediaplayer.play() == -1: return self.mediaplayer.play() self.play_btn.setProperty("onplay", False) self.play_btn.setStyle(self.play_btn.style()) self.timer.start() self.isPaused = False def start_analyse(self): self.analyse_btn.setEnabled(False) try: file = self.fileslist.currentItem().text() except AttributeError: self.analyse_btn.setEnabled(True) QMessageBox.information(self, "Warning!", "You should to select a file.") return if not self.on_analyse: self.setEnabled(False) self.analyse_window.on() try: worker = AnalyseWorker(file, self) self.threadpool.start(worker) except Exception as e: print(e) else: return def show_details(self): try: file = self.fileslist.currentItem().text() except AttributeError: self.analyse_btn.setEnabled(True) QMessageBox.information(self, "Warning!", "You should to select a file.") return item = self.fileslist.currentItem().text() if os.path.isdir(os.path.join('warnings', os.path.splitext(item)[0])): self.details_wd.show() self.details_wd.start(self.fileslist.currentItem().text()) else: return def stop_analyse(self): self.analyse_window.off() self.setEnabled(True) self.on_analyse = False def stop(self): """ stop player """ if self.mediaplayer.is_playing(): self.timevalue.setTime(QtCore.QTime.fromMSecsSinceStartOfDay(0)) self.mediaplayer.stop() def select_file(self, item): self.open_file(filename=self.path + '/' + item.text()) def check_warnings_time(self, filename): with self.db: file_id = db_api.select_file(self.db, filename) if file_id: #if file in db, then add warning times in list bellow timelist = db_api.select_time(self.db, file_id) self.warningslist.clear() for time in timelist: self.warningslist.addItem(time[0] + "-" + time[1]) self.details_btn.setVisible(True) else: self.details_btn.setVisible(False) self.warningslist.clear() self.warningslist.addItem("There is nothing to show.") def open_file(self, filename=''): """ Open a media file in a MediaPlayer """ if filename == '': filename = QFileDialog.getOpenFileName(self, "Open File", './')[0] if not filename: return self.check_warnings_time(os.path.split(filename)[1]) # create the media self.media = self.instance.media_new(filename) # put the media in the media player self.mediaplayer.set_media(self.media) # parse the metadata of the file self.media.parse_async() fullpath = re.escape(filename) # get video duration time = os.popen("ffmpeg -i {0}".format(fullpath) + " 2>&1 | grep Duration | awk '{print $2}' | tr -d ," ).read().split(':') self.duration = int(3600000 * int(time[0]) + 60000 * int(time[1]) + 1000 * float(time[2])) # set the title of the track as window title self.setWindowTitle("CCTV: " + self.media.get_meta(0)) # the media player has to be 'connected' to the QFrame # (otherwise a video would be displayed in it's own window) # this is platform specific! # you have to give the id of the QFrame (or similar object) to # vlc, different platforms have diffqerent functions for this if sys.platform == "linux": # for Linux using the X Server self.mediaplayer.set_xwindow(self.videoframe.winId()) elif sys.platform == "win32": # for Windows self.mediaplayer.set_hwnd(self.videoframe.winId()) elif sys.platform == "darwin": # for MacOS self.mediaplayer.set_agl(self.videoframe.windId()) self.play_pause() def set_volume(self, Volume): """ Set the volume """ self.mediaplayer.audio_set_volume(Volume) def set_position(self, position): """ Set the position """ # setting the position to where the slider was dragged self.mediaplayer.set_position(position / 1000.0) # the vlc MediaPlayer needs a float value between 0 and 1, Qt # uses integer variables, so you need a factor; the higher the # factor, the more precise are the results # (1000 should be enough) self.timevalue.setTime( QtCore.QTime.fromMSecsSinceStartOfDay( self.mediaplayer.get_position() * self.duration)) def set_time(self, time): """ Set time to display """ self.mediaplayer.set_time(time) def select_folder(self, foldername=''): if foldername == '': foldername = str( QFileDialog.getExistingDirectory(self, "Select Directory")) self.path_input.setText(foldername) self.path = foldername if not foldername: return files = os.listdir(foldername) self.path = foldername self.fileslist.clear() for file in files: self.fileslist.addItem(file) def updateUI(self): """ updates the user interface """ # setting the slider to the desired position self.position_slr.setValue(self.mediaplayer.get_position() * 1000) self.timevalue.setTime( QtCore.QTime.fromMSecsSinceStartOfDay( self.mediaplayer.get_position() * self.duration)) self.volume_slr.setValue(self.mediaplayer.audio_get_volume()) if not self.mediaplayer.is_playing(): # no need to call this function if nothing is played self.timer.stop() if not self.isPaused: # after the video finished, the play button stills shows # "Pause", not the desired behavior of a media player # this will fix it self.stop()
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("자동 등록 시작")