def __init__(self): super().__init__() layout = QVBoxLayout(self) layout.setAlignment(Qt.AlignCenter) self.file_selector = Path_selector('file') self.folder_selector = Path_selector('folder') self.file_selector.setFixedSize(500, 40) self.folder_selector.setFixedSize(500, 40) layout.addWidget(self.file_selector) layout.addWidget(self.folder_selector) button = QPushButton("Execute") button.clicked.connect(self.handleExecute) button.setFixedSize(100, 40) layout.addWidget(button, alignment=Qt.AlignCenter) button_rev = QPushButton("Backwards") button_rev.clicked.connect(self.handleBackwards) button_rev.setFixedSize(100, 40) layout.addWidget(button_rev, alignment=Qt.AlignCenter)
class TetrisView(QWidget): GAME = 1 def __init__(self, signalController, status_bar): super().__init__() self.signalController = signalController self.statusBar = status_bar self.initUI() def initUI(self): """ Init app """ vbox = QVBoxLayout() hbox = QHBoxLayout() # Create button "back to the menu" self._buttonBack = QPushButton(QIcon(PATH_IMAGE_BACK_NEDDLE), "", self) self._buttonBack.clicked.connect(self.signalController.back2menu) self._buttonBack.setFixedSize(60, 30) vbox.addWidget(self._buttonBack, 0, QtCore.Qt.AlignTop) self.tboard = Board(self) # Create button which restart game self._restartGame = QPushButton(QIcon(PATH_IMAGE_RELOAD), "", self) self._restartGame.clicked.connect(self.tboard.start) self._restartGame.setFixedSize(60, 30) vbox.addWidget(self._restartGame, 1, QtCore.Qt.AlignTop) # Create label "Score" self._labelScore = QLabel("Game Score", self) vbox.addWidget(self._labelScore, 2, QtCore.Qt.AlignBottom) # Create score counter self._score = QLCDNumber(self) self._score.setFixedSize(70, 50) vbox.addWidget(self._score, 3, QtCore.Qt.AlignTop) hbox.addLayout(vbox, 0) hbox.addWidget(self.tboard, 1) self.setLayout(hbox) self.setWindowTitle("TetrisView") self.tboard.msg2StatusBar[str].connect(self._score.display) def switcher(self): self.tboard.start() self.signalController.sgn2stacked.emit(int(self.GAME))
def create_seed_ratio_grid(self): self.scroll_widget = QWidget() self.scroll_widget.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) self.seedRatioGrid = QGridLayout() self.seed_ratio_buttons = [] self.num_columns = 4 self.num_rows = 8 for row in range(0, self.num_rows): for column in range(0, self.num_columns): idx = row * self.num_columns + column new_button = QPushButton() new_button.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) new_button.setFixedSize(80, 20) sp = new_button.sizePolicy() sp.setRetainSizeWhenHidden(True) new_button.setSizePolicy(sp) new_button.clicked.connect( lambda state=True, x=idx: self.seed_button_pushed(x)) self.seed_ratio_buttons.append(new_button) self.seedRatioGrid.addWidget(new_button, row, column) self.scroll_widget.setLayout(self.seedRatioGrid) self.seedRatios.setWidget(self.scroll_widget)
class MainWidget(QWidget): def __init__(self, base): QWidget.__init__(self) self.base = base self.setWindowIcon(QIcon('icon.ico')) self.setWindowTitle(TITLE) self.set_background_color(QColor(255, 255, 255)) self.process_header_widget = QWidget() self.process_header_layout = QHBoxLayout(self.process_header_widget) self.process_header_layout.setContentsMargins(0, 0, 0, 0) self.process_label = QLabel('Available processes:') self.github_label = QLabel( '<a href="https://github.com/darktohka/p3dephaser">GitHub</a>') self.github_label.setOpenExternalLinks(True) self.refresh_button = QPushButton('Refresh') self.refresh_button.clicked.connect(self.refresh_processes) self.refresh_button.setFixedSize(100, 23) self.multifile_widget = QWidget() self.multifile_layout = QHBoxLayout(self.multifile_widget) self.multifile_layout.setContentsMargins(0, 0, 0, 0) self.multifileLabel = QLabel('Requested multifile names:') self.multifileBox = QLineEdit(self) self.multifileBox.returnPressed.connect(self.begin_scan) self.multifile_layout.addWidget(self.multifileLabel) self.multifile_layout.addWidget(self.multifileBox) self.scan_button = QPushButton('Scan') self.scan_button.clicked.connect(self.begin_scan) self.process_list_box = QListWidget() self.process_header_layout.addWidget(self.process_label) self.process_header_layout.addStretch(1) self.process_header_layout.addWidget(self.github_label) self.process_header_layout.addWidget(self.refresh_button) self.result_table = QTableWidget() self.result_table.setColumnCount(3) self.result_table.horizontalHeader().setStretchLastSection(True) self.result_table.horizontalHeader().setSectionResizeMode( QHeaderView.ResizeMode.Stretch) for i, header in enumerate(('Process', 'Multifile', 'Password')): self.result_table.setHorizontalHeaderItem(i, QTableWidgetItem(header)) self.base_layout = QVBoxLayout(self) self.base_layout.setContentsMargins(15, 15, 15, 15) self.base_layout.addWidget(self.process_header_widget) self.base_layout.addWidget(self.process_list_box) self.base_layout.addWidget(self.multifile_widget) self.base_layout.addWidget(self.scan_button) self.base_layout.addWidget(self.result_table) self.refresh_processes() self.thread_pool = QThreadPool() self.worker = None self.process_name = None self.stop_event = threading.Event() def set_background_color(self, color): self.setAutoFillBackground(True) palette = self.palette() palette.setColor(self.backgroundRole(), color) self.setPalette(palette) def get_processes(self): processes = [] for proc in psutil.process_iter(): processes.append(proc.as_dict(attrs=['pid', 'name'])) processes.sort( key=lambda process: (process['name'].lower(), process['pid'])) return processes def refresh_processes(self): self.process_list_box.clear() processes = self.get_processes() for process in processes: name = process['name'] pid = process['pid'] self.process_list_box.addItem(f'{name} (PID {pid})') def begin_scan(self): if self.worker: self.stop_event.set() self.scan_button.setEnabled(False) return items = self.process_list_box.selectedItems() if not items: QMessageBox.warning(self, TITLE, 'Please choose a process from the list!') return process = items[0].text()[:-1].split(' ') self.process_name = ' '.join(process[:-2]) pid = int(process[-1]) multifiles = self.multifileBox.text().split() if not multifiles: QMessageBox.warning(self, TITLE, 'Please choose some multifiles to target!') return multifile_names = '\n'.join( [f'- {multifile}' for multifile in multifiles]) question = f'Do you really want to scan {self.process_name} for the following multifiles?\n\n{multifile_names}' if QMessageBox.question( self, TITLE, question, QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No ) != QMessageBox.StandardButton.Yes: return self.count = 0 self.setWindowTitle(f'{TITLE} - Scanning...') self.scan_button.setText('Stop') self.worker = ScanWorker(self, pid, multifiles) self.worker.signals.finished.connect(self.scan_over) self.worker.signals.error.connect(self.error_occurred) self.worker.signals.progress.connect(self.report_progress) self.thread_pool.start(self.worker) def scan_over(self): self.worker = None self.stop_event.clear() self.scan_button.setText('Scan') self.scan_button.setEnabled(True) self.setWindowTitle(TITLE) QMessageBox.information( self, TITLE, f'Scan complete!\n\n{self.count} password{"s have" if self.count != 1 else " has"} been found.' ) def error_occurred(self, error): exc, value, message = error QMessageBox.critical( self, TITLE, f'An error has occurred while trying to scan this process!\n\n{exc} {value}\n\n{message}' ) def report_progress(self, multifile, password): self.count += 1 index = self.result_table.rowCount() self.result_table.insertRow(index) for i, value in enumerate((self.process_name, multifile, password)): self.result_table.setItem(index, i, QTableWidgetItem(value))