class SliceWidget(QWidget): """Custom widget to slice data""" # Signals sliceTimes = pyqtSignal(str, str) def __init__(self): super().__init__() self.initUI() def initUI(self): # Labels sliceLabel = QLabel("Slicing") startLabel = QLabel("Start: ") endLabel = QLabel("End: ") # DateTimeEdit self.startDateTimeEdit = QDateTimeEdit() self.endDateTimeEdit = QDateTimeEdit() # Buttons applyButton = QPushButton("Apply") applyButton.clicked.connect(self.sendTimes) hideButton = QPushButton("Hide") hideButton.clicked.connect(self.hide) # Layouts # - Horizontal for start hStart = QHBoxLayout() hStart.addWidget(startLabel) hStart.addWidget(self.startDateTimeEdit) # - Horizontal for end hEnd = QHBoxLayout() hEnd.addWidget(endLabel) hEnd.addWidget(self.endDateTimeEdit) # - Vertical for self vWidget = QVBoxLayout() vWidget.addWidget(sliceLabel) vWidget.addLayout(hStart) vWidget.addLayout(hEnd) vWidget.addWidget(applyButton) vWidget.addWidget(hideButton) self.setLayout(vWidget) def sendTimes(self): self.sliceTimes.emit(self.startDateTimeEdit.text(), self.endDateTimeEdit.text()) def refresh(self, start, end): self.startDateTimeEdit.setMinimumDateTime(start) self.startDateTimeEdit.setMaximumDateTime(end) self.startDateTimeEdit.setDateTime(start) self.endDateTimeEdit.setMinimumDateTime(start) self.endDateTimeEdit.setMaximumDateTime(end) self.endDateTimeEdit.setDateTime(end)
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()
class App(QWidget): def __init__(self): super().__init__() self.title = 'Nike bot' self.left = 600 self.top = 300 self.width = 670 self.height = 480 self.all_extensions = ["xlsx", "xlsm", "xlsb", "xls", "xlam"] self.browser = "firefox" self.my_threads = [] self.current_date = '' self.data = [] self.initUI() # req_proxy = RequestProxy() # self.proxies = req_proxy.get_proxy_list() # # self.rus_proxies = [] # for proxy in self.proxies: # if proxy.country == 'Russian Federation': # print(proxy.country) # self.rus_proxies.append(proxy) def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.setFixedSize(self.width, self.height) # Create widget label = QLabel(self) self.lable_file = QLabel(self) self.lable_file.setStyleSheet("background-color:red;") self.lable_file.setText("File is not uploaded") self.lable_file.setGeometry(470, 30, 135, 30) self.button_file = QPushButton(self) self.button_file.setStyleSheet( "background-color:#301b28;color:#ddc5a2;") self.button_file.setGeometry(470, 60, 135, 40) self.button_file.setText("Brows file") self.button_file.clicked.connect(lambda: self.openFileNameDialog()) self.button_start = QPushButton(self) self.button_start.setGeometry(470, 250, 135, 40) self.button_start.setText("Start") self.button_start.setStyleSheet( "background-color:#301b28;color:#ddc5a2;") self.button_start.clicked.connect( lambda: self.create_threads(self.browser, self.data)) self.button_start.setDisabled(True) self.button_close = QPushButton(self) self.button_close.setStyleSheet( "background-color:#301b28;color:#ddc5a2;") self.button_close.setGeometry(470, 290, 135, 40) self.button_close.setText("Close") self.button_close.clicked.connect(lambda: self.close_browsers()) self.label_brows = QLabel(self) self.label_brows.setGeometry(470, 120, 135, 30) self.label_brows.setStyleSheet("color:#301b28;") self.label_brows.setText("Choose browser:") self.combo = QComboBox(self) self.combo.addItems(["firefox", "chrome", "opera"]) self.combo.setGeometry(470, 150, 135, 40) self.combo.setStyleSheet("background-color:#301b28;color:#ddc5a2;") self.combo.activated[str].connect(self.setBrowser) self.table = QTableWidget(self) self.table.setGeometry(0, 0, 450, 400) self.table.setStyleSheet("background-color:#301b28;color:#ddc5a2;") self.table.setColumnCount(7) self.table.setRowCount(1) self.table.setItem(0, 0, QTableWidgetItem("Login")) self.table.setItem(0, 1, QTableWidgetItem("Password")) self.table.setItem(0, 2, QTableWidgetItem("Middle name")) self.table.setItem(0, 3, QTableWidgetItem("Card number")) self.table.setItem(0, 4, QTableWidgetItem("Date")) self.table.setItem(0, 5, QTableWidgetItem("Cvv")) self.table.setItem(0, 6, QTableWidgetItem("Url")) self.date_field = QDateTimeEdit(self) self.date_field.setGeometry(470, 350, 165, 40) self.date_field.setStyleSheet( "background-color:#301b28;color:#ddc5a2;") self.date_field.setDisplayFormat("yyyy-MM-dd HH:mm:ss") self.date_field.setMinimumDateTime(QDateTime.currentDateTime()) self.url = QTextEdit(self) self.url.setGeometry(10, 430, 400, 30) self.url.setStyleSheet("background-color:#301b28;color:#ddc5a2;") self.url_text = QLabel(self) self.url_text.setGeometry(10, 400, 400, 30) self.url_text.setStyleSheet("color:#301b28;") self.url_text.setText("Url:") self.button_url = QPushButton(self) self.button_url.setStyleSheet( "background-color:#301b28;color:#ddc5a2;") self.button_url.setGeometry(410, 430, 100, 30) self.button_url.setText("ADD") self.button_url.clicked.connect(lambda: self.add_url()) self.usr_text = QLabel(self) self.usr_text.setGeometry(520, 430, 80, 30) self.usr_text.setStyleSheet("color:#301b28;") self.usr_text.setText("User count:") self.users = QTextEdit(self) self.users.setGeometry(600, 430, 40, 30) self.users.setStyleSheet("background-color:#301b28;color:#ddc5a2;") pixmap = QPixmap('static/back.jpeg').scaled(self.width, self.height) label.setPixmap(pixmap) self.show() def openFileNameDialog(self): options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getOpenFileName( self, "QFileDialog.getOpenFileName()", "", "", options=options) extension = fileName.split(".")[-1] if fileName and extension in self.all_extensions: self.start(fileName) else: msg = QMessageBox() msg.setIcon(QMessageBox.Critical) msg.setStyleSheet("background-color:#301b28;color:#ddc5a2;") msg.setText("Wrong file format!") msg.setInformativeText('Only excel file format') msg.setWindowTitle("Error") msg.exec_() def setBrowser(self, browser): self.browser = browser def start(self, name): self.lable_file.setStyleSheet("background-color:green;") self.lable_file.setText(" File is uploaded") self.data = pars_xls(name) if self.data != "Wrong header params, should be: Login, Password, Middle_name, Card_number, Date, Cvv": self.table.setRowCount(len(self.data)) self.user_count = len(self.data) - 1 self.users.setText(str(self.user_count)) self.fill_table() else: msg = QMessageBox() msg.setIcon(QMessageBox.Critical) msg.setStyleSheet("background-color:#301b28;color:#ddc5a2;") msg.setText("Wrong file format!") msg.setInformativeText( "Wrong header params, should be: Login, Password, Middle_name, Card_number, Date, Cvv" ) msg.setWindowTitle("Error") msg.exec_() def fill_table(self): self.table.setItem(0, 0, QTableWidgetItem("Login")) self.table.setItem(0, 1, QTableWidgetItem("Password")) self.table.setItem(0, 2, QTableWidgetItem("Middle name")) self.table.setItem(0, 3, QTableWidgetItem("Card number")) self.table.setItem(0, 4, QTableWidgetItem("Date")) self.table.setItem(0, 5, QTableWidgetItem("Cvv")) self.table.setItem(0, 6, QTableWidgetItem("Url")) for i in range(len(self.data) - 1): for j in range(len(self.data[i])): self.table.setItem(i + 1, j, QTableWidgetItem(self.data[i][j])) def create_threads(self, browser, data): self.button_start.setDisabled(True) k = len(self.my_threads) self.user_count = int(self.users.toPlainText()) drop_time = int( datetime.fromisoformat(self.date_field.dateTime().toString( "yyyy-MM-dd HH:mm:ss")).timestamp()) for i in data: # proxy = self.rus_proxies[k].get_address() self.my_threads.append( bot_on_thread(url=i[6], browser=browser, login=i[0], password=i[1], middle_name=i[2], cardNumber=i[3], cardExpiry=i[4], cardCvc=i[5], drop_time=drop_time)) self.my_threads[k].start() k += 1 if k == self.user_count: break def close_browsers(self): for i in self.my_threads: try: i.close_browser() except: del i continue del i self.my_threads = [] self.button_start.setDisabled(False) def add_url(self): if len(self.data) != 0: for i in range(len(self.data)): self.data[i].append(self.url.toPlainText()) self.table.setItem(i + 1, 6, QTableWidgetItem(self.url.toPlainText())) self.button_start.setDisabled(False) print(self.data)
class Ui_MainWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.transprot_mass =[] self.netprot_mass =[] self.filtering_is_on = 0 grid = QGridLayout() self.setLayout(grid) self.IP_list = IP_list(self) self.TransProt_list = TransProt_list(self) self.NetProt_list = NetProt_list(self) self.setWindowTitle('Гамма') self.setWindowIcon(QIcon('допочки\Gamma_200x200.png')) self.resize(740, 830) self.to_center() self.centralwidget = QWidget(self) self.tabWidget = QTabWidget(self.centralwidget) self.tabWidget.setGeometry(QRect(20, 20, 700, 750)) self.tab = QWidget() grid.addWidget(self.tab) self.cb_time = QCheckBox(self.tab) self.cb_time.setGeometry(QRect(360, 130, 120, 20)) self.cb_time.setText("Фильтр по времени") self.cb_prot = QCheckBox(self.tab) self.cb_prot.setGeometry(QRect(20, 130, 140, 20)) self.cb_prot.setText("Фильтр по протоколам") self.cb_addr = QCheckBox(self.tab) self.cb_addr.setGeometry(QRect(360, 290, 130, 20)) self.cb_addr.setText("Фильтр по IP-адресам") self.dt_beg = QDateTimeEdit(self.tab) self.dt_beg.setGeometry(QRect(360, 210, 150, 20)) self.dt_beg.setDateTime(QDateTime.currentDateTime()) self.dt_beg.setDisplayFormat("dd.MM.yyyy H:mm:ss.zzz") self.dt_beg.setCalendarPopup(True) self.dt_beg.setToolTip('Выбрать начальное время (>=)') self.dt_beg.setEnabled(False) self.dt_end = QDateTimeEdit(self.tab) self.dt_end.setGeometry(QRect(520, 210, 150, 20)) self.dt_end.setDateTime(QDateTime.currentDateTime()) self.dt_end.setDisplayFormat("dd.MM.yyyy H:mm:ss.zzz") self.dt_end.setCalendarPopup(True) self.dt_end.setToolTip('Выбрать конечное время (<)') self.dt_end.setEnabled(False) self.dt_beg.dateChanged.connect(lambda dc: self.date_changed(1)) self.dt_end.dateChanged.connect(lambda dc: self.date_changed(2)) #self.l_input_dir = QLabel(self.tab) #self.l_input_dir.setGeometry(QRect(102, 50, 180, 15)) #self.l_input_dir.setText("Выберите директорию с файлами") #self.l_or = QLabel(self.tab) #self.l_or.setGeometry(QRect(340, 50, 21, 16)) #self.l_or.setText("ИЛИ") self.l_input_file = QLabel(self.tab) self.l_input_file.setGeometry(QRect(300, 50, 90, 15)) self.l_input_file.setText("Выберите файлы") self.l_transpr = QLabel(self.tab) self.l_transpr.setGeometry(QRect(50, 190, 180, 16)) self.l_transpr.setEnabled(False) self.l_transpr.setText("Протоколы Транспортного уровня") self.l_netpr = QLabel(self.tab) self.l_netpr.setGeometry(QRect(50, 290, 180, 16)) self.l_netpr.setEnabled(False) self.l_netpr.setText("Протоколы Сетевого уровня") self.l_beg = QLabel(self.tab) self.l_beg.setGeometry(QRect(390, 190, 60, 16)) self.l_beg.setEnabled(False) self.l_beg.setText("Начиная с..") self.l_end = QLabel(self.tab) self.l_end.setGeometry(QRect(560, 190, 80, 16)) self.l_end.setEnabled(False) self.l_end.setText("Оканчивая до..") self.l_name = QLabel(self.tab) self.l_name.setGeometry(QRect(300, 450, 96, 16)) self.l_name.setText("Как назвать файл?") self.l_filt = QLabel(self.tab) self.l_filt.setGeometry(QRect(300, 10, 91, 16)) self.l_filt.setText("Выборка пакетов") self.line = QFrame(self.tab) self.line.setGeometry(QRect(0, 110, 690, 15)) self.line.setFrameShape(QFrame.HLine) self.line.setFrameShadow(QFrame.Sunken) self.line_2 = QFrame(self.tab) self.line_2.setGeometry(QRect(340, 120, 15, 300)) self.line_2.setFrameShape(QFrame.VLine) self.line_2.setFrameShadow(QFrame.Sunken) self.line_3 = QFrame(self.tab) self.line_3.setGeometry(QRect(0, 420, 690, 15)) self.line_3.setFrameShape(QFrame.HLine) self.line_3.setFrameShadow(QFrame.Sunken) #self.le_dir = QLineEdit(self.tab) #self.le_dir.setGeometry(QRect(110, 80, 211, 20)) #self.le_dir.setEnabled(False) #self.le_dir.setReadOnly(True) self.le_file = QLineEdit(self.tab) self.le_file.setGeometry(QRect(250, 80, 211, 20)) #self.le_file.setEnabled(False) self.le_file.setReadOnly(True) self.le_name = QLineEdit(self.tab) self.le_name.setGeometry(QRect(250, 480, 231, 20)) self.pt_transpr = QPlainTextEdit(self.tab) self.pt_transpr.setGeometry(QRect(50, 210, 271, 71)) self.pt_transpr.setEnabled(False) self.pt_transpr.setReadOnly(True) self.pt_netpr = QPlainTextEdit(self.tab) self.pt_netpr.setGeometry(QRect(50, 320, 271, 71)) self.pt_netpr.setEnabled(False) self.pt_netpr.setReadOnly(True) self.pt_addr = QPlainTextEdit(self.tab) self.pt_addr.setGeometry(QRect(390, 320, 271, 71)) self.pt_addr.setEnabled(False) self.pt_log = QPlainTextEdit(self.tab) self.pt_log.setGeometry(QRect(20, 610, 651, 101)) self.pt_log.setReadOnly(True) self.progressBar = QProgressBar(self.tab) self.progressBar.setGeometry(QRect(20, 580, 651, 20)) self.progressBar.setFormat("%v" + "%") self.progressBar.setMaximum(100) self.progressBar.setValue(0) #self.pb_dir = QPushButton(self.tab) #self.pb_dir.setGeometry(QRect(80, 80, 21, 20)) #self.pb_dir.setIcon(QIcon('допочки\_folder.png')) #self.pb_dir.clicked.connect(lambda gd: self.get_directory(1)) self.pb_file = QPushButton(self.tab) self.pb_file.setGeometry(QRect(220, 80, 21, 20)) self.pb_file.setIcon(QIcon('допочки\_folder.png')) self.pb_file.clicked.connect(lambda gf: self.get_files(1)) self.pb_time = QPushButton(self.tab) self.pb_time.setGeometry(QRect(480, 240, 71, 20)) self.pb_time.setToolTip('Добавить ещё временной отрезок') self.pb_time.setEnabled(False) self.pb_time.setText("Ещё!") self.pb_transpr = QPushButton(self.tab) self.pb_transpr.setGeometry(QRect(20, 210, 21, 20)) self.pb_transpr.setToolTip('Выбрать протоколы Транспортного уровня') self.pb_transpr.setIcon(QIcon('допочки\_blank.png')) self.pb_transpr.setEnabled(False) self.pb_transpr.clicked.connect(self.TransProt_list.exec) self.pb_netpr = QPushButton(self.tab) self.pb_netpr.setGeometry(QRect(20, 320, 21, 20)) self.pb_netpr.setToolTip('Выбрать протоколы Сетевого уровня') self.pb_netpr.setIcon(QIcon('допочки\_blank.png')) self.pb_netpr.setEnabled(False) self.pb_netpr.clicked.connect(self.NetProt_list.exec) self.pb_addr = QPushButton(self.tab) self.pb_addr.setGeometry(QRect(530, 290, 132, 20)) self.pb_addr.setText('Редактировать список') self.pb_addr.setEnabled(False) self.pb_addr.clicked.connect(self.IP_list.exec) self.pb_name = QPushButton(self.tab) self.pb_name.setGeometry(QRect(220, 480, 21, 20)) self.pb_name.setIcon(QIcon('допочки\_folder.png')) self.pb_name.clicked.connect(lambda ed: self.extract_to_directory(1)) self.pb_start = QPushButton(self.tab) self.pb_start.setGeometry(QRect(220, 510, 261, 41)) self.pb_start.setText("Начать выборку") self.pb_start.clicked.connect(self.do_it_motherFucker) #self.radiobutton = QRadioButton(self.tab) #self.radiobutton.setGeometry(QRect(84, 48, 20, 20)) #self.radiobutton_2 = QRadioButton(self.tab) #self.radiobutton_2.setGeometry(QRect(424, 48, 20, 20)) #self.radiobutton.raise_() #self.radiobutton_2.raise_() self.cb_time.raise_() self.cb_prot.raise_() self.cb_addr.raise_() self.dt_beg.raise_() self.dt_end.raise_() #self.l_input_dir.raise_() #self.l_or.raise_() self.l_input_file.raise_() self.l_transpr.raise_() self.l_netpr.raise_() self.l_beg.raise_() self.l_end.raise_() self.l_name.raise_() self.l_filt.raise_() self.line.raise_() self.line_2.raise_() self.line_3.raise_() #self.le_dir.raise_() self.le_file.raise_() self.le_name.raise_() self.pt_transpr.raise_() self.pt_netpr.raise_() self.pt_addr.raise_() self.pt_log.raise_() self.progressBar.raise_() #self.pb_dir.raise_() self.pb_file.raise_() self.pb_time.raise_() self.pb_transpr.raise_() self.pb_netpr.raise_() self.pb_addr.raise_() self.pb_name.raise_() self.pb_start.raise_() self.setCentralWidget(self.centralwidget) self.statusbar = QStatusBar(self) self.setStatusBar(self.statusbar) self.tabWidget.addTab(self.tab, "") self.cb_time.clicked['bool'].connect(self.dt_beg.setEnabled) self.cb_time.clicked['bool'].connect(self.dt_end.setEnabled) self.cb_time.clicked['bool'].connect(self.l_beg.setEnabled) self.cb_time.clicked['bool'].connect(self.l_end.setEnabled) self.cb_prot.clicked['bool'].connect(self.l_transpr.setEnabled) self.cb_prot.clicked['bool'].connect(self.l_netpr.setEnabled) self.cb_prot.clicked['bool'].connect(self.pt_transpr.setEnabled) self.cb_prot.clicked['bool'].connect(self.pt_netpr.setEnabled) self.cb_prot.clicked['bool'].connect(self.pb_transpr.setEnabled) self.cb_prot.clicked['bool'].connect(self.pb_netpr.setEnabled) self.cb_addr.clicked['bool'].connect(self.pt_addr.setEnabled) self.cb_addr.clicked['bool'].connect(self.pb_addr.setEnabled) #####------------------------------2_TAB self.tab_2 = QWidget() self.tabWidget.addTab(self.tab_2, "") self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), ("II работа с файлами")) self.l_merge = QLabel(self.tab_2) self.l_merge.setGeometry(QRect(300, 10, 180, 16)) self.l_merge.setText("Объединение файлов") self.l_arch = QLabel(self.tab_2) self.l_arch.setGeometry(QRect(300, 250, 180, 16)) self.l_arch.setText("Архивирование файлов") #self.radiobutton_3 = QRadioButton(self.tab_2) #self.radiobutton_3.setGeometry(QRect(84, 48, 20, 20)) #self.radiobutton_4 = QRadioButton(self.tab_2) #self.radiobutton_4.setGeometry(QRect(424, 48, 20, 20)) #self.l_input_dir2 = QLabel(self.tab_2) #self.l_input_dir2.setGeometry(QRect(102, 50, 180, 15)) #self.l_input_dir2.setText("Выберите директорию с файлами") #self.l_or2 = QLabel(self.tab_2) #self.l_or2.setGeometry(QRect(340, 50, 21, 16)) #self.l_or2.setText("ИЛИ") self.l_input_file2 = QLabel(self.tab_2) self.l_input_file2.setGeometry(QRect(102, 50, 180, 15))#442, 50, 90, 15)) self.l_input_file2.setText("Выберите файлы") self.l_name2 = QLabel(self.tab_2) self.l_name2.setGeometry(QRect(442, 50, 180, 15))#280, 140, 180, 16)) self.l_name2.setText("Куда сохранить результат?") self.l_ciph2 = QLabel(self.tab_2) self.l_ciph2.setGeometry(QRect(84, 298, 180, 15)) self.l_ciph2.setText("Убрать шифрованный трафик") self.l_arch2 = QLabel(self.tab_2) self.l_arch2.setGeometry(QRect(424, 298, 180, 15)) self.l_arch2.setText("Заархивировать файлы") #self.le_dir2 = QLineEdit(self.tab_2) #self.le_dir2.setGeometry(QRect(110, 80, 211, 20)) #self.le_dir2.setEnabled(False) self.le_file2 = QLineEdit(self.tab_2) self.le_file2.setGeometry(QRect(110, 80, 211, 20))#450, 80, 211, 20)) self.le_file2.setReadOnly(True) self.le_name2 = QLineEdit(self.tab_2) self.le_name2.setGeometry(QRect(450, 80, 211, 20))#260, 170, 180, 20)) #self.pb_dir2 = QPushButton(self.tab_2) #self.pb_dir2.setGeometry(QRect(80, 80, 21, 20)) #self.pb_dir2.setIcon(QIcon('допочки\_folder.png')) #self.pb_dir2.clicked.connect(lambda gd: self.get_directory(2)) self.pb_file2 = QPushButton(self.tab_2) self.pb_file2.setGeometry(QRect(80, 80, 21, 20))#420, 80, 21, 20)) self.pb_file2.setIcon(QIcon('допочки\_folder.png')) self.pb_file2.clicked.connect(lambda gf: self.get_files(2)) self.pb_name2 = QPushButton(self.tab_2) self.pb_name2.setGeometry(QRect(420, 80, 21, 20))#230, 170, 21, 20)) self.pb_name2.setIcon(QIcon('допочки\_folder.png')) self.pb_name2.clicked.connect(lambda ed: self.extract_to_directory(2)) self.pb_merge = QPushButton(self.tab_2) self.pb_merge.setGeometry(QRect(270, 170, 160, 20)) self.pb_merge.setText("Объединить") self.pb_merge.clicked.connect(self.merge_it_motherFucker) self.line_4 = QFrame(self.tab_2) self.line_4.setGeometry(QRect(0, 280, 690, 15)) self.line_4.setFrameShape(QFrame.HLine) self.line_4.setFrameShadow(QFrame.Sunken) self.line_5 = QFrame(self.tab_2) self.line_5.setGeometry(QRect(0, 580, 690, 15)) self.line_5.setFrameShape(QFrame.HLine) self.line_5.setFrameShadow(QFrame.Sunken) self.pt_log2 = QPlainTextEdit(self.tab_2) self.pt_log2.setGeometry(QRect(20, 610, 651, 101)) self.pt_log2.setReadOnly(True) self.graphicsView = QGraphicsView(self.tab_2) self.graphicsView.setGeometry(QRect(0, 330, 714, 277)) self.scene = QGraphicsScene() self.graphicsView.setScene(self.scene) self.scene.addPixmap(QPixmap('допочки\_in_working_3.png')) self.l_merge.raise_() self.l_arch.raise_() #self.l_input_dir2.raise_() #self.l_or2.raise_() self.l_input_file2.raise_() self.l_name2.raise_() #self.radiobutton_3.raise_() #self.radiobutton_4.raise_() #self.pb_dir2.raise_() self.pb_file2.raise_() self.pb_name2.raise_() #self.le_dir2.raise_() self.le_file2.raise_() self.le_name2.raise_() self.line_4.raise_() self.line_5.raise_() self.pt_log2.raise_() #####------------------------------2_TAB #####------------------------------3_TAB self.tab_3 = QWidget() self.tabWidget.addTab(self.tab_3, "") self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), ("III Проверка на аномальную активность")) self.tab_3.setEnabled(False) self.l_filt3 = QLabel(self.tab_3) self.l_filt3.setGeometry(QRect(300, 10, 91, 16)) self.l_filt3.setText("Выборка пакетов") self.l_input_file3 = QLabel(self.tab_3) self.l_input_file3.setGeometry(QRect(300, 50, 90, 15)) self.l_input_file3.setText("Выберите файлы") self.pb_file3 = QPushButton(self.tab_3) self.pb_file3.setGeometry(QRect(220, 80, 21, 20)) self.pb_file3.setIcon(QIcon('допочки\_folder.png')) self.pb_file3.clicked.connect(lambda gf: self.get_files(3)) self.le_file3 = QLineEdit(self.tab_3) self.le_file3.setGeometry(QRect(250, 80, 211, 20)) self.le_file3.setReadOnly(True) self.pb_graphy = QPushButton(self.tab_3) self.pb_graphy.setGeometry(QRect(270, 170, 160, 20)) self.pb_graphy.setText("Построить граф") #self.pb_graphy.clicked.connect(self.graph_it) #self.label_6 = QLabel(self.tab_3) #self.pixmap = QPixmap('допочки\_in_working_1.png') #self.label_6.setPixmap(self.pixmap) self.l_filt3.raise_() self.l_input_file3.raise_() self.pb_file3.raise_() self.le_file3.raise_() #####------------------------------3_TAB #####----------------------------IN_WORK self.tab_4 = QWidget() self.tabWidget.addTab(self.tab_4, "") self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), ("...IV visualization...")) self.tab_4.setEnabled(False) self.label_7 = QLabel(self.tab_4) self.pixmap_2 = QPixmap('допочки\_in_working_2.png') self.label_7.setPixmap(self.pixmap_2) #####----------------------------IN_WORK self.tabWidget.setCurrentIndex(0) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), ("I выборка пакетов")) QMetaObject.connectSlotsByName(self) self.show() def closeEvent(self, event): reply = QMessageBox.question(self, 'Ща закроется всё', "Ты чо, реально хочешь выйти?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() def to_center(self): qr = self.frameGeometry() qr.moveCenter(QDesktopWidget().availableGeometry().center()) self.move(qr.topLeft()) def get_directory(self, gd): if gd == 1: result = QFileDialog.getExistingDirectory() #self.le_dir.setText(result) self.le_file.setDisabled(True) #self.le_dir.setEnabled(True) #self.radiobutton_2.setChecked(False) #self.radiobutton.setChecked(True) else: result = QFileDialog.getExistingDirectory() #self.le_dir2.setText(result) self.le_file2.setDisabled(True) #self.le_dir2.setEnabled(True) #self.radiobutton_4.setChecked(False) #self.radiobutton_3.setChecked(True) def get_files(self, gf): if gf == 1: result, bullshit = QFileDialog.getOpenFileNames(self, "Выберите pcap-файлы", getcwd(), "files (*.pcap *.pcapng)") #self.le_dir.setDisabled(True) self.le_file.setEnabled(True) #self.radiobutton.setChecked(False) #self.radiobutton_2.setChecked(True) if len(result): self.le_file.setText(", ".join(result)) elif gf == 3: result, bullshit = QFileDialog.getOpenFileNames(self, "Выберите pcap-файлы", getcwd(), "files (*.pcap *.pcapng)") #self.le_dir.setDisabled(True) self.le_file3.setEnabled(True) #self.radiobutton.setChecked(False) #self.radiobutton_2.setChecked(True) if len(result): self.le_file3.setText(", ".join(result)) else: result, bullshit = QFileDialog.getOpenFileNames(self, "Выберите pcap-файлы", getcwd(), "files (*.pcap *.pcapng)") #self.le_dir2.setDisabled(True) self.le_file2.setEnabled(True) #self.radiobutton_3.setChecked(False) #self.radiobutton_4.setChecked(True) if len(result): self.le_file2.setText(", ".join(result)) def date_changed(self, dc): if dc == 1: self.dt_end.setMinimumDateTime(QDateTime(self.dt_beg.dateTime())) else: self.dt_beg.setMaximumDateTime(QDateTime(self.dt_end.dateTime())) def extract_to_directory(self, ed): if ed == 1: result, bullshit =QFileDialog.getSaveFileName(self, "Сохранить файл", getcwd(), "files (*.pcap *.pcapng)") self.le_name.setText(result) else: result, bullshit =QFileDialog.getSaveFileName(self, "Сохранить файл", getcwd(), "files (*.pcap *.pcapng)") self.le_name2.setText(result) def do_it_motherFucker(self): if self.filtering_is_on == 0: #if ((not self.radiobutton.isChecked() and not self.radiobutton_2.isChecked())\ # or (self.radiobutton.isChecked() and self.le_dir.text() == '')\ # or (self.radiobutton_2.isChecked() and self.le_file.text() == ''))\ # and self.le_name.text() == '': if self.le_file.text() == '' and self.le_name.text() == '': self.pt_log.appendPlainText(" " + "Какие файлы обработать? Куда сохранить? Такая неопределённость..") #elif (not self.radiobutton.isChecked() and not self.radiobutton_2.isChecked()) or (self.radiobutton.isChecked() and self.le_dir.text() == '') or (self.radiobutton_2.isChecked() and self.le_file.text() == ''): elif self.le_file.text() == '': self.pt_log.appendPlainText(" " + "Какие файлы обработать?") elif self.le_name.text() == '': self.pt_log.appendPlainText(" " + "Куда сохранить?") else: self.filtering_is_on = 1 # эти пиздецы в идеале нужно заменить на что-нибудь адекватное self.count_for_pr_b = 0 # эти пиздецы в идеале нужно заменить на что-нибудь адекватное self.progressBar.setValue(0) self.pb_start.setText("Остановить выборку") #my_directory = self.le_dir.text() pcap_files_in = self.le_file.text() pcap_file_out = self.le_name.text() per_quest = 0 per_beg = '' per_end = '' prot_quest = 0 net_prot = 0 trans_prot = 0 appl_prot = 0 ## ip_quest = 0 netprot_mass = [] transprot_mass = [] addr_mass = [] if (pcap_file_out.endswith(".pcap") or pcap_file_out.endswith(".pcapng")) == False: pcap_file_out = pcap_file_out + ".pcap" self.pt_log.appendPlainText("Сохранить в:") self.pt_log.appendPlainText(" " + pcap_file_out) #if self.radiobutton.isChecked(): # onlyfiles = [my_directory + '/' + f for f in listdir(my_directory) if # f.endswith(".pcap") or f.endswith(".pcapng") and isfile(join(my_directory, f))] # self.for_pr_b = len(onlyfiles) # # self.pt_log.appendPlainText("Выбрана директория:") # self.pt_log.appendPlainText(" " + self.le_dir.text()) # self.pt_log.appendPlainText("С pcap-файлами:") # for file in onlyfiles: # bullshit, fname = file.rsplit('/', 1) # self.pt_log.appendPlainText(" " + fname) #elif self.radiobutton_2.isChecked(): onlyfiles = pcap_files_in.split(', ') self.for_pr_b = len(onlyfiles) self.pt_log.appendPlainText("Выбраны pcap-файлы:") for file in onlyfiles: self.pt_log.appendPlainText(" " + (file)) if self.cb_addr.isChecked() and self.pt_addr.toPlainText() != '': ip_quest = 1 addr_mass = self.pt_addr.toPlainText().splitlines() if self.cb_time.isChecked(): per_quest = 1 per_beg = self.dt_beg.dateTime() per_end = self.dt_end.dateTime() if self.cb_prot.isChecked(): prot_quest = 1 transprot_mass = self.transprot_mass netprot_mass = self.netprot_mass if self.pt_transpr.toPlainText() != '': trans_prot = 1 if self.pt_netpr.toPlainText() != '': net_prot = 1 #self.radiobutton.setDisabled(True) #self.radiobutton_2.setDisabled(True) #self.l_input_dir.setDisabled(True) #self.l_or.setDisabled(True) self.l_input_file.setDisabled(True) #self.pb_dir.setDisabled(True) self.pb_file.setDisabled(True) #self.le_dir.setDisabled(True) self.le_file.setDisabled(True) self.cb_time.setDisabled(True) self.cb_prot.setDisabled(True) self.cb_addr.setDisabled(True) self.l_transpr.setDisabled(True) self.l_netpr.setDisabled(True) self.l_beg.setDisabled(True) self.l_end.setDisabled(True) self.l_name.setDisabled(True) self.l_filt.setDisabled(True) self.le_name.setDisabled(True) self.dt_beg.setDisabled(True) self.dt_end.setDisabled(True) self.pt_transpr.setDisabled(True) self.pt_netpr.setDisabled(True) self.pt_addr.setDisabled(True) self.pb_time.setDisabled(True) self.pb_transpr.setDisabled(True) self.pb_netpr.setDisabled(True) self.pb_addr.setDisabled(True) self.pb_name.setDisabled(True) self.worker = WorkerThread(onlyfiles, pcap_file_out, per_quest, per_beg, per_end, prot_quest, net_prot, netprot_mass, trans_prot, transprot_mass, appl_prot, ip_quest, addr_mass) self.worker.callback_received.connect(self.append_to_log) self.worker.start() self.pt_log.appendPlainText("") self.pt_log.appendPlainText("В работе:") elif self.filtering_is_on == 1: self.worker.terminate() self.pt_log.appendPlainText("") self.pt_log.appendPlainText("Работа прервана") self.pt_log.appendPlainText("") self.pt_log.appendPlainText("") self.go_to_starting_set() def append_to_log(self, x): self.count_for_pr_b += 1 self.pt_log.appendPlainText("") self.pt_log.appendPlainText(x) self.progressBar.setValue(self.count_for_pr_b * 100 / (self.for_pr_b + 1)) if self.progressBar.value() == 100: self.pt_log.appendPlainText("") self.pt_log.appendPlainText("") self.go_to_starting_set() def go_to_starting_set(self): self.filtering_is_on = 0 self.pb_start.setText("Начать выборку") #self.radiobutton.setDisabled(False) #self.radiobutton_2.setDisabled(False) #self.l_input_dir.setDisabled(False) #self.l_or.setDisabled(False) self.l_input_file.setDisabled(False) #self.pb_dir.setDisabled(False) self.pb_file.setDisabled(False) #self.le_dir.setDisabled(False) self.le_file.setDisabled(False) self.cb_time.setDisabled(False) self.cb_prot.setDisabled(False) self.cb_addr.setDisabled(False) self.l_name.setDisabled(False) self.l_filt.setDisabled(False) self.le_name.setDisabled(False) self.pb_name.setDisabled(False) if self.cb_time.isChecked(): self.dt_beg.setEnabled(True) self.dt_end.setEnabled(True) self.l_beg.setEnabled(True) self.l_end.setEnabled(True) if self.cb_prot.isChecked(): self.l_transpr.setEnabled(True) self.l_netpr.setEnabled(True) self.pt_transpr.setEnabled(True) self.pt_netpr.setEnabled(True) self.pb_transpr.setEnabled(True) self.pb_netpr.setEnabled(True) if self.cb_addr.isChecked(): self.pt_addr.setEnabled(True) self.pb_addr.setEnabled(True) def merge_it_motherFucker(self): #if self.radiobutton_3.isChecked(): # self.pt_log2.appendPlainText("Выбрана директория с pcap-файлами:") # self.pt_log2.appendPlainText(" " + self.le_dir2.text()) # self.pt_log2.appendPlainText('Просматриваем "{}"...'.format(self.le_dir2.text())) # onlyfiles = [self.le_dir2.text() + '/' + f for f in listdir(self.le_dir2.text()) if # f.endswith(".pcap") or f.endswith(".pcapng") and isfile(join(self.le_dir2.text(), f))] # self.pt_log2.appendPlainText(str(onlyfiles)) #elif self.radiobutton_4.isChecked(): self.pt_log2.appendPlainText("Выбраны pcap-файлы:") self.pt_log2.appendPlainText(" " + self.le_file2.text()) onlyfiles = self.le_file2.text().split(', ') self.pt_log2.appendPlainText('Работаем с "{}"...'.format(onlyfiles)) merge_file_out = self.le_name2.text() if (merge_file_out.endswith(".pcap") or merge_file_out.endswith(".pcapng")) == False: merge_file_out = merge_file_out + ".pcap" self.pt_log2.appendPlainText("Сохранить в:") self.pt_log2.appendPlainText(" " + merge_file_out) self.pt_log2.appendPlainText("") merge.mergecap(onlyfiles, merge_file_out)
class Setting(QWidget, Ui_widget_setting): signal_core_number = pyqtSignal(int) signal_suspend_status = pyqtSignal(bool) signal_waiting_min = pyqtSignal(int) signal_schedule_status = pyqtSignal(bool) signal_cancel_plan = pyqtSignal(str) signal_change_language = pyqtSignal(str) def __init__(self, suspend, cores, schedule_status, waiting_min, language): super().__init__() self.setupUi(self) # ----------init variable------------ self.suspend = suspend self.cores = cores self.schedule_status = schedule_status self.waiting_min = waiting_min self.language = language self.language_list = ['English', 'Chinese'] # ----------init widget-------------- self.label_suspend = QTreeWidgetItem() self.checkbox_suspend = QCheckBox() self.label_cores = QTreeWidgetItem() self.edit_cores = QSpinBox() self.label_plan = QTreeWidgetItem() self.edit_plan_datetime = QDateTimeEdit() self.label_about = QTreeWidgetItem() self.label_language = QTreeWidgetItem() self.combobox_lauguage = QComboBox() # -----------init function---------------- self.ui_set() self.btn() self.init_data_show() self.self_translate(language) self.show() def btn(self): self.tree_setting.itemClicked.connect(self.effect_expand) self.tree_setting.itemChanged.connect(self.enable_schedule) self.combobox_lauguage.activated.connect(self.choose_language) self.checkbox_suspend.stateChanged.connect(self.change_suspend_status) def ui_set(self): # style self.setStyleSheet( "QSpinBox{border:1.5px solid #778899;border-radius:4px; padding:2px 2px}" "QDateTimeEdit{border:1.5px solid #778899;border-radius:4px; padding:2px 2px}" ) self.tree_setting.setColumnWidth(0, 180) self.tree_setting.expandItem(self.tree_setting.topLevelItem(0)) self.tree_setting.topLevelItem(1).setCheckState(1, 0) self.edit_cores.setMaximumSize(50, 25) self.edit_cores.setContentsMargins(0, 4, 0, 0) self.edit_cores.setMinimum(1) self.edit_cores.setMaximum(132) self.label_plan.setDisabled(True) self.edit_plan_datetime.setMaximumSize(135, 28) self.edit_plan_datetime.setDisabled(True) self.combobox_lauguage.setMaximumSize(135, 28) self.combobox_lauguage.addItems(self.language_list) self.combobox_lauguage.setCurrentText(self.language) # function self.add_tree_item(0, self.label_suspend, "暂停队列", self.checkbox_suspend) self.add_tree_item(0, self.label_cores, "使用核数", self.edit_cores) self.add_tree_item(1, self.label_plan, "计划启动于", self.edit_plan_datetime) self.add_tree_item(2, self.label_language, "语言选择", self.combobox_lauguage) def add_tree_item(self, top_level_index, label, label_name, input_edit): label.setText(0, label_name) self.tree_setting.topLevelItem(top_level_index).addChild(label) self.tree_setting.setItemWidget(label, 1, input_edit) def effect_expand(self, item, column): index = self.tree_setting.indexOfTopLevelItem(item) if index >= 0: if item.isExpanded(): item.setExpanded(False) else: item.setExpanded(True) def enable_schedule(self, item, column): index = self.tree_setting.indexOfTopLevelItem(item) if index == 1: check_state = item.checkState(column) self.schedule_status = bool(check_state) self.label_plan.setDisabled(2 - check_state) self.edit_plan_datetime.setEnabled(check_state) item.setExpanded(2 - check_state) self.reset_date_edit() self.suspend = self.checkbox_suspend.checkState() self.checkbox_suspend.setCheckState(self.suspend + check_state) self.checkbox_suspend.setDisabled(check_state) def init_data_show(self): self.edit_cores.setValue(self.cores) self.checkbox_suspend.setCheckState(self.suspend * 2) if self.schedule_status: self.tree_setting.topLevelItem(1).setCheckState(1, 2) self.label_plan.setDisabled(False) self.edit_plan_datetime.setEnabled(True) self.tree_setting.topLevelItem(1).setExpanded(True) waiting_seconds = self.waiting_min * 60 self.edit_plan_datetime.setDisplayFormat("yyyy/MM/dd HH:mm") self.edit_plan_datetime.setDateTime( QDateTime.currentDateTime().addSecs(waiting_seconds)) else: self.reset_date_edit() def reset_date_edit(self): self.edit_plan_datetime.setDisplayFormat("yyyy/MM/dd HH:mm") self.edit_plan_datetime.setDateTime(QDateTime.currentDateTime()) self.edit_plan_datetime.setMinimumDateTime(QDateTime.currentDateTime()) self.edit_plan_datetime.setMaximumDateTime( QDateTime.currentDateTime().addDays(5)) self.edit_plan_datetime.setCalendarPopup(True) def change_suspend_status(self, status): self.suspend = bool(status) def plan_start(self): curr_time = QDateTime.currentSecsSinceEpoch() schedule_time = self.edit_plan_datetime.dateTime().toSecsSinceEpoch() self.waiting_min = int(round((schedule_time - curr_time) / 60, 0)) print('waiting min', self.waiting_min) self.signal_waiting_min.emit(self.waiting_min) def choose_language(self): language = self.combobox_lauguage.currentText() self.signal_change_language.emit(language) self.self_translate(language) def self_translate(self, language): if language == 'English': self.label_suspend.setText(0, 'Suspend next') self.label_cores.setText(0, 'Threads number') self.label_plan.setText(0, 'Scheduled in') self.label_language.setText(0, 'Language') else: self.label_suspend.setText(0, "暂停队列") self.label_cores.setText(0, "使用核数") self.label_plan.setText(0, "计划启动于") self.label_language.setText(0, "语言选择") self.retranslateUi(self) def closeEvent(self, event): self.cores = self.edit_cores.value() suspend_status = self.checkbox_suspend.checkState() self.signal_core_number.emit(self.cores) self.signal_schedule_status.emit(self.schedule_status) if self.schedule_status: self.plan_start() else: self.signal_cancel_plan.emit(' ') self.signal_suspend_status.emit(bool(suspend_status)) self.close()
class SliceWidget(QWidget): """Custom widget to slice data""" # Signals sliceTimes = pyqtSignal(str, str) def __init__(self): super().__init__() self.init_ui() def init_ui(self): """Layout and main functionalities""" # Labels slice_label = QLabel("Slicing") start_label = QLabel("Start: ") end_label = QLabel("End: ") # DateTimeEdit self.start_date_time_edit = QDateTimeEdit() self.end_date_time_edit = QDateTimeEdit() # Buttons apply_button = QPushButton("Apply") apply_button.clicked.connect(self.send_times) hide_button = QPushButton("Hide") hide_button.clicked.connect(self.hide) # Layouts # - Horizontal for start h_start = QHBoxLayout() h_start.addWidget(start_label) h_start.addWidget(self.start_date_time_edit) # - Horizontal for end h_end = QHBoxLayout() h_end.addWidget(end_label) h_end.addWidget(self.end_date_time_edit) # - Vertical for self v_widget = QVBoxLayout() v_widget.addWidget(slice_label) v_widget.addLayout(h_start) v_widget.addLayout(h_end) v_widget.addWidget(apply_button) v_widget.addWidget(hide_button) self.setLayout(v_widget) def send_times(self): """It emits a signal with start and end dates""" debug = True if debug: print("- In SliceWidget.send_times()") start = self.start_date_time_edit.dateTime() end = self.end_date_time_edit.dateTime() start_string = start.toString("yyyyMMddhhmmss") end_string = end.toString("yyyyMMddhhmmss") if debug: print("sliceTimes emit:", start_string, end_string) self.sliceTimes.emit(start_string, end_string) def refresh(self, start, end): """It refresh the parameters of self.start_date_time_edit and self.end_date_time_edit""" self.start_date_time_edit.setMinimumDateTime(start) self.start_date_time_edit.setMaximumDateTime(end) self.start_date_time_edit.setDateTime(start) self.end_date_time_edit.setMinimumDateTime(start) self.end_date_time_edit.setMaximumDateTime(end) self.end_date_time_edit.setDateTime(end)
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 MyForm(QMainWindow): zoom = 0 pos = None constellation = None step = 0 rotation = False coordChange = False def __init__(self, sky): super().__init__() self.sky = sky self.initUI() def initUI(self): self.setStyleSheet( ''' .QDateTimeEdit, .QLineEdit { background: rgbs(0, 0, 0, 0.5); color: #DDDDDD; border: 1px solid #5A5A5A; border-radius: 5; selection-color: #0a214c; selection-background-color: #C19A6B;} ''') self.initEditors() self.setFocusPolicy(Qt.ClickFocus) self.setGeometry(300, 300, self.sky.width, self.sky.height) self.setWindowTitle('Starry Sky') self.timer = QBasicTimer() self.timer.start(50, self) self.show() def initEditors(self): self.datetime = QDateTimeEdit(self) self.datetime.setFocusPolicy(Qt.ClickFocus) self.datetime.setGeometry(30, 10, 138, 30) self.datetime.setDisplayFormat('dd.MM.yyyy HH:mm') self.datetime.setMaximumDateTime(QDateTime.fromString( '31.12.2099 23:59:59', 'dd.MM.yyyy HH:mm')) self.datetime.setMinimumDateTime(QDateTime.fromString( '01.01.2000 00:00:00', 'dd.MM.yyyy HH:mm')) self.datetime.setDateTime(QDateTime.currentDateTime().toUTC()) self.datetime.dateTimeChanged.connect(self.dateTimeChanged) self.dateTimeChanged(self.datetime.dateTime()) self.coordTheta = QLineEdit(self) self.coordTheta.setFocusPolicy(Qt.ClickFocus) self.coordTheta.setGeometry(10, 50, 85, 30) self.coordTheta.setInputMask('#00°00\'00"') self.coordTheta.setText('+90°00\'00"') self.coordTheta.setValidator(MyValidator(90, -90)) self.coordTheta.textChanged.connect(self.coordChanged) self.coordPhi = QLineEdit(self) self.coordPhi.setFocusPolicy(Qt.ClickFocus) self.coordPhi.setGeometry(100, 50, 85, 30) self.coordPhi.setInputMask('000°00\'00"') self.coordPhi.setText('000°00\'00"') self.coordPhi.setValidator(MyValidator(360)) self.coordPhi.textChanged.connect(self.coordChanged) def coordChanged(self, event): if self.coordChanged: self.coordChanged = False return self.sky.change_direction( str(self.coordTheta.text()), str(self.coordPhi.text())) self.repaint() def dateTimeChanged(self, event): self.sky.set_angle(event.toMSecsSinceEpoch() - MSecsSinceEpoh + event.offsetFromUtc() * 1000) def timerEvent(self, e): self.step += 1 if self.rotation: self.sky.inc_angle() self.datetime.setDateTime(self.datetime.dateTime().addMSecs(45000)) self.repaint() def paintEvent(self, e): qp = MyPainter() qp.begin(self) qp.setBrush(QBrush(Qt.SolidPattern)) qp.drawRect(0, 0, self.size().width(), self.size().height()) self.drawPoints(qp) self.drawLabels(qp) qp.end() def drawPoints(self, qp): for star in self.sky.get_stars(): color = QColor(*colors[star.color]) pos = self.get_gradient_position(star) if star.constellation == self.constellation: qp.drawStar(star.x, star.y, color, star.r + 3, pos) if star.letter: qp.drawLetter(star.x, star.y, color, star.letter) else: qp.drawStar(star.x, star.y, color, star.r, pos) def drawLabels(self, qp): if self.sky.in_pole(): return qp.setPen(QColor(255, 255, 255)) for coord, label in zip(self.sky.get_labels(), labels): qp.drawText(coord.x, coord.y, label) def wheelEvent(self, event): self.zoom += event.angleDelta().y() self.sky.zoom(self.zoom) self.repaint() def refresh_coord(self, theta, phi): self.coordChanged = True self.coordTheta.setText(self.to_text(theta)) self.coordChanged = True self.coordPhi.setText(self.to_text(phi)) def to_text(self, angle): integer = int(angle) angle %= 1 angle *= 60 minute = int(angle) angle %= 1 angle *= 60 secunde = int(angle) return '{0:03d}°{1:02d}\'{2:02d}\'\''.format(integer, minute, secunde) def get_gradient_position(self, star): return positions[int(star.m * 100 + self.step) % len(positions)] def get_delta_in_fract(self, pos): size = self.size() delta = self.pos - pos return delta.x() / size.width(), delta.y() / size.height() def resizeEvent(self, event): self.sky.resize(Point(self.size().width(), self.size().height())) self.repaint() def mousePressEvent(self, event): self.pos = event.pos() def mouseMoveEvent(self, event): if event.buttons() == Qt.RightButton: self.sky.rotate_screen( *map(Point.create_from_QPoint, (event.pos(), self.pos))) elif event.buttons() == Qt.LeftButton: phi, theta = self.sky.rotate_camera( *self.get_delta_in_fract(event.pos())) self.refresh_coord(phi, theta) else: return self.pos = event.pos() self.repaint() def mouseDoubleClickEvent(self, event): if event.buttons() == Qt.LeftButton: star = self.sky.get_nearest_star( Point.create_from_QPoint(event.pos())) if star: self.constellation = star.constellation else: self.constellation = None self.repaint() def keyPressEvent(self, event): if event.key() == Qt.Key_P: self.rotation ^= 1 return if event.key() == Qt.Key_Escape: self.constellation = None return if event.key() == Qt.Key_Left: phi, theta = self.sky.rotate_camera(-0.1, 0) if event.key() == Qt.Key_Right: phi, theta = self.sky.rotate_camera(0.1, 0) if event.key() == Qt.Key_Up: phi, theta = self.sky.rotate_camera(0, -0.1) if event.key() == Qt.Key_Down: phi, theta = self.sky.rotate_camera(0, 0.1) with suppress(UnboundLocalError): self.refresh_coord(phi, theta)