class Main_Window(QMainWindow): def __init__(self): super(Main_Window, self).__init__() self.menubar = QMenuBar(self) self.statusbar = QStatusBar(self) self.centralwidget = QWidget(self) self.image_view = Image_View(self.centralwidget) self.horizontal_slider = QSlider(self.centralwidget) self.setup_ui() def setup_ui(self): # 1. self info self.setObjectName("Demo_1") self.resize(800, 600) # 2.1 sub widgets self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22)) self.menubar.setObjectName("menubar") self.setMenuBar(self.menubar) # 2.2 self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) # 2.3 self.centralwidget.setObjectName("centralwidget") self.setCentralWidget(self.centralwidget) self.image_view.setGeometry(QtCore.QRect(144, 10, 512, 512)) self.image_view.setObjectName("image_view") self.horizontal_slider.setGeometry(QtCore.QRect(144, 530, 512, 22)) self.horizontal_slider.setOrientation(QtCore.Qt.Horizontal) self.horizontal_slider.setObjectName("horizontal_slider") # 3 signals and slots self.horizontal_slider.valueChanged['int'].connect(self.image_view.repaint)
class Ui_MainWindow(object): def setupUi(self, MainWindow): screen = app.primaryScreen() screenHeight = screen.size().height() screenWidth = screen.size().width() MainWindow.setObjectName("MainWindow") MainWindow.setFixedSize(1125, 800) MainWindow.setAutoFillBackground(False) myappid = u'Risk_Identefier' # arbitrary string ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid) self.setWindowIcon(QtGui.QIcon('logo.png')) self.filedialog = QFileDialog() self.filedialog.setFixedSize(500, 500) self.fileName = "" self.msg = QMessageBox() self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.centralwidget.setStyleSheet("background: #707070;") self.progressBar = QProgressBar(self.centralwidget) self.progressBar.setGeometry(QtCore.QRect(50, 835 - 103, 200, 23)) self.progressBar.setProperty("value", 0) self.progressBar.setObjectName("progressBar") self.progressBar.hide() self.progressBarLabel = QLabel(self.centralwidget) self.progressBarLabel.setWordWrap(True) self.progressBarLabel.setGeometry(QtCore.QRect(500, 835 - 103, 300, 25)) font = QtGui.QFont() font.setPointSize(14) self.progressBarLabel.setFont(font) self.progressBarLabel.setObjectName("progressBarLabel") self.progressBarLabel.setStyleSheet("color: #effeff;") self.hideProgNumLabel = QLabel(self.centralwidget) self.hideProgNumLabel.setGeometry(QtCore.QRect(215, 835 - 103, 50, 23)) self.hideProgNumLabel.setObjectName("hideProgNumLabel") self.hideProgNumLabel.setStyleSheet("background: #707070;") self.radioButtonML = QtWidgets.QRadioButton(self.centralwidget) self.radioButtonML.setGeometry(QtCore.QRect(30, 640 - 103, 180, 23)) self.radioButtonML.setObjectName("radioButtonML") self.radioButtonML.setFont(font) self.radioButtonML.setStyleSheet( "QRadioButton{color:#effeff} QRadioButton:indicator { image: url('images/uncheckedRadio.png'); width:20px; height: 150px;} QRadioButton:indicator:checked {image: url('images/radioChecked.png');}" ) self.radioButtonML.setCursor( QtGui.QCursor(QtCore.Qt.PointingHandCursor)) self.radioButtonML.setChecked(True) self.radioButtonSearch = QtWidgets.QRadioButton(self.centralwidget) self.radioButtonSearch.setGeometry(QtCore.QRect( 30, 700 - 103, 171, 23)) self.radioButtonSearch.setObjectName("radioButtonSearch") self.radioButtonSearch.setFont(font) self.radioButtonSearch.setStyleSheet( "QRadioButton{color:#effeff} QRadioButton:indicator { image: url('images/uncheckedRadio.png'); width:20px; height: 150px;} QRadioButton:indicator:checked {image: url('images/radioChecked.png');}" ) self.radioButtonSearch.setCursor( QtGui.QCursor(QtCore.Qt.PointingHandCursor)) self.browseButton = QPushButton(self.centralwidget) self.browseButton.setGeometry(QtCore.QRect(30, 460 - 103, 171, 41)) font = QtGui.QFont() font.setPointSize(14) self.browseButton.setFont(font) self.browseButton.setAutoDefault(False) self.browseButton.setFlat(False) self.browseButton.setObjectName("browseButton") self.browseButton.setStyleSheet( "QPushButton{background: #914ed4; border-radius: 10px; color: #effeff; border: 3px outset black;} QPushButton:hover{background : #4838e8; border: 3px outset white;};" ) self.browseButton.setCursor(QtGui.QCursor( QtCore.Qt.PointingHandCursor)) self.titlePicture = QLabel(self.centralwidget) self.titlePicture.setGeometry(QtCore.QRect(0, 0, 1154, 347)) self.titlePicture.setText("") self.titlePicture.setStyleSheet( "background-image: url('images/background.jpg')") self.titlePicture.setObjectName("titlePicture") self.logoPicture = QLabel(self.centralwidget) self.logoPicture.setGeometry(QtCore.QRect(975, 0, 150, 90)) self.logoPicture.setText("") self.logoPicture.setStyleSheet( "background-image: url('images/logo.png')") self.logoPicture.setObjectName("logoPicture") self.title = QLabel(self.centralwidget) self.title.setGeometry(QtCore.QRect(50, 200, 381, 61)) self.title.setStyleSheet("background: transparent; color: #effeff;") font = QtGui.QFont() font.setFamily("Times New Roman") font.setPointSize(40) font.setBold(True) font.setWeight(75) self.title.setFont(font) self.title.setObjectName("title") self.runButton = QPushButton(self.centralwidget) self.runButton.setGeometry(QtCore.QRect(282, 735 - 103, 561, 81)) font = QtGui.QFont() font.setPointSize(20) self.runButton.setFont(font) self.runButton.setObjectName("runButton") self.runButton.setStyleSheet( "QPushButton{background: #914ed4; border-radius: 10px; color: #effeff; border: 3px outset black;} QPushButton:hover{background : #4838e8; border: 3px outset white;};" ) self.runButton.setDefault(True) self.runButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) self.positiveCheckBox = QCheckBox(self.centralwidget) self.positiveCheckBox.setGeometry(QtCore.QRect(860, 530 - 103, 191, 20)) font = QtGui.QFont() font.setPointSize(12) self.positiveCheckBox.setFont(font) self.positiveCheckBox.setChecked(True) self.positiveCheckBox.setObjectName("positiveCheckBox") self.positiveCheckBox.setStyleSheet( "QCheckBox{color:#effeff} QCheckBox:indicator { image: url('images/unchecked.png'); width:20px; height: 150px;} QCheckBox:indicator:checked {image: url('images/checked.png');}" ) self.positiveCheckBox.setCursor( QtGui.QCursor(QtCore.Qt.PointingHandCursor)) self.negativeCheckBox = QCheckBox(self.centralwidget) self.negativeCheckBox.setChecked(True) self.negativeCheckBox.setGeometry(QtCore.QRect(860, 650 - 103, 191, 20)) font = QtGui.QFont() font.setPointSize(12) self.negativeCheckBox.setFont(font) self.negativeCheckBox.setAutoFillBackground(False) self.negativeCheckBox.setChecked(True) self.negativeCheckBox.setObjectName("negativeCheckBox") self.negativeCheckBox.setStyleSheet( "QCheckBox{color:#effeff} QCheckBox:indicator { image: url('images/unchecked.png'); width:20px; height: 150px;} QCheckBox:indicator:checked {image: url('images/checked.png');}" ) self.negativeCheckBox.setCursor( QtGui.QCursor(QtCore.Qt.PointingHandCursor)) self.positiveInput = QTextEdit(self.centralwidget) self.positiveInput.setGeometry(QtCore.QRect(500, 510 - 103, 331, 71)) font = QtGui.QFont() font.setPointSize(10) self.positiveInput.setFont(font) self.positiveInput.setObjectName("positiveInput") self.positiveInput.setStyleSheet( "background: white; border-radius: 10px;") self.positiveInput.setText(",".join(positiveList)) self.negativeInput = QTextEdit(self.centralwidget) self.negativeInput.setGeometry(QtCore.QRect(500, 630 - 103, 331, 71)) font = QtGui.QFont() font.setPointSize(10) self.negativeInput.setFont(font) self.negativeInput.setObjectName("negativeInput") self.negativeInput.setStyleSheet( "background: white; border-radius: 10px") self.negativeInput.setText(",".join(negativeList)) self.sheetInput = QLineEdit(self.centralwidget) self.sheetInput.setGeometry(QtCore.QRect(30, 580 - 103, 171, 31)) font = QtGui.QFont() font.setPointSize(12) self.sheetInput.setFont(font) self.sheetInput.setObjectName("sheetInput") self.sheetInput.setStyleSheet("background: white; border-radius: 10px") self.columnInput = QLineEdit(self.centralwidget) self.columnInput.setGeometry(QtCore.QRect(250, 580 - 103, 171, 31)) font = QtGui.QFont() font.setPointSize(12) self.columnInput.setFont(font) self.columnInput.setText("") self.columnInput.setObjectName("columnInput") self.columnInput.setStyleSheet( "background: white; border-radius: 10px") self.sheetNameLabel = QLabel(self.centralwidget) self.sheetNameLabel.setGeometry(QtCore.QRect(30, 550 - 103, 131, 21)) font = QtGui.QFont() font.setPointSize(14) self.sheetNameLabel.setFont(font) self.sheetNameLabel.setObjectName("sheetNameLabel") self.sheetNameLabel.setStyleSheet("color: #effeff;") self.columnNameLabel = QLabel(self.centralwidget) self.columnNameLabel.setGeometry(QtCore.QRect(250, 550 - 103, 131, 16)) font = QtGui.QFont() font.setPointSize(14) self.columnNameLabel.setFont(font) self.columnNameLabel.setObjectName("columnNameLabel") self.columnNameLabel.setStyleSheet("color: #effeff;") self.positiveWordsLabel = QLabel(self.centralwidget) self.positiveWordsLabel.setGeometry( QtCore.QRect(500, 480 - 103, 601, 21)) font = QtGui.QFont() font.setPointSize(14) self.positiveWordsLabel.setFont(font) self.positiveWordsLabel.setObjectName("positiveWordsLabel") self.positiveWordsLabel.setStyleSheet("color: #effeff;") self.negativeWordsLabel = QLabel(self.centralwidget) self.negativeWordsLabel.setGeometry( QtCore.QRect(500, 600 - 103, 611, 21)) font = QtGui.QFont() font.setPointSize(14) self.negativeWordsLabel.setFont(font) self.negativeWordsLabel.setObjectName("negativeWordsLabel") self.negativeWordsLabel.setStyleSheet("color: #effeff;") self.selectedFileLabel = QLabel(self.centralwidget) self.selectedFileLabel.setGeometry( QtCore.QRect(225, 470 - 103, 270, 25)) font = QtGui.QFont() font.setPointSize(12) self.selectedFileLabel.setFont(font) self.selectedFileLabel.setText("") self.selectedFileLabel.setObjectName("selectedFileLabel") self.selectedFileLabel.setStyleSheet("color: #effeff;") self.searchInput = QTextEdit(self.centralwidget) self.searchInput.setGeometry(QtCore.QRect(500, 580 - 103, 601, 100)) font = QtGui.QFont() font.setPointSize(12) self.searchInput.setFont(font) self.searchInput.setObjectName("sheetInput") self.searchInput.setStyleSheet( "background: white; border-radius: 10px") self.searchInputLabel = QLabel(self.centralwidget) self.searchInputLabel.setGeometry(QtCore.QRect(500, 550 - 103, 611, 21)) font = QtGui.QFont() font.setPointSize(14) self.searchInputLabel.setFont(font) self.searchInputLabel.setObjectName("searchInputLabel") self.searchInputLabel.setStyleSheet("color: #effeff;") self.searchInput.hide() self.searchInputLabel.hide() MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1125, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.stop_words = stopwords.words('english') extended_stop_words = ['from', 're', 'use', 'any', 'also', 'known'] self.stop_words.extend(extended_stop_words) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Risks Identifier")) self.browseButton.setText(_translate("MainWindow", "Browse For File")) self.radioButtonML.setText(_translate("MainWindow", "Machine Learning")) self.radioButtonSearch.setText( _translate("MainWindow", "Normal Search")) self.title.setText(_translate("MainWindow", "Risks Identifier")) self.runButton.setText(_translate("MainWindow", "Run Tool")) self.positiveCheckBox.setText( _translate("MainWindow", "Default Positive Words")) self.negativeCheckBox.setText( _translate("MainWindow", "Default Negative Words")) self.sheetNameLabel.setText(_translate("MainWindow", "Sheet Name:")) self.columnNameLabel.setText(_translate("MainWindow", "Column Name:")) self.progressBarLabel.setText(_translate("MainWindow", "")) self.positiveWordsLabel.setText( _translate( "MainWindow", "Positive words separated by commas (words must exist in documents):" )) self.negativeWordsLabel.setText( _translate( "MainWindow", "Negative words separated by commas (words must exist in documents):" )) self.searchInputLabel.setText( _translate("MainWindow", "Words to search for seperated by commas:"))
class MainWindowUI(object): title = "Synspy Launcher" def __init__(self, MainWin): super(MainWindow).__init__() # Main Window MainWin.setObjectName("MainWindow") MainWin.setWindowTitle( MainWin.tr("%s %s" % (self.title, synspy_version))) MainWin.resize(800, 600) self.centralWidget = QWidget(MainWin) self.centralWidget.setObjectName("centralWidget") MainWin.setCentralWidget(self.centralWidget) self.verticalLayout = QVBoxLayout(self.centralWidget) self.verticalLayout.setContentsMargins(11, 11, 11, 11) self.verticalLayout.setSpacing(6) self.verticalLayout.setObjectName("verticalLayout") # Splitter for Worklist/Log self.splitter = QSplitter(Qt.Vertical) # Table View (Work list) self.workList = TableWidget(self.centralWidget) self.workList.setObjectName("tableWidget") self.workList.setStyleSheet(""" QTableWidget { border: 2px solid grey; border-radius: 5px; } """) self.workList.setEditTriggers( QAbstractItemView.NoEditTriggers ) # use NoEditTriggers to disable editing self.workList.setAlternatingRowColors(True) self.workList.setSelectionBehavior(QAbstractItemView.SelectRows) self.workList.setSelectionMode(QAbstractItemView.SingleSelection) self.workList.verticalHeader().setDefaultSectionSize( 18) # tighten up the row size self.workList.horizontalHeader().setStretchLastSection(True) # self.workList.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.workList.setSortingEnabled(True) # allow sorting self.workList.setContextMenuPolicy(Qt.ActionsContextMenu) self.workList.doubleClicked.connect(MainWin.on_actionLaunch_triggered) self.splitter.addWidget(self.workList) # Log Widget self.logTextBrowser = QPlainTextEditLogger(self.centralWidget) self.logTextBrowser.widget.setObjectName("logTextBrowser") self.logTextBrowser.widget.setStyleSheet(""" QPlainTextEdit { border: 2px solid grey; border-radius: 5px; background-color: lightgray; } """) self.splitter.addWidget(self.logTextBrowser.widget) # add splitter self.splitter.setSizes([600, 100]) self.verticalLayout.addWidget(self.splitter) # Actions # Launch self.actionLaunch = QAction(MainWin) self.actionLaunch.setObjectName("actionLaunch") self.actionLaunch.setText(MainWin.tr("Launch Analysis")) self.actionLaunch.setToolTip( MainWin.tr("Launch the synspy-viewer process")) self.actionLaunch.setShortcut(MainWin.tr("Ctrl+L")) # Refresh self.actionRefresh = QAction(MainWin) self.actionRefresh.setObjectName("actionRefresh") self.actionRefresh.setText(MainWin.tr("Refresh Work List")) self.actionRefresh.setToolTip(MainWin.tr("Refresh the work list")) self.actionRefresh.setShortcut(MainWin.tr("Ctrl+R")) # Options self.actionOptions = QAction(MainWin) self.actionOptions.setObjectName("actionOptions") self.actionOptions.setText(MainWin.tr("Options")) self.actionOptions.setToolTip(MainWin.tr("Configuration Options")) self.actionOptions.setShortcut(MainWin.tr("Ctrl+P")) # Login self.actionLogin = QAction(MainWin) self.actionLogin.setObjectName("actionLogin") self.actionLogin.setText(MainWin.tr("Login")) self.actionLogin.setToolTip(MainWin.tr("Login to the server")) self.actionLogin.setShortcut(MainWin.tr("Ctrl+G")) # Logout self.actionLogout = QAction(MainWin) self.actionLogout.setObjectName("actionLogout") self.actionLogout.setText(MainWin.tr("Logout")) self.actionLogout.setToolTip(MainWin.tr("Logout of the server")) self.actionLogout.setShortcut(MainWin.tr("Ctrl+O")) # Exit self.actionExit = QAction(MainWin) self.actionExit.setObjectName("actionExit") self.actionExit.setText(MainWin.tr("Exit")) self.actionExit.setToolTip(MainWin.tr("Exit the application")) self.actionExit.setShortcut(MainWin.tr("Ctrl+Z")) # Help self.actionHelp = QAction(MainWin) self.actionHelp.setObjectName("actionHelp") self.actionHelp.setText(MainWin.tr("Help")) self.actionHelp.setToolTip(MainWin.tr("Help")) self.actionHelp.setShortcut(MainWin.tr("Ctrl+H")) # Mark Incomplete self.markIncompleteAction = QAction('Mark Incomplete', self.workList) self.markIncompleteAction.triggered.connect(MainWin.markIncomplete) # Tool Bar self.mainToolBar = QToolBar(MainWin) self.mainToolBar.setObjectName("mainToolBar") self.mainToolBar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) MainWin.addToolBar(Qt.TopToolBarArea, self.mainToolBar) # Launch self.mainToolBar.addAction(self.actionLaunch) self.actionLaunch.setIcon(qApp.style().standardIcon( QStyle.SP_MediaPlay)) # Reload self.mainToolBar.addAction(self.actionRefresh) self.actionRefresh.setIcon(qApp.style().standardIcon( QStyle.SP_BrowserReload)) # Options self.mainToolBar.addAction(self.actionOptions) self.actionOptions.setIcon(qApp.style().standardIcon( QStyle.SP_FileDialogDetailedView)) # this spacer right justifies everything that comes after it spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.mainToolBar.addWidget(spacer) # Login self.mainToolBar.addAction(self.actionLogin) self.actionLogin.setIcon(qApp.style().standardIcon( QStyle.SP_DialogApplyButton)) # Logout self.mainToolBar.addAction(self.actionLogout) self.actionLogout.setIcon(qApp.style().standardIcon( QStyle.SP_DialogOkButton)) # Help #self.mainToolBar.addAction(self.actionHelp) self.actionHelp.setIcon(qApp.style().standardIcon( QStyle.SP_MessageBoxQuestion)) # Exit self.mainToolBar.addAction(self.actionExit) self.actionExit.setIcon(qApp.style().standardIcon( QStyle.SP_DialogCancelButton)) # Status Bar self.statusBar = QStatusBar(MainWin) self.statusBar.setToolTip("") self.statusBar.setStatusTip("") self.statusBar.setObjectName("statusBar") MainWin.setStatusBar(self.statusBar) # finalize UI setup QMetaObject.connectSlotsByName(MainWin)
class AppWindow(QMainWindow): onRestart = pyqtSignal(name='onRestart') onSystemUIElementCreated = pyqtSignal(str, QWidget, name='onUIElementCreated') def __init__(self, dwarf_args, flags=None): super(AppWindow, self).__init__(flags) self.dwarf_args = dwarf_args self.session_manager = SessionManager(self) self.session_manager.sessionCreated.connect(self.session_created) self.session_manager.sessionStopped.connect(self.session_stopped) self.session_manager.sessionClosed.connect(self.session_closed) self._tab_order = [ 'memory', 'modules', 'ranges', 'jvm-inspector', 'jvm-debugger' ] self.menu = self.menuBar() self._is_newer_dwarf = False self.view_menu = None # dockwidgets self.watchers_dwidget = None self.hooks_dwiget = None self.bookmarks_dwiget = None self.registers_dock = None self.console_dock = None self.backtrace_dock = None self.threads_dock = None # panels self.asm_panel = None self.console_panel = None self.context_panel = None self.backtrace_panel = None self.contexts_list_panel = None self.data_panel = None self.emulator_panel = None self.ftrace_panel = None self.hooks_panel = None self.bookmarks_panel = None self.smali_panel = None self.java_inspector_panel = None self.java_explorer_panel = None self.java_trace_panel = None self.memory_panel = None self.modules_panel = None self.ranges_panel = None self.search_panel = None self.watchers_panel = None self.welcome_window = None self._ui_elems = [] self.setWindowTitle( 'Dwarf - A debugger for reverse engineers, crackers and security analyst' ) # load external assets _app = QApplication.instance() self.remove_tmp_dir() # themes self.prefs = Prefs() self.set_theme(self.prefs.get('dwarf_ui_theme', 'black')) # load font if os.path.exists(utils.resource_path('assets/Anton.ttf')): QFontDatabase.addApplicationFont( utils.resource_path('assets/Anton.ttf')) if os.path.exists(utils.resource_path('assets/OpenSans-Regular.ttf')): QFontDatabase.addApplicationFont( utils.resource_path('assets/OpenSans-Regular.ttf')) font = QFont("OpenSans", 9, QFont.Normal) # TODO: add settingsdlg font_size = self.prefs.get('dwarf_ui_font_size', 12) font.setPixelSize(font_size) _app.setFont(font) if os.path.exists(utils.resource_path('assets/OpenSans-Bold.ttf')): QFontDatabase.addApplicationFont( utils.resource_path('assets/OpenSans-Bold.ttf')) # mainwindow statusbar self.progressbar = QProgressBar() self.progressbar.setRange(0, 0) self.progressbar.setVisible(False) self.progressbar.setFixedHeight(15) self.progressbar.setFixedWidth(100) self.progressbar.setTextVisible(False) self.progressbar.setValue(30) self.statusbar = QStatusBar(self) self.statusbar.setAutoFillBackground(False) self.statusbar.addPermanentWidget(self.progressbar) self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) self.main_tabs = QTabWidget(self) self.main_tabs.setMovable(False) self.main_tabs.setTabsClosable(True) self.main_tabs.setAutoFillBackground(True) self.main_tabs.tabCloseRequested.connect(self._on_close_tab) self.setCentralWidget(self.main_tabs) # pluginmanager self.plugin_manager = PluginManager(self) self.plugin_manager.reload_plugins() if self.dwarf_args.package is None: self.welcome_window = WelcomeDialog(self) self.welcome_window.setModal(True) self.welcome_window.onIsNewerVersion.connect( self._enable_update_menu) self.welcome_window.onUpdateComplete.connect( self._on_dwarf_updated) self.welcome_window.setWindowTitle( 'Welcome to Dwarf - A debugger for reverse engineers, crackers and security analyst' ) self.welcome_window.onSessionSelected.connect(self._start_session) # wait for welcome screen self.hide() self.welcome_window.show() else: if dwarf_args.package is not None: if dwarf_args.type is None: # no device given check if package is local path if os.path.exists(dwarf_args.package): print('* Starting new LocalSession') self._start_session('local') else: print('use -t to set sessiontype') exit(0) else: print('* Starting new Session') self._start_session(dwarf_args.type) def _setup_main_menu(self): self.menu = self.menuBar() dwarf_menu = QMenu('Dwarf', self) theme = QMenu('Theme', dwarf_menu) theme.addAction('Black') theme.addAction('Dark') theme.addAction('Light') theme.triggered.connect(self._set_theme) dwarf_menu.addMenu(theme) dwarf_menu.addSeparator() if self._is_newer_dwarf: dwarf_menu.addAction('Update', self._update_dwarf) dwarf_menu.addAction('Close', self.session_manager.session.stop) self.menu.addMenu(dwarf_menu) session = self.session_manager.session if session is not None: session_menu = session.main_menu if isinstance(session_menu, list): for menu in session_menu: self.menu.addMenu(menu) else: self.menu.addMenu(session_menu) # plugins if self.plugin_manager.plugins: self.plugin_menu = QMenu('Plugins', self) for plugin in self.plugin_manager.plugins: plugin_instance = self.plugin_manager.plugins[plugin] plugin_sub_menu = QMenu(plugin_instance.name, self.plugin_menu) try: actions = plugin_instance.__get_top_menu_actions__() for action in actions: plugin_sub_menu.addAction(action) except: pass if not plugin_sub_menu.isEmpty(): plugin_sub_menu.addSeparator() plugin_sub_menu.addAction( 'About', lambda: self._show_plugin_about(plugin)) self.plugin_menu.addMenu(plugin_sub_menu) if not self.plugin_menu.isEmpty(): self.menu.addMenu(self.plugin_menu) self.view_menu = QMenu('View', self) subview_menu = QMenu('Subview', self.view_menu) subview_menu.addAction('Search', lambda: self.show_main_tab('search'), shortcut=QKeySequence(Qt.CTRL + Qt.Key_F3)) subview_menu.addAction('Emulator', lambda: self.show_main_tab('emulator'), shortcut=QKeySequence(Qt.CTRL + Qt.Key_F2)) subview_menu.addAction('Disassembly', lambda: self.show_main_tab('disassembly'), shortcut=QKeySequence(Qt.CTRL + Qt.Key_F5)) self.view_menu.addMenu(subview_menu) self.view_menu.addSeparator() self.menu.addMenu(self.view_menu) if self.dwarf_args.debug_script: debug_menu = QMenu('Debug', self) debug_menu.addAction('Reload core', self._menu_reload_core) debug_menu.addAction('Debug dwarf js core', self._menu_debug_dwarf_js) self.menu.addMenu(debug_menu) about_menu = QMenu('About', self) about_menu.addAction('Dwarf on GitHub', self._menu_github) about_menu.addAction('Documention', self._menu_documentation) about_menu.addAction('Api', self._menu_api) about_menu.addAction('Slack', self._menu_slack) about_menu.addSeparator() about_menu.addAction('Info', self._show_about_dlg) self.menu.addMenu(about_menu) def _show_plugin_about(self, plugin): plugin = self.plugin_manager.plugins[plugin] if plugin: info = plugin.__get_plugin_info__() version = utils.safe_read_map(info, 'version', '') description = utils.safe_read_map(info, 'description', '') author = utils.safe_read_map(info, 'author', '') homepage = utils.safe_read_map(info, 'homepage', '') license_ = utils.safe_read_map(info, 'license', '') utils.show_message_box( 'Name: {0}\nVersion: {1}\nDescription: {2}\nAuthor: {3}\nHomepage: {4}\nLicense: {5}' .format(plugin.name, version, description, author, homepage, license_)) def _enable_update_menu(self): self._is_newer_dwarf = True def _update_dwarf(self): if self.welcome_window: self.welcome_window._update_dwarf() def _on_close_tab(self, index): tab_text = self.main_tabs.tabText(index) if tab_text: if tab_text.lower() in self.session_manager.session.non_closable: return try: self._ui_elems.remove(tab_text.lower()) except ValueError: # recheck ValueError: list.remove(x): x not in list pass self.main_tabs.removeTab(index) def _handle_tab_change(self): for index in range(self.main_tabs.count()): tab_name = self.main_tabs.tabText(index).lower().replace(' ', '-') if tab_name in self.session_manager.session.non_closable: self.main_tabs.tabBar().setTabButton(index, QTabBar.RightSide, None) if tab_name in self._tab_order: should_index = self._tab_order.index(tab_name) if index != should_index: self.main_tabs.tabBar().moveTab(index, should_index) def _on_dwarf_updated(self): self.onRestart.emit() def remove_tmp_dir(self): if os.path.exists('.tmp'): shutil.rmtree('.tmp', ignore_errors=True) def _set_theme(self, qaction): if qaction: self.set_theme(qaction.text()) def _menu_reload_core(self): self.dwarf.load_script() def _menu_debug_dwarf_js(self): you_know_what_to_do = json.loads( self.dwarf._script.exports.debugdwarfjs()) return you_know_what_to_do def show_main_tab(self, name): # elem doesnt exists? create it if name not in self._ui_elems: self._create_ui_elem(name) index = 0 name = name.join(name.split()).lower() if name == 'memory': index = self.main_tabs.indexOf(self.memory_panel) elif name == 'ranges': index = self.main_tabs.indexOf(self.ranges_panel) elif name == 'search': index = self.main_tabs.indexOf(self.search_panel) elif name == 'modules': index = self.main_tabs.indexOf(self.modules_panel) elif name == 'disassembly': index = self.main_tabs.indexOf(self.asm_panel) elif name == 'data': index = self.main_tabs.indexOf(self.data_panel) elif name == 'emulator': index = self.main_tabs.indexOf(self.emulator_panel) elif name == 'java-trace': index = self.main_tabs.indexOf(self.java_trace_panel) elif name == 'jvm-inspector': index = self.main_tabs.indexOf(self.java_inspector_panel) elif name == 'jvm-debugger': index = self.main_tabs.indexOf(self.java_explorer_panel) elif name == 'smali': index = self.main_tabs.indexOf(self.smali_panel) self.main_tabs.setCurrentIndex(index) def jump_to_address(self, ptr, show_panel=True): if self.memory_panel is not None: if show_panel: self.show_main_tab('memory') self.memory_panel.read_memory(ptr) @pyqtSlot(name='mainMenuGitHub') def _menu_github(self): QDesktopServices.openUrl(QUrl('https://github.com/iGio90/Dwarf')) @pyqtSlot(name='mainMenuDocumentation') def _menu_api(self): QDesktopServices.openUrl(QUrl('https://igio90.github.io/Dwarf/')) @pyqtSlot(name='mainMenuApi') def _menu_documentation(self): QDesktopServices.openUrl(QUrl('https://igio90.github.io/Dwarf/api')) @pyqtSlot(name='mainMenuSlack') def _menu_slack(self): QDesktopServices.openUrl( QUrl('https://join.slack.com/t/resecret/shared_invite' '/enQtMzc1NTg4MzE3NjA1LTlkNzYxNTIwYTc2ZTYyOWY1MT' 'Q1NzBiN2ZhYjQwYmY0ZmRhODQ0NDE3NmRmZjFiMmE1MDYwN' 'WJlNDVjZDcwNGE')) def _show_about_dlg(self): about_dlg = AboutDialog(self) about_dlg.show() def _create_ui_elem(self, elem): if not isinstance(elem, str): return if elem not in self._ui_elems: self._ui_elems.append(elem) elem_wiget = None if elem == 'watchers': from ui.panel_watchers import WatchersPanel self.watchers_dwidget = QDockWidget('Watchers', self) self.watchers_panel = WatchersPanel(self) # dont respond to dblclick mem cant be shown # self.watchers_panel.onItemDoubleClicked.connect( # self._on_watcher_clicked) self.watchers_panel.onItemRemoved.connect( self._on_watcher_removeditem) self.watchers_panel.onItemAdded.connect(self._on_watcher_added) self.watchers_dwidget.setWidget(self.watchers_panel) self.watchers_dwidget.setObjectName('WatchersPanel') self.addDockWidget(Qt.LeftDockWidgetArea, self.watchers_dwidget) self.view_menu.addAction(self.watchers_dwidget.toggleViewAction()) elem_wiget = self.watchers_panel elif elem == 'hooks': from ui.panel_hooks import HooksPanel self.hooks_dwiget = QDockWidget('Breakpoints', self) self.hooks_panel = HooksPanel(self) self.hooks_panel.onShowMemoryRequest.connect( self._on_watcher_clicked) self.hooks_panel.onHookRemoved.connect(self._on_hook_removed) self.hooks_dwiget.setWidget(self.hooks_panel) self.hooks_dwiget.setObjectName('HooksPanel') self.addDockWidget(Qt.LeftDockWidgetArea, self.hooks_dwiget) self.view_menu.addAction(self.hooks_dwiget.toggleViewAction()) elem_wiget = self.hooks_panel elif elem == 'bookmarks': from ui.panel_bookmarks import BookmarksPanel self.bookmarks_dwiget = QDockWidget('Boomarks', self) self.bookmarks_panel = BookmarksPanel(self) self.bookmarks_panel.onShowMemoryRequest.connect( self._on_watcher_clicked) self.bookmarks_dwiget.setWidget(self.bookmarks_panel) self.bookmarks_dwiget.setObjectName('BookmarksPanel') self.addDockWidget(Qt.LeftDockWidgetArea, self.bookmarks_dwiget) self.view_menu.addAction(self.bookmarks_dwiget.toggleViewAction()) elem_wiget = self.bookmarks_panel elif elem == 'registers': from ui.panel_context import ContextPanel self.registers_dock = QDockWidget('Context', self) self.context_panel = ContextPanel(self) self.registers_dock.setWidget(self.context_panel) self.registers_dock.setObjectName('ContextsPanel') self.addDockWidget(Qt.RightDockWidgetArea, self.registers_dock) self.view_menu.addAction(self.registers_dock.toggleViewAction()) elem_wiget = self.context_panel elif elem == 'memory': from ui.panel_memory import MemoryPanel self.memory_panel = MemoryPanel(self) self.memory_panel.onShowDisassembly.connect( self._disassemble_range) self.memory_panel.dataChanged.connect(self._on_memory_modified) self.memory_panel.statusChanged.connect(self.set_status_text) self.main_tabs.addTab(self.memory_panel, 'Memory') elem_wiget = self.memory_panel elif elem == 'jvm-debugger': from ui.panel_java_explorer import JavaExplorerPanel self.java_explorer_panel = JavaExplorerPanel(self) self.main_tabs.addTab(self.java_explorer_panel, 'JVM debugger') self.main_tabs.tabBar().moveTab( self.main_tabs.indexOf(self.java_explorer_panel), 1) elem_wiget = self.java_explorer_panel elif elem == 'jvm-inspector': from ui.panel_java_inspector import JavaInspector self.java_inspector_panel = JavaInspector(self) self.main_tabs.addTab(self.java_inspector_panel, 'JVM inspector') elem_wiget = self.java_inspector_panel elif elem == 'console': from ui.panel_console import ConsolePanel self.console_dock = QDockWidget('Console', self) self.console_panel = ConsolePanel(self) if self.dwarf_args.script and len( self.dwarf_args.script) > 0 and os.path.exists( self.dwarf_args.script): with open(self.dwarf_args.script, 'r') as f: self.console_panel.get_js_console( ).function_content = f.read() self.dwarf.onLogToConsole.connect(self._log_js_output) self.dwarf.onLogEvent.connect(self._log_event) self.console_dock.setWidget(self.console_panel) self.console_dock.setObjectName('ConsolePanel') self.addDockWidget(Qt.BottomDockWidgetArea, self.console_dock) self.view_menu.addAction(self.console_dock.toggleViewAction()) elem_wiget = self.console_panel elif elem == 'backtrace': from ui.panel_backtrace import BacktracePanel self.backtrace_dock = QDockWidget('Backtrace', self) self.backtrace_panel = BacktracePanel(self) self.backtrace_dock.setWidget(self.backtrace_panel) self.backtrace_dock.setObjectName('BacktracePanel') self.backtrace_panel.onShowMemoryRequest.connect( self._on_watcher_clicked) self.addDockWidget(Qt.RightDockWidgetArea, self.backtrace_dock) self.view_menu.addAction(self.backtrace_dock.toggleViewAction()) elem_wiget = self.backtrace_panel elif elem == 'threads': from ui.panel_contexts_list import ContextsListPanel self.threads_dock = QDockWidget('Threads', self) self.contexts_list_panel = ContextsListPanel(self) self.dwarf.onThreadResumed.connect( self.contexts_list_panel.resume_tid) self.contexts_list_panel.onItemDoubleClicked.connect( self._manually_apply_context) self.threads_dock.setWidget(self.contexts_list_panel) self.threads_dock.setObjectName('ThreadPanel') self.addDockWidget(Qt.RightDockWidgetArea, self.threads_dock) self.view_menu.addAction(self.threads_dock.toggleViewAction()) elem_wiget = self.contexts_list_panel elif elem == 'modules': from ui.panel_modules import ModulesPanel self.modules_panel = ModulesPanel(self) self.modules_panel.onModuleSelected.connect( self._on_module_dblclicked) self.modules_panel.onModuleFuncSelected.connect( self._on_modulefunc_dblclicked) self.modules_panel.onAddHook.connect(self._on_addmodule_hook) self.modules_panel.onDumpBinary.connect(self._on_dumpmodule) self.main_tabs.addTab(self.modules_panel, 'Modules') elem_wiget = self.modules_panel elif elem == 'ranges': from ui.panel_ranges import RangesPanel self.ranges_panel = RangesPanel(self) self.ranges_panel.onItemDoubleClicked.connect( self._range_dblclicked) self.ranges_panel.onDumpBinary.connect(self._on_dumpmodule) # connect to watcherpanel func self.ranges_panel.onAddWatcher.connect( self.watchers_panel.do_addwatcher_dlg) self.main_tabs.addTab(self.ranges_panel, 'Ranges') elem_wiget = self.ranges_panel elif elem == 'search': from ui.panel_search import SearchPanel self.search_panel = SearchPanel(self) self.search_panel.onShowMemoryRequest.connect( self._on_watcher_clicked) self.main_tabs.addTab(self.search_panel, 'Search') elem_wiget = self.search_panel elif elem == 'data': from ui.panel_data import DataPanel self.data_panel = DataPanel(self) self.main_tabs.addTab(self.data_panel, 'Data') elem_wiget = self.data_panel elif elem == 'disassembly': from ui.widgets.disasm_view import DisassemblyPanel self.asm_panel = DisassemblyPanel(self) self.asm_panel.disasm_view.onShowMemoryRequest.connect( self._on_disasm_showmem) self.main_tabs.addTab(self.asm_panel, 'Disassembly') elem_wiget = self.asm_panel elif elem == 'emulator': from ui.panel_emulator import EmulatorPanel self.emulator_panel = EmulatorPanel(self) self.main_tabs.addTab(self.emulator_panel, 'Emulator') elem_wiget = self.emulator_panel elif elem == 'java-trace': from ui.panel_java_trace import JavaTracePanel self.java_trace_panel = JavaTracePanel(self) self.main_tabs.addTab(self.java_trace_panel, 'JVM tracer') elem_wiget = self.java_trace_panel elif elem == 'smali': from ui.panel_smali import SmaliPanel self.smali_panel = SmaliPanel() self.main_tabs.addTab(self.smali_panel, 'Smali') elem_wiget = self.smali_panel else: print('no handler for elem: ' + elem) # make tabs unclosable and sort self._handle_tab_change() if elem_wiget is not None: self.onSystemUIElementCreated.emit(elem, elem_wiget) # TODO: remove add @2x for item in self.findChildren(QDockWidget): if item: if 'darwin' in sys.platform: item.setStyleSheet( 'QDockWidget::title { padding-left:-30px; }') def set_theme(self, theme): if theme: theme = theme.replace(os.pardir, '').replace('.', '') theme = theme.join(theme.split()).lower() theme_style = 'assets/' + theme + '_style.qss' if not os.path.exists(utils.resource_path(theme_style)): return self.prefs.put('dwarf_ui_theme', theme) try: _app = QApplication.instance() with open(theme_style) as stylesheet: _app.setStyleSheet(_app.styleSheet() + '\n' + stylesheet.read()) except Exception as e: pass # err = self.dwarf.spawn(dwarf_args.package, dwarf_args.script) def set_status_text(self, txt): self.statusbar.showMessage(txt) # ************************************************************************ # **************************** Properties ******************************** # ************************************************************************ @property def disassembly(self): return self.asm_panel @property def backtrace(self): return self.backtrace_panel @property def console(self): return self.console_panel @property def context(self): return self.context_panel @property def threads(self): return self.contexts_list_panel @property def emulator(self): return self.emulator_panel @property def ftrace(self): return self.ftrace_panel @property def hooks(self): return self.hooks_panel @property def java_inspector(self): return self.java_inspector_panel @property def java_explorer(self): return self.java_explorer_panel @property def memory(self): return self.memory_panel @property def modules(self): return self.memory_panel @property def ranges(self): return self.ranges_panel @property def watchers(self): return self.watchers_panel @property def dwarf(self): if self.session_manager.session is not None: return self.session_manager.session.dwarf else: return None # ************************************************************************ # **************************** Handlers ********************************** # ************************************************************************ # session handlers def _start_session(self, session_type, session_data=None): if self.welcome_window is not None: self.welcome_window.close() self.session_manager.create_session(session_type, session_data=session_data) def _restore_session(self, session_data): if 'session' in session_data: session_type = session_data['session'] self.dwarf_args.package = session_data['package'] self.dwarf_args.spawn = True self._start_session(session_type, session_data=session_data) def session_created(self): # session init done create ui for it session = self.session_manager.session self._setup_main_menu() for ui_elem in session.session_ui_sections: ui_elem = ui_elem.join(ui_elem.split()).lower() self._create_ui_elem(ui_elem) self.dwarf.onProcessAttached.connect(self._on_attached) self.dwarf.onProcessDetached.connect(self._on_detached) self.dwarf.onScriptLoaded.connect(self._on_script_loaded) # hookup self.dwarf.onSetRanges.connect(self._on_setranges) self.dwarf.onSetModules.connect(self._on_setmodules) self.dwarf.onAddNativeHook.connect(self._on_add_hook) self.dwarf.onApplyContext.connect(self._apply_context) self.dwarf.onThreadResumed.connect(self.on_tid_resumed) self.dwarf.onSetData.connect(self._on_set_data) self.session_manager.start_session(self.dwarf_args) q_settings = QSettings("dwarf_window_pos.ini", QSettings.IniFormat) ui_state = q_settings.value('dwarf_ui_state') if ui_state: self.restoreGeometry(ui_state) window_state = q_settings.value('dwarf_ui_window', self.saveState()) if window_state: self.restoreState(window_state) self.showMaximized() def session_stopped(self): self.remove_tmp_dir() self.menu.clear() self.main_tabs.clear() # actually we need to kill this. needs a refactor if self.java_trace_panel is not None: self.java_trace_panel = None for elem in self._ui_elems: if elem == 'watchers': self.watchers_panel.clear_list() self.watchers_panel.close() self.watchers_panel = None self.removeDockWidget(self.watchers_dwidget) self.watchers_dwidget = None elif elem == 'hooks': self.hooks_panel.close() self.hooks_panel = None self.removeDockWidget(self.hooks_dwiget) self.hooks_dwiget = None elif elem == 'registers': self.context_panel.close() self.context_panel = None self.removeDockWidget(self.registers_dock) self.registers_dock = None elif elem == 'memory': self.memory_panel.close() self.memory_panel = None self.main_tabs.removeTab(0) # self.main_tabs elif elem == 'jvm-debugger': self.java_explorer_panel.close() self.java_explorer_panel = None self.removeDockWidget(self.watchers_dwidget) elif elem == 'console': self.console_panel.close() self.console_panel = None self.removeDockWidget(self.console_dock) self.console_dock = None elif elem == 'backtrace': self.backtrace_panel.close() self.backtrace_panel = None self.removeDockWidget(self.backtrace_dock) elif elem == 'threads': self.contexts_list_panel.close() self.contexts_list_panel = None self.removeDockWidget(self.threads_dock) self.threads_dock = None elif elem == 'bookmarks': self.bookmarks_panel.close() self.bookmarks_panel = None self.removeDockWidget(self.bookmarks_dwiget) self.bookmarks_dwiget = None def session_closed(self): self._ui_elems = [] self.hide() if self.welcome_window is not None: self.welcome_window.exec() # close if it was a commandline session if self.welcome_window is None: if self.dwarf_args.package: self.close() # ui handler def closeEvent(self, event): """ Window closed save stuff or whatever at exit detaches dwarf """ # save windowstuff q_settings = QSettings("dwarf_window_pos.ini", QSettings.IniFormat) q_settings.setValue('dwarf_ui_state', self.saveGeometry()) q_settings.setValue('dwarf_ui_window', self.saveState()) if self.dwarf: try: self.dwarf.detach() except: pass super().closeEvent(event) def _on_watcher_clicked(self, ptr): """ Address in Watcher/Hookpanel was clicked show Memory """ if '.' in ptr: # java_hook file_path = ptr.replace('.', os.path.sep) if os.path.exists('.tmp/smali/' + file_path + '.smali'): if self.smali_panel is None: self._create_ui_elem('smali') self.smali_panel.set_file('.tmp/smali/' + file_path + '.smali') self.show_main_tab('smali') else: self.memory_panel.read_memory(ptr=ptr) self.show_main_tab('memory') def _on_disasm_showmem(self, ptr, length): """ Address in Disasm was clicked adds temphighlight for bytes from current instruction """ self.memory_panel.read_memory(ptr) self.memory_panel.add_highlight( HighLight('attention', utils.parse_ptr(ptr), length)) self.show_main_tab('memory') def _on_watcher_added(self, ptr): """ Watcher Entry was added """ try: # set highlight self.memory_panel.add_highlight( HighLight('watcher', ptr, self.dwarf.pointer_size)) except HighlightExistsError: pass def _on_watcher_removeditem(self, ptr): """ Watcher Entry was removed remove highlight too """ self.memory_panel.remove_highlight(ptr) def _on_module_dblclicked(self, data): """ Module in ModulePanel was doubleclicked """ addr, size = data addr = utils.parse_ptr(addr) size = int(size, 10) self.memory_panel.read_memory(ptr=addr, length=size) self.show_main_tab('Memory') def _on_modulefunc_dblclicked(self, ptr): """ Function in ModulePanel was doubleclicked """ ptr = utils.parse_ptr(ptr) self.memory_panel.read_memory(ptr=ptr) self.show_main_tab('Memory') def _on_dumpmodule(self, data): """ DumpBinary MenuItem in ModulePanel was selected """ ptr, size = data ptr = utils.parse_ptr(ptr) size = int(size, 10) self.dwarf.dump_memory(ptr=ptr, length=size) def _disassemble_range(self, mem_range): """ Disassemble MenuItem in Hexview was selected """ if mem_range: if self.asm_panel is None: self._create_ui_elem('disassembly') self.asm_panel.disassemble(mem_range) self.show_main_tab('disassembly') def _range_dblclicked(self, ptr): """ Range in RangesPanel was doubleclicked """ ptr = utils.parse_ptr(ptr) self.memory_panel.read_memory(ptr=ptr) self.show_main_tab('Memory') # dwarf handlers def _log_js_output(self, output): if self.console_panel is not None: self.console_panel.get_js_console().log(output) def _log_event(self, output): if self.console_panel is not None: self.console_panel.get_events_console().log(output) def _on_setranges(self, ranges): """ Dwarf wants to set Ranges only hooked up to switch tab or create ui its connected in panel after creation """ if self.ranges_panel is None: self.show_main_tab('ranges') # forward only now to panel it connects after creation self.ranges_panel.set_ranges(ranges) def _on_setmodules(self, modules): """ Dwarf wants to set Modules only hooked up to switch tab or create ui its connected in panel after creation """ if self.modules_panel is None: self._create_ui_elem('modules') self.modules_panel.set_modules(modules) if self.modules_panel is not None: self.show_main_tab('modules') def _manually_apply_context(self, context): """ perform additional operation if the context has been manually applied from the context list """ self._apply_context(context, manual=True) def _apply_context(self, context, manual=False): # update current context tid # this should be on top as any further api from js needs to be executed on that thread is_initial_hook = context['reason'] >= 0 if manual or (self.dwarf.context_tid and not is_initial_hook): self.dwarf.context_tid = context['tid'] if 'context' in context: if not manual: self.threads.add_context(context) is_java = context['is_java'] if is_java: if self.java_explorer_panel is None: self._create_ui_elem('jvm-debugger') self.context_panel.set_context(context['ptr'], 1, context['context']) self.java_explorer_panel._set_handle_arg(-1) self.show_main_tab('jvm-debugger') else: self.context_panel.set_context(context['ptr'], 0, context['context']) if 'pc' in context['context']: if not 'disassembly' in self._ui_elems or manual: from lib.range import Range _range = Range(Range.SOURCE_TARGET, self.dwarf) _range.init_with_address( int(context['context']['pc']['value'], 16)) self._disassemble_range(_range) if 'backtrace' in context: self.backtrace_panel.set_backtrace(context['backtrace']) def _on_add_hook(self, hook): try: # set highlight ptr = hook.get_ptr() ptr = utils.parse_ptr(ptr) self.memory_panel.add_highlight( HighLight('hook', ptr, self.dwarf.pointer_size)) except HighlightExistsError: pass def _on_hook_removed(self, ptr): ptr = utils.parse_ptr(ptr) self.memory_panel.remove_highlight(ptr) def _on_addmodule_hook(self, data): ptr, name = data self.dwarf.hook_native(ptr, own_input=name) def on_tid_resumed(self, tid): if self.dwarf: if self.dwarf.context_tid == tid: # clear backtrace if 'backtrace' in self._ui_elems: if self.backtrace_panel is not None: self.backtrace_panel.clear() # remove thread if 'threads' in self._ui_elems: if self.contexts_list_panel is not None: self.contexts_list_panel.resume_tid(tid) # clear registers if 'registers' in self._ui_elems: if self.context_panel is not None: self.context_panel.clear() # clear jvm explorer if 'jvm-debugger' in self._ui_elems: if self.java_explorer_panel is not None: self.java_explorer_panel.clear_panel() # invalidate dwarf context tid self.dwarf.context_tid = 0 def _on_set_data(self, data): if not isinstance(data, list): return if self.data_panel is None: self.show_main_tab('data') if self.data_panel is not None: self.data_panel.append_data(data[0], data[1], data[2]) def show_progress(self, text): self.progressbar.setVisible(True) self.set_status_text(text) def hide_progress(self): self.progressbar.setVisible(False) self.set_status_text('') def _on_attached(self, data): self.setWindowTitle('Dwarf - Attached to %s (%s)' % (data[1], data[0])) def _on_detached(self, data): reason = data[1] if reason == 'application-requested': self.session_manager.session.stop() return 0 ret = QDialogDetached.show_dialog(self.dwarf, data[0], data[1], data[2]) if ret == 0: self.dwarf.restart_proc() elif ret == 1: self.session_manager.session.stop() return 0 def _on_script_loaded(self): # restore the loaded session if any self.session_manager.restore_session() def _on_memory_modified(self, pos, length): data_pos = self.memory_panel.base + pos data = self.memory_panel.data[pos:pos + length] data = [data[0]] # todo: strange js part if self.dwarf.dwarf_api('writeBytes', [data_pos, data]): pass else: utils.show_message_box('Failed to write Memory') def on_add_bookmark(self, ptr): """ provide ptr as int """ if self.bookmarks_panel is not None: self.bookmarks_panel._create_bookmark(ptr=hex(ptr))
class StringsEditorMainWindow(QMainWindow): def __init__(self): super().__init__() self.setup_ui() self.stringfile = None self.reset_in_process = False path = get_default_path() if path is None: self.default_path = "" else: self.default_path = path self.strings_list.currentItemChanged.connect(self.action_listwidget_change_item) self.button_set_message.pressed.connect(self.action_button_set_message) self.button_add_message.pressed.connect(self.action_button_add_message) self.button_remove_message.pressed.connect(self.action_button_delete_message) def reset(self): self.reset_in_process = True self.stringfile = None self.strings_list.clearSelection() self.strings_list.clear() self.textedit_content.clear() self.lineedit_path.clear() self.lineedit_playtime.clear() self.lineedit_audioname.clear() self.reset_in_process = False def action_button_add_message(self): if self.stringfile is not None: newmessage = Message(strings=[b"", b"", b"", b""], audioplaytime=0.0) self.stringfile.messages.append(newmessage) i = len(self.stringfile.messages) - 1 entry = BWEntityEntry(i, "({0}): '{1}'-'{2}'".format(i, newmessage.get_path(), newmessage.get_message())) self.strings_list.addItem(entry) self.strings_list.setCurrentRow(i) def action_button_set_message(self): print("I was pressed") current = self.strings_list.currentItem() if current is not None and self.strings_list is not None: try: msg = self.stringfile.messages[current.xml_ref] print(current) msg.set_path(self.lineedit_path.text()) msg.set_name(self.lineedit_audioname.text()) msg.playtime = float(self.lineedit_playtime.text()) msg.set_message(self.textedit_content.toPlainText()) current.setText("({0}): '{1}'-'{2}'".format(current.xml_ref, msg.get_path(), msg.get_message())) except: traceback.print_exc() def action_button_delete_message(self): if self.stringfile is not None: lastindex = len(self.stringfile.messages) - 1 lastmessage = self.stringfile.messages.pop() item = self.strings_list.takeItem(lastindex) self.strings_list.removeItemWidget(item) self.strings_list.setCurrentRow(lastindex-1) self.statusbar.showMessage("DELETED: ({0}) {1}".format(lastindex, trim_message(lastmessage.get_message()))) def action_listwidget_change_item(self, current, previous): if current is not None: print(current.xml_ref) msg = self.stringfile.messages[current.xml_ref] self.lineedit_audioname.setText(msg.get_name()) self.lineedit_path.setText(msg.get_path()) self.lineedit_playtime.setText(str(msg.playtime)) self.textedit_content.setText(msg.get_message()) def button_load_strings(self): try: print("ok", self.default_path) self.xmlPath = "" filepath, choosentype = QFileDialog.getOpenFileName( self, "Open File", self.default_path, "BW string files (*.str);;All files (*)") print("doooone") if filepath: print("resetting") self.reset() print("done") with open(filepath, "rb") as f: try: self.stringfile = BWLanguageFile(f) for i, msg in enumerate(self.stringfile.messages): entry = BWEntityEntry(i, "({0}): '{1}'-'{2}'".format(i, msg.get_path(), msg.get_message())) self.strings_list.addItem(entry) pass self.default_path = filepath except Exception as error: print("error", error) traceback.print_exc() except Exception as er: print("errrorrr", error) traceback.print_exc() print("loaded") def button_save_strings(self): if self.stringfile is not None: filepath, choosentype = QFileDialog.getSaveFileName( self, "Save File", self.default_path, "BW level files (*.str);;All files (*)") print(filepath, "saved") if filepath: with open(filepath, "wb") as f: self.stringfile.write(f) self.default_path = filepath set_default_path(filepath) else: pass # no level loaded, do nothing def setup_ui(self): self.setObjectName("MainWindow") self.resize(820, 760) self.setMinimumSize(QSize(720, 560)) self.setWindowTitle("BW-StringsEdit") self.centralwidget = QWidget(self) self.centralwidget.setObjectName("centralwidget") self.setCentralWidget(self.centralwidget) self.horizontalLayout = QHBoxLayout(self.centralwidget) self.horizontalLayout.setObjectName("horizontalLayout") self.strings_list = QListWidget(self.centralwidget) self.horizontalLayout.addWidget(self.strings_list) self.vertLayoutWidget = QWidget(self.centralwidget) self.verticalLayout = QVBoxLayout(self.vertLayoutWidget) self.button_add_message = QPushButton(self.centralwidget) self.button_remove_message = QPushButton(self.centralwidget) self.button_set_message = QPushButton(self.centralwidget) self.button_add_message.setText("Add Message") self.button_remove_message.setText("Delete Last Message") self.button_set_message.setText("Set Message Content") self.lineedit_path = QLineEdit(self.centralwidget) self.lineedit_audioname = QLineEdit(self.centralwidget) self.lineedit_playtime = QLineEdit(self.centralwidget) self.textedit_content = QTextEdit(self.centralwidget) for widget in ( self.button_remove_message, self.button_add_message, self.button_set_message, self.lineedit_path, self.lineedit_audioname, self.lineedit_playtime, self.textedit_content): self.verticalLayout.addWidget(widget) self.horizontalLayout.addWidget(self.vertLayoutWidget) self.menubar = self.menuBar()#QMenuBar(self) #self.menubar.setGeometry(QRect(0, 0, 820, 30)) #self.menubar.setObjectName("menubar") self.file_menu = self.menubar.addMenu("File")#QMenu(self.menubar) self.file_menu.setObjectName("menuLoad") #self.menubar.addMenu(self.file_menu) self.file_load_action = QAction("Load", self) self.file_load_action.triggered.connect(self.button_load_strings) self.file_menu.addAction(self.file_load_action) self.file_save_action = QAction("Save", self) self.file_save_action.triggered.connect(self.button_save_strings) self.file_menu.addAction(self.file_save_action) self.statusbar = QStatusBar(self) self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) #self.setMenuBar(self.menubar) print("done")
class Ui_MainWindow(QtWidgets.QMainWindow): def __init__(self): super(Ui_MainWindow, self).__init__() self.crmAuto = None self.setupUi() self.loading = LoadingDialog(self) self.backThread = None self.messageDialog = None self.signal = Signal() self.signal.connect(self.printMessage) self.logFile = open("log", "a") def setupUi(self): self.resize(572, 387) self.setObjectName("centralwidget") self.label = QLabel(self) self.label.setGeometry(QtCore.QRect(30, 40, 54, 12)) self.label.setObjectName("label") self.label_2 = QLabel(self) self.label_2.setGeometry(QtCore.QRect(30, 80, 54, 12)) self.label_2.setObjectName("label_2") self.excelPath = QLineEdit(self) self.excelPath.setGeometry(QtCore.QRect(90, 30, 381, 31)) self.excelPath.setObjectName("excelPath") self.iniPath = QLineEdit(self) self.iniPath.setGeometry(QtCore.QRect(90, 70, 381, 31)) self.iniPath.setObjectName("iniPath") self.label_3 = QLabel(self) self.label_3.setGeometry(QtCore.QRect(40, 130, 54, 12)) self.label_3.setObjectName("label_3") self.label_4 = QLabel(self) self.label_4.setGeometry(QtCore.QRect(50, 170, 54, 12)) self.label_4.setObjectName("label_4") self.account = QLineEdit(self) self.account.setGeometry(QtCore.QRect(90, 120, 381, 31)) self.account.setObjectName("account") self.password = QLineEdit(self) self.password.setGeometry(QtCore.QRect(90, 160, 381, 31)) self.password.setObjectName("password") self.password.setEchoMode(QLineEdit.Password) self.label_5 = QLabel(self) self.label_5.setGeometry(QtCore.QRect(3, 230, 80, 12)) self.label_5.setObjectName("label_5") self.label_6 = QLabel(self) self.label_6.setGeometry(QtCore.QRect(210, 230, 54, 12)) self.label_6.setObjectName("label_6") self.rowBox = QSpinBox(self) self.rowBox.setMinimum(3) self.rowBox.setGeometry(QtCore.QRect(270, 220, 41, 31)) self.rowBox.setObjectName("spinBox") self.intervalBox = QDoubleSpinBox(self) self.intervalBox.setMinimum(0.05) self.intervalBox.setValue(1) self.intervalBox.setGeometry(QtCore.QRect(90, 220, 62, 31)) self.intervalBox.setObjectName("doubleSpinBox") self.pushButton = QPushButton(self) self.pushButton.setGeometry(QtCore.QRect(480, 30, 75, 23)) self.pushButton.setObjectName("pushButton") self.pushButton_2 = QPushButton(self) self.pushButton_2.setGeometry(QtCore.QRect(480, 70, 75, 23)) self.pushButton_2.setObjectName("pushButton_2") self.pushButton_3 = QPushButton(self) self.pushButton_3.setGeometry(QtCore.QRect(20, 280, 91, 41)) self.pushButton_3.setObjectName("pushButton_3") self.pushButton_4 = QPushButton(self) self.pushButton_4.setGeometry(QtCore.QRect(150, 280, 91, 41)) self.pushButton_4.setObjectName("pushButton_4") self.pushButton_5 = QPushButton(self) self.pushButton_5.setGeometry(QtCore.QRect(280, 280, 91, 41)) self.pushButton_5.setObjectName("pushButton_5") self.pushButton_6 = QPushButton(self) self.pushButton_6.setGeometry(QtCore.QRect(410, 280, 125, 41)) self.pushButton_6.setObjectName("pushButton_6") self.menubar = QMenuBar(self) self.menubar.setGeometry(QtCore.QRect(0, 0, 572, 23)) self.menubar.setObjectName("menubar") self.setMenuBar(self.menubar) self.statusbar = QStatusBar(self) self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) self.retranslateUi() self.pushButton.clicked.connect(self.getExcelFilePath) self.pushButton_2.clicked.connect(self.getIniFilePath) self.pushButton_3.clicked.connect(self.login) self.pushButton_4.clicked.connect(self.startInput) self.pushButton_5.clicked.connect(self.cancelAlert) self.pushButton_6.clicked.connect(self.refreshFile) def retranslateUi(self): _translate = QtCore.QCoreApplication.translate self.setWindowTitle(_translate("MainWindow", "CRM+辅助录入脚本")) self.label.setText(_translate("MainWindow", "Excel文件:")) self.label_2.setText(_translate("MainWindow", "配置文件:")) self.pushButton.setText(_translate("MainWindow", "选择文件")) self.pushButton_2.setText(_translate("MainWindow", "选择文件")) self.label_3.setText(_translate("MainWindow", "用户名")) self.label_4.setText(_translate("MainWindow", "密码")) self.label_5.setText(_translate("MainWindow", "录入间隔(秒)")) self.label_6.setText(_translate("MainWindow", "录入行号")) self.pushButton_3.setText(_translate("MainWindow", "登陆")) self.pushButton_4.setText(_translate("MainWindow", "开始录入")) self.pushButton_5.setText(_translate("MainWindow", "去掉弹窗")) self.pushButton_6.setText(_translate("MainWindow", "刷新excel和配置文件")) def refreshFile(self): if self.crmAuto == None: self.printMessage("请先登录") return excelFile = str(self.excelPath.text()) iniFile = str(self.iniPath.text()) if excelFile == "": self.printMessage("请选择excel目录") return if iniFile == "": self.printMessage("请选择配置文件目录") return self.crmAuto.set_excel(excelFile) self.crmAuto.set_xpath(iniFile) self.printMessage("文件已刷新") def getExcelFilePath(self): filename = str(QFileDialog.getOpenFileName(self, filter="Excel File (*.xls *xlsx)")) list = filename.split("'") self.excelPath.setText(list[1]) def getIniFilePath(self): filename = str(QFileDialog.getOpenFileName(self, filter="INI File (*.ini)")) list = filename.split("'") self.iniPath.setText(list[1]) def login(self): excelFile = str(self.excelPath.text()) iniFile = str(self.iniPath.text()) account = str(self.account.text()) password = str(self.password.text()) if excelFile == "": self.printMessage("请选择excel目录") return if iniFile == "": self.printMessage("请选择配置文件目录") return if account == "": self.printMessage("请输入账号") return if password == "": self.printMessage("请输入密码") return self.crmAuto = CRMAuto(excelFile, iniFile) self.backThread = threading.Thread(target=self.onlogin, args=(account, password)) self.loading.show() self.backThread.start() def onlogin(self, account, password): try: self.crmAuto.login(account, password) except UnexpectedAlertPresentException as e: self.signal.emit("出现严重错误,请重新登录再试\n" + traceback.format_exc()) except Exception as e: traceback.print_exc(file=self.logFile) self.signal.emit("出错了,请重试\n" + traceback.format_exc()) finally: self.loading.close() def startInput(self): if self.crmAuto == None: self.printMessage("请先登录") return row = self.rowBox.value() interval = self.intervalBox.value() self.crmAuto.set_row_index(row) self.crmAuto.set_interval(interval) self.printMessage("5秒后开始录入,请切换到浏览器窗口") self.loading.show() self.backThread = threading.Thread(target=self.autoInput) self.backThread.start() def autoInput(self): try: self.crmAuto.auto_input() except UnexpectedAlertPresentException as e: self.signal.emit("出现严重错误,请重新登录再试\n" + traceback.format_exc()) except Exception as e: traceback.print_exc(file=self.logFile) self.signal.emit("出错了,请重试\n" + traceback.format_exc()) finally: self.loading.close() def printMessage(self, message): self.messageDialog = QMessageBox.information(self, "警告", message) def cancelAlert(self): if self.crmAuto == None: self.printMessage("请先登录") return self.crmAuto.close_alert()
class Ui_MainWindow(object): def setupUi(self, MainWindow): self.conn = pymysql.connect( host='10.26.1.10', port=3306, user='******', password='******', db='LGUAirline', charset='utf8', ) self.cur = self.conn.cursor() self.sqlstring = "select * from students where " MainWindow.setObjectName("MainWindow") MainWindow.resize(760, 440) # 根据窗口的大小固定大小 这里相当于设置全屏 MainWindow.setFixedSize(MainWindow.width(), MainWindow.height()) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.frame = QFrame(self.centralwidget) self.frame.setGeometry(QtCore.QRect(10, 10, 491, 121)) self.frame.setFrameShape(QFrame.StyledPanel) self.frame.setFrameShadow(QFrame.Raised) self.frame.setObjectName("frame") self.check_Sid = QCheckBox(self.frame) self.check_Sid.setGeometry(QtCore.QRect(20, 10, 71, 16)) self.check_Sid.setObjectName("check_Sid") self.check_Sage = QCheckBox(self.frame) self.check_Sage.setGeometry(QtCore.QRect(20, 70, 71, 16)) self.check_Sage.setObjectName("check_Sage") self.check_Sname = QCheckBox(self.frame) self.check_Sname.setGeometry(QtCore.QRect(20, 40, 71, 16)) self.check_Sname.setObjectName("check_Sname") self.check_Ssex = QCheckBox(self.frame) self.check_Ssex.setGeometry(QtCore.QRect(20, 100, 71, 16)) self.check_Ssex.setObjectName("check_Ssex") self.Sid = QLineEdit(self.frame) self.Sid.setGeometry(QtCore.QRect(90, 10, 113, 16)) self.Sid.setObjectName("Sid") self.Sname = QLineEdit(self.frame) self.Sname.setGeometry(QtCore.QRect(90, 40, 113, 16)) self.Sname.setObjectName("Sname") self.first_Sage = QLineEdit(self.frame) self.first_Sage.setGeometry(QtCore.QRect(90, 70, 41, 16)) self.first_Sage.setObjectName("first_Sage") self.Ssex = QLineEdit(self.frame) self.Ssex.setGeometry(QtCore.QRect(90, 100, 113, 16)) self.Ssex.setObjectName("Ssex") self.label = QLabel(self.frame) self.label.setGeometry(QtCore.QRect(140, 70, 16, 16)) self.label.setObjectName("label") self.last_Sage = QLineEdit(self.frame) self.last_Sage.setGeometry(QtCore.QRect(160, 70, 41, 16)) self.last_Sage.setObjectName("last_Sage") self.check_Sdept = QCheckBox(self.frame) self.check_Sdept.setGeometry(QtCore.QRect(270, 40, 71, 16)) self.check_Sdept.setObjectName("check_Sdept") self.Sdept = QLineEdit(self.frame) self.Sdept.setGeometry(QtCore.QRect(340, 40, 113, 16)) self.Sdept.setObjectName("Sdept") self.Sclass = QLineEdit(self.frame) self.Sclass.setGeometry(QtCore.QRect(340, 10, 113, 16)) self.Sclass.setObjectName("Sclass") self.check_Sclass = QCheckBox(self.frame) self.check_Sclass.setGeometry(QtCore.QRect(270, 10, 71, 16)) self.check_Sclass.setObjectName("check_Sclass") self.Saddr = QLineEdit(self.frame) self.Saddr.setGeometry(QtCore.QRect(340, 70, 113, 16)) self.Saddr.setObjectName("Saddr") self.check_Saddr = QCheckBox(self.frame) self.check_Saddr.setGeometry(QtCore.QRect(270, 70, 71, 16)) self.check_Saddr.setObjectName("check_Saddr") self.find = QPushButton(self.frame) self.find.setGeometry(QtCore.QRect(380, 100, 75, 21)) self.find.setObjectName("find") self.find.clicked.connect(self.find_btn) self.sql_out = QTextBrowser(self.centralwidget) self.sql_out.setGeometry(QtCore.QRect(10, 140, 740, 61)) self.sql_out.setObjectName("sql_out") self.result_out = QTableWidget(self.centralwidget) self.result_out.setEditTriggers( QAbstractItemView.NoEditTriggers) # 不可编辑表格 self.result_out.setGeometry(QtCore.QRect(10, 210, 740, 171)) self.result_out.setObjectName("result_out") self.result_out.setColumnCount(7) self.result_out.setRowCount(10) self.result_out.resizeColumnsToContents() self.result_out.resizeRowsToContents() item = QTableWidgetItem() self.result_out.setHorizontalHeaderItem(0, item) item = QTableWidgetItem() self.result_out.setHorizontalHeaderItem(1, item) item = QTableWidgetItem() self.result_out.setHorizontalHeaderItem(2, item) item = QTableWidgetItem() self.result_out.setHorizontalHeaderItem(3, item) item = QTableWidgetItem() self.result_out.setHorizontalHeaderItem(4, item) item = QTableWidgetItem() self.result_out.setHorizontalHeaderItem(5, item) item = QTableWidgetItem() self.result_out.setHorizontalHeaderItem(6, item) self.result_out.horizontalHeader().setDefaultSectionSize(100) self.result_out.horizontalHeader().setMinimumSectionSize(25) self.result_out.verticalHeader().setDefaultSectionSize(30) self.pushButton_2 = QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(675, 390, 75, 21)) self.pushButton_2.setObjectName("pushButton_2") self.pushButton_2.clicked.connect(self.p2_clicked) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 509, 23)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def p2_clicked(self): self.pyqt_clicked1.emit() def find_btn(self): self.pyqt_clicked2.emit() def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) self.check_Sid.setText(_translate("MainWindow", "学号", None)) self.check_Sage.setText(_translate("MainWindow", "年龄自", None)) self.check_Sname.setText(_translate("MainWindow", "姓名", None)) self.check_Ssex.setText(_translate("MainWindow", "性别", None)) self.label.setText(_translate("MainWindow", "到", None)) self.check_Sdept.setText(_translate("MainWindow", "系", None)) self.check_Sclass.setText(_translate("MainWindow", "班级", None)) self.check_Saddr.setText(_translate("MainWindow", "地址", None)) self.find.setText(_translate("MainWindow", "查询", None)) self.sql_out.setText(self.sqlstring) item = self.result_out.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "Sid", None)) item = self.result_out.horizontalHeaderItem(1) item.setText(_translate("MainWindow", "Sname ", None)) item = self.result_out.horizontalHeaderItem(2) item.setText(_translate("MainWindow", "Sage", None)) item = self.result_out.horizontalHeaderItem(3) item.setText(_translate("MainWindow", "Ssex", None)) item = self.result_out.horizontalHeaderItem(4) item.setText(_translate("MainWindow", "Sclass", None)) item = self.result_out.horizontalHeaderItem(5) item.setText(_translate("MainWindow", "Sdept", None)) item = self.result_out.horizontalHeaderItem(6) item.setText(_translate("MainWindow", "Saddr", None)) self.pushButton_2.setText(_translate("MainWindow", "退出", None)) def mousePressEvent(self, event): # if event.KeyWord == Qt.LeftButton: print("nihao") def buttonTest(self): temp_sqlstring = self.sqlstring is_first = True if self.check_Sid.isChecked(): mystr = self.Sid.text() if is_first: is_first = False if mystr.find("%") == -1: temp_sqlstring += "Sid = '" + self.Sid.text() + "'" else: temp_sqlstring += "Sid like '" + self.Sid.text() + "'" else: if mystr.find("%") == -1: temp_sqlstring += " and Sid = '" + self.Sid.text() + "'" else: temp_sqlstring += " and Sid like '" + self.Sid.text() + "'" if self.check_Sname.isChecked(): if is_first: mystr = self.Sname.text() is_first = False if mystr.find("%") == -1: temp_sqlstring += "Sname = '" + self.Sname.text() + "'" else: temp_sqlstring += "Sname like '" + self.Sname.text() + "'" else: if mystr.find("%") == -1: temp_sqlstring += " and Sname = '" + self.Sname.text( ) + "'" else: temp_sqlstring += " and Sname like '" + self.Sname.text( ) + "'" if self.check_Sage.isChecked(): if is_first: is_first = False temp_sqlstring += "Sage >= " + self.first_Sage.text() + \ " and Sage <= " + self.last_Sage.text() else: temp_sqlstring += " and Sage >= " + self.first_Sage.text() + \ " and Sage <= " + self.last_Sage.text() if self.check_Ssex.isChecked(): if is_first: is_first = False temp_sqlstring += "Ssex = '" + self.Ssex.text() + "'" else: temp_sqlstring += " and Ssex = '" + self.Ssex.text() + "'" if self.check_Sclass.isChecked(): if is_first: mystr = self.Sclass.text() is_first = False if mystr.find("%") == -1: temp_sqlstring += "Sclass = '" + self.Sclass.text() + "'" else: temp_sqlstring += "Sclass like '" + self.Sclass.text( ) + "'" else: if mystr.find("%") == -1: temp_sqlstring += " and Sclass = '" + self.Sclass.text( ) + "'" else: temp_sqlstring += " and Sclass like '" + self.Sclass.text( ) + "'" if self.check_Sdept.isChecked(): if is_first: mystr = self.Sdept.text() is_first = False if mystr.find("%") == -1: temp_sqlstring += "Sdept = '" + self.Sdept.text() + "'" else: temp_sqlstring += "Sdept like '" + self.Sdept.text() + "'" else: if mystr.find("%") == -1: temp_sqlstring += " and Sdept = '" + self.Sdept.text( ) + "'" else: temp_sqlstring += " and Sdept like '" + self.Sdept.text( ) + "'" if self.check_Saddr.isChecked(): if is_first: mystr = self.Saddr.text() is_first = False if mystr.find("%") == -1: temp_sqlstring += "Saddr = '" + self.Saddr.text() + "'" else: temp_sqlstring += " and Saddr like '" + self.Saddr.text( ) + "'" else: if mystr.find("%") == -1: temp_sqlstring += " and Saddr = '" + self.Saddr.text( ) + "'" else: temp_sqlstring += " and Saddr like '" + self.Saddr.text( ) + "'" self.result_out.clearContents() # 每一次查询时清除表格中信息 if not (is_first): print(temp_sqlstring) self.cur.execute(temp_sqlstring) k = 0 for i in self.cur: print("----------", i) w = 0 for j in i: # 这里是将int类型转成string类型,方便后面文本设置 if type(j) == int: newItem = QTableWidgetItem(str(j)) else: newItem = QTableWidgetItem(j) # 根据循环标签一次对table中的格子进行设置 self.result_out.setItem(k, w, newItem) w += 1 k += 1 self.sql_out.setText("") self.sql_out.append(temp_sqlstring) print("find button pressed") def buttonExit(self): self.conn.commit() self.cur.close() self.conn.close() self.close() def keyPressEvent(self, e): if e.key() == QtCore.Qt.Key_Escape: self.buttonExit()
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(500, 262) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) self.button_find_id = QPushButton(self.centralwidget) self.button_find_id.setGeometry(QtCore.QRect(370, 10, 110, 32)) self.button_find_id.setObjectName(_fromUtf8("button_find_id")) self.button_find_name = QPushButton(self.centralwidget) self.button_find_name.setGeometry(QtCore.QRect(370, 50, 110, 32)) self.button_find_name.setObjectName(_fromUtf8("button_find_name")) self.button_find_cas = QPushButton(self.centralwidget) self.button_find_cas.setGeometry(QtCore.QRect(370, 90, 110, 32)) self.button_find_cas.setObjectName(_fromUtf8("button_find_cas")) self.button_find_vpid = QPushButton(self.centralwidget) self.button_find_vpid.setGeometry(QtCore.QRect(370, 130, 110, 32)) self.button_find_vpid.setObjectName(_fromUtf8("button_find_cas")) self.button_add = QPushButton(self.centralwidget) self.button_add.setGeometry(QtCore.QRect(150, 180, 110, 32)) self.button_add.setObjectName(_fromUtf8("button_add")) self.button_stop = QPushButton(self.centralwidget) self.button_stop.setGeometry(QtCore.QRect(150, 210, 110, 32)) self.button_stop.setObjectName(_fromUtf8("button_stop")) self.button_invent = QPushButton(self.centralwidget) self.button_invent.setGeometry(QtCore.QRect(20, 180, 120, 32)) self.button_invent.setObjectName(_fromUtf8("button_invent")) self.button_invent_2 = QPushButton(self.centralwidget) self.button_invent_2.setGeometry(QtCore.QRect(20, 210, 120, 32)) self.button_invent_2.setObjectName(_fromUtf8("button_invent_2")) self.button_delete = QPushButton(self.centralwidget) self.button_delete.setGeometry(QtCore.QRect(260, 210, 120, 32)) self.button_delete.setObjectName(_fromUtf8("button_delete")) self.button_manual = QPushButton(self.centralwidget) self.button_manual.setGeometry(QtCore.QRect(260, 180, 120, 32)) self.button_manual.setObjectName(_fromUtf8("button_delete")) self.button_repop = QPushButton(self.centralwidget) self.button_repop.setGeometry(QtCore.QRect(380, 195, 110, 32)) self.button_repop.setObjectName(_fromUtf8("button_repop")) self.line_id = QLineEdit(self.centralwidget) self.line_id.setGeometry(QtCore.QRect(90, 10, 251, 21)) self.line_id.setObjectName(_fromUtf8("line_id")) self.line_name = QLineEdit(self.centralwidget) self.line_name.setGeometry(QtCore.QRect(90, 50, 251, 21)) self.line_name.setObjectName(_fromUtf8("line_name")) self.line_cas = QLineEdit(self.centralwidget) self.line_cas.setGeometry(QtCore.QRect(90, 90, 251, 21)) self.line_cas.setObjectName(_fromUtf8("line_cas")) self.line_vpid = QLineEdit(self.centralwidget) self.line_vpid.setGeometry(QtCore.QRect(90, 130, 251, 21)) self.line_vpid.setObjectName(_fromUtf8("line_cas")) self.label_id = QLabel(self.centralwidget) self.label_id.setGeometry(QtCore.QRect(10, 10, 56, 13)) self.label_id.setObjectName(_fromUtf8("label_id")) self.label_name = QLabel(self.centralwidget) self.label_name.setGeometry(QtCore.QRect(10, 50, 56, 13)) self.label_name.setObjectName(_fromUtf8("label_name")) self.label_cas = QLabel(self.centralwidget) self.label_cas.setGeometry(QtCore.QRect(10, 90, 56, 13)) self.label_cas.setObjectName(_fromUtf8("label_cas")) self.label_vpid = QLabel(self.centralwidget) self.label_vpid.setGeometry(QtCore.QRect(10, 130, 56, 13)) self.label_vpid.setObjectName(_fromUtf8("label_cas")) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 500, 22)) self.menubar.setObjectName(_fromUtf8("menubar")) MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName(_fromUtf8("statusbar")) MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) #connection #self.trigger=QtCore.pyqtSignal() #self.trigger.connect(self.button_add, QtCore.SIGNAL("released()"), self.new) #self.connect(self.button_stop, QtCore.SIGNAL("released()"), self.quit) #self.connect(self.button_find_id, QtCore.SIGNAL("released()"), self.find_id) #self.connect(self.button_find_name, QtCore.SIGNAL("released()"), self.find_name) #self.connect(self.button_find_vpid, QtCore.SIGNAL("released()"), self.find_vpid) #self.connect(self.button_find_cas, QtCore.SIGNAL("released()"), self.find_cas) #self.connect(self.button_invent, QtCore.SIGNAL("released()"), self.invent) #self.connect(self.button_invent_2, QtCore.SIGNAL("released()"), self.invent_2) #self.connect(self.button_delete, QtCore.SIGNAL("released()"), self.delete) #self.connect(self.button_manual, QtCore.SIGNAL("released()"), self.manu) #self.connect(self.button_repop, QtCore.SIGNAL("released()"), self.repop) self.button_stop.clicked.connect(self.quit) self.button_add.clicked.connect(self.new) self.button_find_id.clicked.connect(self.find_id) self.button_find_name.clicked.connect(self.find_name) self.button_find_vpid.clicked.connect(self.find_vpid) self.button_find_cas.clicked.connect(self.find_cas) self.button_invent.clicked.connect(self.invent) self.button_invent_2.clicked.connect(self.invent_2) self.button_delete.clicked.connect(self.delete) self.button_manual.clicked.connect(self.manu) self.button_repop.clicked.connect(self.repop) def invent(self) : prog=QProgressDialog("Compiling inventory...","Cancel",0,100,self) prog.open() allconn=cursor.connection() curs=allconn[0] data=allconn[1] curs.execute("""SELECT * FROM "main"."chem" WHERE "id" > 0 """) store=curs.fetchall() a=excel.makeinvent(store) a.begin() internal=0 if prog.wasCanceled() : return None while internal != 100 : try : internal=(a.returnid()/len(store))*100 except : internal=100 prog.setValue(internal) if prog.wasCanceled() : return None b=a.returnbook() try : fname=QFileDialog.getSaveFileName(self, 'Save File', '/','Excel File (*.xls)')[0] b.save(fname) QMessageBox.information(self, "Info", "Inventory was saved sucessfully.") if prog.wasCanceled() : return None except : QMessageBox.information(self, "Info", "Inventory was no saved.") def invent_2 (self) : prog=QProgressDialog("Compiling inventory...","Cancel",0,100,self) prog.open() allconn=cursor.connection() curs=allconn[0] data=allconn[1] curs.execute("""SELECT "storage" FROM "main"."chem" WHERE "id" > 0 """) store=curs.fetchall() newstore=[] count=-1 if prog.wasCanceled() : return None for i in store : count=count+1 if i[0] not in newstore : newstore.append(store[count][0]) a=excel.makeinvent_2(newstore) a.begin() internal=[0,1] percent=0 if prog.wasCanceled() : return None while percent != 100 : internal=(a.returnid()) try : percent=((internal[0]/internal[1])*100) except : percent=100 prog.setValue(percent) if prog.wasCanceled() : return None b=a.returnbook() try : fname=QFileDialog.getSaveFileName(self, 'Save File', '/','Excel File (*.xls)')[0] b.save(fname) QMessageBox.information(self, "Info", "Inventory was saved sucessfully.") except : QMessageBox.information(self, "Info", "Inventory was no saved.") def new (self) : self.prop=display.Ui_chem() curs=cursor.connection()[0] curs.execute('''SELECT MAX(id) FROM chem''') maximum=curs.fetchone()[0] maximum=int(maximum) if maximum==-1 : maximum=0 self.prop.line_id.setText(str(maximum+1)) self.prop.line_id.setReadOnly(True) self.prop.show() def find_id (self) : allconn=cursor.connection() curs=allconn[0] data=allconn[1] idfind=str(self.line_id.text()) idfind=(idfind,) curs.execute('''SELECT * FROM chem WHERE id=?''', idfind) data.commit() data.commit() store=curs.fetchone() if str(self.line_id.text())=="-1" : store=None data.close() if store != None : self.line_id.setText('') self.prop=display.Ui_chem() self.prop.line_name.setText(store[0]) self.prop.line_vendor.setText(store[1]) self.prop.line_vpid.setText(store[2]) self.prop.line_cas.setText(store[3]) self.prop.line_size.setText(store[4]) self.prop.line_storage.setText(store[5]) self.prop.line_room.setText(store[6]) self.prop.line_id.setText(str(store[7])) self.prop.line_id.setReadOnly(True) self.prop.show() else : self.line_id.setText('') QMessageBox.information(self, "Error", "ID doesn't exist") data.close() def find_vpid (self) : allconn=cursor.connection() curs=allconn[0] data=allconn[1] idfind=str(self.line_vpid.text()) idfind=(idfind,) curs.execute('''SELECT * FROM chem WHERE vpid=?''', idfind) data.commit() data.commit() store=curs.fetchone() print(store[0]) if store[0]=="CHEMDB\n" or store[0]=='CHEMDB' : store=None data.close() if store != None : self.line_id.setText('') self.prop=display.Ui_chem() self.prop.line_name.setText(store[0]) self.prop.line_vendor.setText(store[1]) self.prop.line_vpid.setText(store[2]) self.prop.line_cas.setText(store[3]) self.prop.line_size.setText(store[4]) self.prop.line_storage.setText(store[5]) self.prop.line_room.setText(store[6]) self.prop.line_id.setText(str(store[7])) self.prop.line_id.setReadOnly(True) self.prop.show() else : self.line_id.setText('') QMessageBox.information(self, "Error", "Vendor ID doesn't exist") data.close() def delete (self) : self.prop=delete.Ui_delete_entries() self.prop.show() def find_name (self) : allconn=cursor.connection() curs=allconn[0] data=allconn[1] idfind=str(self.line_name.text()) idfind.lower() idfind="%"+idfind+"%" idfind=(idfind,) curs.execute('''SELECT "name", "id", "storage" FROM "main"."chem" where "name" LIKE ? LIMIT 0, 100''', idfind) data.commit() store=curs.fetchall() for item in store : if item[0]=="CHEMDB\n" or item[0]=="CHEMDB" : store.remove(item) if store != None and len(store)==1 : curs.execute('''SELECT * FROM "main"."chem" where "name" LIKE ? LIMIT 0, 100''', idfind) data.commit() store=curs.fetchall() for item in store : if item[0]=="CHEMDB\n" or item[0]=="CHEMDB" : store.remove(item) data.close() self.line_name.setText('') self.prop=display.Ui_chem() self.prop.line_name.setText(store[0][0]) self.prop.line_vendor.setText(store[0][1]) self.prop.line_vpid.setText(store[0][2]) self.prop.line_cas.setText(store[0][3]) self.prop.line_size.setText(store[0][4]) self.prop.line_storage.setText(store[0][5]) self.prop.line_room.setText(store[0][6]) self.prop.line_id.setText(str(store[0][7])) self.prop.line_id.setReadOnly(True) self.prop.show() elif store != None and len(store)>1 : self.listing=listing.Ui_Form() self.listing.list.clear() reform=[] for produit in range(len(store)) : reform.append(str(store[produit][0])+" // STORE : "+ str(store[produit][2]) +" // ID : " + str(store[produit][1])) self.listing.list.addItem(reform[produit]) data.close() if len(store)>=99 : QMessageBox.information(self, "Warning", "More than 100 references were found. Only displaying the first 100 records") self.line_name.setText('') self.listing.show() else : data.close() self.line_name.setText('') QMessageBox.information(self, "Error", "The research gave nothing back") def find_cas (self) : allconn=cursor.connection() curs=allconn[0] data=allconn[1] casfind=str(self.line_cas.text()) casfind.lower() casfind=(casfind,) curs.execute('''SELECT * FROM "main"."chem" WHERE "cas"=?''', casfind) store=curs.fetchone() if store[0]=="CHEMDB\n" or store[0]=='CHEMDB' : store=None if store!=None : self.prop=display.Ui_chem() self.prop.line_name.setText(store[0]) self.prop.line_vendor.setText(store[1]) self.prop.line_vpid.setText(store[2]) self.prop.line_cas.setText(store[3]) self.prop.line_size.setText(store[4]) self.prop.line_storage.setText(store[5]) self.prop.line_room.setText(store[6]) self.prop.line_id.setText(str(store[7])) self.prop.line_id.setReadOnly(True) self.line_cas.setText('') self.prop.show() else : QMessageBox.information(self, "Error", "Cannot found CAS") self.line_cas.setText('') data.close() def repop (self) : h=QMessageBox.question(self, "WARNING", "WARNING ! Repopulate will erase all the database by an Excel file generated by this database. Do not do this action randomly !!! Are you sur you want to continue ?") if h==QMessageBox.No : return None fname=QFileDialog.getOpenFileName(self, 'Choose an Excel File', '/','Excem File (*.xls)')[0] prog=QProgressDialog("Gathering Data...","Cancel",0,100,self) prog.open() if prog.wasCanceled() : return None rep=excel.repopulate(fname) try : rep.begin() if prog.wasCanceled() : return None except : return None state=int(rep.returnstate()) prog.setLabelText("Repopulating...") while state==0 : prog.setValue(rep.returnpercent()) state=rep.returnstate() prog.setCancelButton(None) if state==1 : prog.close() QMessageBox.information(self, "Sucess", "Repopulation Sucess") if state==-1 : QMessageBox.information(self, "Error", "Repopulation Failled") def abort(self) : return None def manu (self) : self.load=manual.Ui_manual() self.load.show() def quit (self) : QApplication.quit() def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(_translate("MainWindow", "Chem Database", None)) self.button_find_id.setText(_translate("MainWindow", "Find ID", None)) self.button_find_vpid.setText(_translate("MainWindow", "Find Vendor ID", None)) self.button_repop.setText(_translate("MainWindow", "Repopulate", None)) self.button_find_name.setText(_translate("MainWindow", "Find Name", None)) self.button_find_cas.setText(_translate("MainWindow", "Find CAS", None)) self.button_add.setText(_translate("MainWindow", "Add Entry", None)) self.button_stop.setText(_translate("MainWindow","Close Program",None)) self.button_invent.setText(_translate("MainWindow","Inventory:Full",None)) self.button_invent_2.setText(_translate("MainWindow","Inventory:Group",None)) self.button_delete.setText(_translate('MainWindow','Delete Entries',None)) self.button_manual.setText(_translate('MainWindow','Manual CMD',None)) self.label_id.setText(_translate("MainWindow", "ID", None)) self.label_name.setText(_translate("MainWindow", "Name", None)) self.label_cas.setText(_translate("MainWindow", "CAS", None)) self.label_vpid.setText(_translate("MainWindow", "Vendor ID", None))
class MainWindow(QMainWindow): #此处定义常量 #此处定义信号 def __init__(self): QMainWindow.__init__(self) def setup(self): # 定义主窗口 self.setEnabled(True) self.resize(800, 600) self.setMinimumSize(QSize(800, 600)) # 创建堆叠窗口 self.mw_stacked_widget = StackedWidget() self.mw_stacked_widget.setup() # 创建参数列表窗口 self.mw_paralist_dock = ParalistDock() self.mw_paralist_dock.setup() self.addDockWidget(Qt.DockWidgetArea(1), self.mw_paralist_dock) # 设置主窗口布局 self.mainwindow_layout = QWidget(self) self.mainwindow_layout.setObjectName("mainwindow_layout") self.horizontalLayout = QHBoxLayout(self.mainwindow_layout) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setSpacing(0) self.horizontalLayout.setObjectName("horizontalLayout") self.horizontalLayout.addWidget(self.mw_stacked_widget) self.setCentralWidget(self.mainwindow_layout) # 创建菜单栏 self.menubar = QMenuBar(self) self.menubar.setGeometry(QRect(0, 0, 800, 23)) self.menubar.setObjectName("menubar") self.menu_file = QMenu(self.menubar) self.menu_file.setObjectName("menu_file") self.menu_import = QMenu(self.menu_file) self.menu_import.setObjectName("menu_import") self.menu_export = QMenu(self.menu_file) self.menu_export.setObjectName("menu_export") self.menu_edit = QMenu(self.menubar) self.menu_edit.setObjectName("menu_edit") self.menu_view = QMenu(self.menubar) self.menu_view.setObjectName("menu_view") self.menu_tools = QMenu(self.menubar) self.menu_tools.setObjectName("menu_tools") self.menu_window = QMenu(self.menubar) self.menu_window.setObjectName("menu_window") self.menu_help = QMenu(self.menubar) self.menu_help.setObjectName("menu_help") self.menu_analysis = QMenu(self.menubar) self.menu_analysis.setObjectName("menu_analysis") self.menu_mathematics = QMenu(self.menu_analysis) self.menu_mathematics.setObjectName("menu_mathematics") self.menu_data_manipulation = QMenu(self.menu_analysis) self.menu_data_manipulation.setObjectName("menu_data_manipulation") self.menu_data_manage = QMenu(self.menu_analysis) self.menu_data_manage.setObjectName("menu_data_manage") self.menu_plot = QMenu(self.menubar) self.menu_plot.setObjectName("menu_plot") self.setMenuBar(self.menubar) # 创建状态栏 self.statusbar = QStatusBar(self) self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) # 创建工具栏 self.toolbar = QToolBar(self) self.toolbar.setObjectName("toolbar") self.addToolBar(Qt.TopToolBarArea, self.toolbar) # 创建动作 self.action_new = QAction(self) self.action_new.setObjectName("action_new") self.action_open = QAction(self) self.action_open.setObjectName("action_open") self.action_import_normal_datafile = QAction(self) self.action_import_normal_datafile.setObjectName( "action_import_normal_datafile") self.action_export_data = QAction(self) self.action_export_data.setObjectName("action_export_data") self.action_exit = QAction(self) self.action_exit.setObjectName("action_exit") self.action_simple_math = QAction(self) self.action_simple_math.setObjectName("action_simple_math") self.action_testpoint_manage = QAction(self) self.action_testpoint_manage.setObjectName("action_testpoint_manage") self.action_synchronization = QAction(self) self.action_synchronization.setObjectName("action_synchronization") self.action_tuning = QAction(self) self.action_tuning.setObjectName("action_tuning") self.action_para_manage = QAction(self) self.action_para_manage.setObjectName("action_para_manage") self.action_temp_manage = QAction(self) self.action_temp_manage.setObjectName("action_temp_manage") self.action_options = QAction(self) self.action_options.setObjectName("action_options") self.action_about = QAction(self) self.action_about.setObjectName("action_about") self.action_quick_plot = QAction(self) self.action_quick_plot.setObjectName("action_quick_plot") self.action_custom_defined_plot = QAction(self) self.action_custom_defined_plot.setObjectName( "action_custom_defined_plot") self.action_multi_source_plot = QAction(self) self.action_multi_source_plot.setObjectName("action_multi_source_plot") self.action_paralist_dock_isclosed = QAction(self) self.action_paralist_dock_isclosed.setCheckable(True) self.action_paralist_dock_isclosed.setChecked(True) self.action_paralist_dock_isclosed.setObjectName( "action_paralist_dock_isclosed") # 将动作添加到对应的菜单下 self.menu_import.addAction(self.action_import_normal_datafile) self.menu_export.addAction(self.action_export_data) self.menu_file.addAction(self.action_new) self.menu_file.addAction(self.action_open) self.menu_file.addSeparator() self.menu_file.addAction(self.menu_import.menuAction()) self.menu_file.addAction(self.menu_export.menuAction()) self.menu_file.addSeparator() self.menu_file.addAction(self.action_exit) self.menu_view.addAction(self.action_paralist_dock_isclosed) self.menu_tools.addAction(self.action_options) self.menu_help.addAction(self.action_about) self.menu_mathematics.addAction(self.action_simple_math) self.menu_data_manipulation.addAction(self.action_testpoint_manage) self.menu_data_manipulation.addAction(self.action_synchronization) self.menu_data_manipulation.addAction(self.action_tuning) self.menu_data_manage.addAction(self.action_para_manage) self.menu_data_manage.addAction(self.action_temp_manage) self.menu_analysis.addAction(self.menu_mathematics.menuAction()) self.menu_analysis.addAction(self.menu_data_manipulation.menuAction()) self.menu_analysis.addAction(self.menu_data_manage.menuAction()) self.menu_plot.addAction(self.action_quick_plot) self.menu_plot.addAction(self.action_custom_defined_plot) self.menu_plot.addAction(self.action_multi_source_plot) self.menubar.addAction(self.menu_file.menuAction()) self.menubar.addAction(self.menu_edit.menuAction()) self.menubar.addAction(self.menu_view.menuAction()) self.menubar.addAction(self.menu_analysis.menuAction()) self.menubar.addAction(self.menu_plot.menuAction()) self.menubar.addAction(self.menu_tools.menuAction()) self.menubar.addAction(self.menu_window.menuAction()) self.menubar.addAction(self.menu_help.menuAction()) self.toolbar.addAction(self.action_import_normal_datafile) self.retranslate() # QMetaObject.connectSlotsByName(self) # =======连接信号与槽 self.mw_paralist_dock.signal_close.connect( self.slot_paralist_dock_close) # ============================================================================= # Views # ============================================================================= # ============================================================================= # 与新建项目有关的显示 def view_new(self): return NewProjectDialog().get_project_info() def view_set_window_title(self, title): if title: self.setWindowTitle(title + ' - Demo') # ============================================================================= # 与打开项目有关的显示 # 响应打开项目的指令,函数返回一个str型的文件路径 def view_open(self): sel_pro = QFileDialog.getExistingDirectory(self, 'Open Program') if sel_pro: sel_pro = sel_pro.replace('/', '\\') return sel_pro else: return None def view_open_status(self, status, pro_name): if status: tipDialog = QMessageBox(self) tipDialog.resize(300, 100) tipDialog.setWindowTitle("Information") tipDialog.setText("Open a project suceessfully!") tipDialog.exec_() else: tipDialog = QMessageBox(self) tipDialog.resize(300, 100) tipDialog.setWindowTitle("Caution") tipDialog.setText("Unsuceessfully, It's not a project!") tipDialog.exec_() # ============================================================================= # 与关于数据导入有关的显示 # # ============================================================================= # 与关于信息显示有关的显示 # 显示About信息 def view_about(self): QMessageBox.about( self, QCoreApplication.translate("MainWindow", "关于演示程序"), QCoreApplication.translate( "MainWindow", """<b>演示程序</b> <br>试飞数据绘图软件 <br>Copyright © FTCC <p>由试飞中心试飞工程部绘图软件开发团队开发维护 """)) # ============================================================================= # 与参数窗口有关的显示 # 响应参数窗口显示动作 def control_paralist_dock_isclosed(self): if self.mw_paralist_dock.isHidden(): self.mw_paralist_dock.setHidden(False) else: self.mw_paralist_dock.setHidden(True) # ============================================================================= # Slots # ============================================================================= # 参数窗口关闭后需要把视图下的勾选去掉 def slot_paralist_dock_close(self): self.action_paralist_dock_isclosed.setChecked(False) # ============================================================================= # 汉化 # ============================================================================= def retranslate(self): _translate = QCoreApplication.translate self.setWindowTitle(_translate("MainWindow", "演示程序")) self.menu_file.setTitle(_translate("MainWindow", "文件")) self.menu_import.setTitle(_translate("MainWindow", "导入")) self.menu_export.setTitle(_translate("MainWindow", "导出")) self.menu_edit.setTitle(_translate("MainWindow", "编辑")) self.menu_view.setTitle(_translate("MainWindow", "视图")) self.menu_tools.setTitle(_translate("MainWindow", "工具")) self.menu_window.setTitle(_translate("MainWindow", "窗口")) self.menu_help.setTitle(_translate("MainWindow", "帮助")) self.menu_analysis.setTitle(_translate("MainWindow", "分析")) self.menu_mathematics.setTitle(_translate("MainWindow", "数学计算")) self.menu_data_manipulation.setTitle(_translate("MainWindow", "数据操作")) self.menu_data_manage.setTitle(_translate("MainWindow", "数据管理")) self.menu_plot.setTitle(_translate("MainWindow", "绘图")) self.mw_paralist_dock.setWindowTitle(_translate("MainWindow", "参数窗口")) self.mw_paralist_dock.line_edit_search_para.setPlaceholderText( _translate("MainWindow", "过滤器")) self.toolbar.setWindowTitle(_translate("MainWindow", "工具栏")) self.action_new.setText(_translate("MainWindow", "新建")) self.action_open.setText(_translate("MainWindow", "打开")) self.action_import_normal_datafile.setText( _translate("MainWindow", "通用数据")) self.action_export_data.setText(_translate("MainWindow", "数据文件")) self.action_export_data.setToolTip(_translate("MainWindow", "数据文件")) self.action_exit.setText(_translate("MainWindow", "退出")) self.action_simple_math.setText(_translate("MainWindow", "简单计算")) self.action_testpoint_manage.setText(_translate("MainWindow", "试验点")) self.action_synchronization.setText(_translate("MainWindow", "时间同步")) self.action_tuning.setText(_translate("MainWindow", "调频")) self.action_para_manage.setText(_translate("MainWindow", "参数")) self.action_temp_manage.setText(_translate("MainWindow", "模板")) self.action_options.setText(_translate("MainWindow", "选项")) self.action_about.setText(_translate("MainWindow", "关于")) self.action_quick_plot.setText(_translate("MainWindow", "快速绘图")) self.action_custom_defined_plot.setText( _translate("MainWindow", "自定义绘图")) self.action_multi_source_plot.setText(_translate("MainWindow", "并行绘图")) self.action_paralist_dock_isclosed.setText( _translate("MainWindow", "参数窗口"))
class AcquisitionWindow(QMainWindow): def __init__(self, parent=None): super(AcquisitionWindow, self).__init__(parent) self.initUI(self) # Setup UI elements def initUI(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.setGeometry(10, 290, 340, 500) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayoutWidget = QWidget(self.centralwidget) self.gridLayoutWidget.setGeometry(QRect(10, 30, 330, 236)) self.gridLayoutWidget.setObjectName("gridLayoutWidget") self.gridLayout = QGridLayout(self.gridLayoutWidget) self.gridLayout.setHorizontalSpacing(10) self.gridLayout.setObjectName("gridLayout") self.steadyStatLabel = QLabel(self.centralwidget) self.steadyStatLabel.setGeometry(QRect(10, 10, 111, 16)) self.minVLabel = QLabel(self.gridLayoutWidget) self.gridLayout.addWidget(self.minVLabel, 0, 0, 1, 1) self.minVText = QLineEdit(self) self.gridLayout.addWidget(self.minVText, 0, 1, 1, 1) self.minVText.editingFinished.connect(self.validateVoltages) self.maxVLabel = QLabel(self.gridLayoutWidget) self.gridLayout.addWidget(self.maxVLabel, 1, 0, 1, 1) self.maxVText = QLineEdit(self) self.gridLayout.addWidget(self.maxVText, 1, 1, 1, 1) self.maxVText.editingFinished.connect(self.validateVoltages) self.startVLabel = QLabel(self.gridLayoutWidget) self.gridLayout.addWidget(self.startVLabel, 2, 0, 1, 1) self.startVText = QLineEdit(self) self.startVText.editingFinished.connect(self.validateVoltages) self.gridLayout.addWidget(self.startVText, 2, 1, 1, 1) self.stepVLabel = QLabel(self.gridLayoutWidget) self.gridLayout.addWidget(self.stepVLabel, 3, 0, 1, 1) self.stepVText = QLineEdit(self.gridLayoutWidget) self.gridLayout.addWidget(self.stepVText, 3, 1, 1, 1) self.gateVLabel = QLabel(self.gridLayoutWidget) self.gridLayout.addWidget(self.gateVLabel, 4, 0, 1, 1) self.gateVText = QLineEdit(self.gridLayoutWidget) self.gridLayout.addWidget(self.gateVText, 4, 1, 1, 1) self.holdTLabel = QLabel(self.gridLayoutWidget) self.gridLayout.addWidget(self.holdTLabel, 5, 0, 1, 1) self.holdTText = QLineEdit(self.gridLayoutWidget) self.gridLayout.addWidget(self.holdTText, 5, 1, 1, 1) self.numAverScansLabel = QLabel(self.gridLayoutWidget) self.gridLayout.addWidget(self.numAverScansLabel, 6, 0, 1, 1) self.numAverScansText = QLineEdit(self) self.gridLayout.addWidget(self.numAverScansText, 6, 1, 1, 1) self.delayBeforeMeasLabel = QLabel(self.gridLayoutWidget) self.gridLayout.addWidget(self.delayBeforeMeasLabel, 7, 0, 1, 1) self.delayBeforeMeasText = QLineEdit(self) self.gridLayout.addWidget(self.delayBeforeMeasText, 7, 1, 1, 1) self.trackingLabel = QLabel(self.centralwidget) self.trackingLabel.setGeometry(QRect(10, 280, 160, 16)) self.enableTrackingBox = QCheckBox(self.centralwidget) self.enableTrackingBox.setGeometry(QRect(160, 280, 87, 20)) self.pvModeLabel = QLabel(self.centralwidget) self.pvModeLabel.setGeometry(QRect(10, 300, 160, 16)) self.pvModeBox = QCheckBox(self.centralwidget) self.pvModeBox.setGeometry(QRect(160, 300, 87, 20)) self.gridLayoutWidget_2 = QWidget(self.centralwidget) self.gridLayoutWidget_2.setGeometry(QRect(10, 320, 330, 181)) self.gridLayout_2 = QGridLayout(self.gridLayoutWidget_2) self.gridLayout_2.setHorizontalSpacing(10) self.numPointsLabel = QLabel(self.gridLayoutWidget_2) self.gridLayout_2.addWidget(self.numPointsLabel, 0, 0, 1, 1) self.numPointsText = QSpinBox(self) self.gridLayout_2.addWidget(self.numPointsText, 0, 1, 1, 1) self.intervalLabel = QLabel(self.gridLayoutWidget_2) self.gridLayout_2.addWidget(self.intervalLabel, 1, 0, 1, 1) self.IntervalText = QLineEdit(self) self.gridLayout_2.addWidget(self.IntervalText, 1, 1, 1, 1) self.totTimePerDeviceLabel = QLabel(self.gridLayoutWidget_2) self.gridLayout_2.addWidget(self.totTimePerDeviceLabel, 2, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menuBar = QMenuBar(MainWindow) self.menuBar.setGeometry(QRect(0, 0, 772, 22)) self.menuBar.setObjectName("menubar") self.parent().viewWindowMenus(self.menuBar, self.parent()) MainWindow.setMenuBar(self.menuBar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.statusBar().showMessage("Acquisition: Ready", 5000) MainWindow.setWindowTitle("Acquisition Window") self.steadyStatLabel.setText("<qt><b>Steady State</b></qt>") self.minVLabel.setText("Min Voltage [V]") self.maxVLabel.setText("Max Voltage [V]") self.startVLabel.setText("Start Voltage [V]") self.stepVLabel.setText("Step Voltage [V]") self.gateVLabel.setText("Gate Voltage - SMU3 [V]") self.holdTLabel.setText("Hold time [s]") self.numAverScansLabel.setText("Number of averaged scans ") self.delayBeforeMeasLabel.setText("Delays before measurements [sec]") self.trackingLabel.setText("<qt><b>Track Voc, Jsc, MPP: </b></qt>") self.pvModeLabel.setText("<qt><b>PV mode: </b></qt>") self.numPointsLabel.setText("Number of points") self.intervalLabel.setText("Interval") self.totTimePerDeviceLabel.setText("Total time per device") self.saveButton = QPushButton(self.centralwidget) self.saveButton.setGeometry(QRect(250, 390, 80, 60)) self.saveButton.setText("Save") self.saveButton.clicked.connect(self.saveParameters) self.defaultButton = QPushButton(self.centralwidget) self.defaultButton.setGeometry(QRect(160, 390, 80, 60)) self.defaultButton.setText("Default") self.defaultButton.clicked.connect(self.defaultParameters) self.initParameters() self.minVText.editingFinished.connect(self.timePerDevice) self.maxVText.editingFinished.connect(self.timePerDevice) self.stepVText.editingFinished.connect(self.timePerDevice) self.numAverScansText.editingFinished.connect(self.timePerDevice) self.delayBeforeMeasText.editingFinished.connect(self.timePerDevice) self.holdTText.editingFinished.connect(self.timePerDevice) # Save acquisition parameters in configuration ini def saveParameters(self): self.parent().config.conf['Acquisition']['acqMinVoltage'] = str( self.minVText.text()) self.parent().config.conf['Acquisition']['acqMaxVoltage'] = str( self.maxVText.text()) self.parent().config.conf['Acquisition']['acqStartVoltage'] = str( self.startVText.text()) self.parent().config.conf['Acquisition']['acqStepVoltage'] = str( self.stepVText.text()) self.parent().config.conf['Acquisition']['acqGateVoltage'] = str( self.gateVText.text()) self.parent().config.conf['Acquisition']['acqHoldTime'] = str( self.holdTText.text()) self.parent().config.conf['Acquisition']['acqNumAvScans'] = str( self.numAverScansText.text()) self.parent().config.conf['Acquisition']['acqDelBeforeMeas'] = str( self.delayBeforeMeasText.text()) self.parent().config.conf['Acquisition']['acqTrackNumPoints'] = str( self.numPointsText.value()) self.parent().config.conf['Acquisition']['acqTrackInterval'] = str( self.IntervalText.text()) self.parent().config.conf['Acquisition']['acqPVmode'] = str( self.pvModeBox.isChecked()) self.parent().config.saveConfig(self.parent().config.configFile) self.parent().config.readConfig(self.parent().config.configFile) print("Acquisition parameters saved as default") logger.info("Acquisition parameters saved as default") self.timePerDevice() # Set default acquisition parameters from configuration ini def defaultParameters(self): self.parent().config.createConfig() self.parent().config.readConfig(self.parent().config.configFile) self.initParameters() print("Default acquisition parameters restored") logger.info("Default acquisition parameters restored") self.timePerDevice() # Populate acquisition panel with values from config def initParameters(self): self.minVText.setText(str(self.parent().config.acqMinVoltage)) self.maxVText.setText(str(self.parent().config.acqMaxVoltage)) self.startVText.setText(str(self.parent().config.acqStartVoltage)) self.stepVText.setText(str(self.parent().config.acqStepVoltage)) self.gateVText.setText(str(self.parent().config.acqGateVoltage)) self.holdTText.setText(str(self.parent().config.acqHoldTime)) self.numAverScansText.setText(str(self.parent().config.acqNumAvScans)) self.delayBeforeMeasText.setText( str(self.parent().config.acqDelBeforeMeas)) self.numPointsText.setValue(int( self.parent().config.acqTrackNumPoints)) self.IntervalText.setText(str(self.parent().config.acqTrackInterval)) self.pvModeBox.setChecked( eval(self.parent().config.conf['Acquisition']['acqPVmode'])) self.timePerDevice() # Field validator for VStart def validateVoltages(self): maxV = 100 minV = -100 try: validateStartVoltage = QDoubleValidator( float(self.minVText.text()), float(self.maxVText.text()), 6, self.startVText) validateMaxVoltage = QDoubleValidator(float(self.minVText.text()), maxV, 6, self.maxVText) validateMinVoltage = QDoubleValidator(minV, float(self.maxVText.text()), 6, self.minVText) except: pass if validateStartVoltage.validate(self.startVText.text(),1)[0] != 2 or \ validateMaxVoltage.validate(self.maxVText.text(),1)[0] != 2 or \ validateMinVoltage.validate(self.minVText.text(),1)[0] != 2: msg = "Sweep voltages (including Start) need to be \n between Vmin and Vmax"+\ "\n\nPlease change Voltages in the Acquisition panel" reply = QMessageBox.question(self, 'Critical', msg, QMessageBox.Ok) self.show() # Calculate the measurement time per device def timePerDevice(self): try: timePerDevice = (len(np.arange(float(self.minVText.text())-1e-9, float(self.maxVText.text())+1e-9, float(self.stepVText.text()))) * \ float(self.holdTText.text()) + \ float(self.delayBeforeMeasText.text())) * \ float(self.numAverScansText.text()) except: timePerDevice = 0 self.totTimePerDeviceLabel.setText(\ "Total time per device: <qt><b>{0:0.1f}s</b></qt>".format(timePerDevice)) # Enable and disable fields (flag is either True or False) during acquisition. def enableAcqPanel(self, flag): self.minVText.setEnabled(flag) self.maxVText.setEnabled(flag) self.startVText.setEnabled(flag) self.stepVText.setEnabled(flag) self.gateVText.setEnabled(flag) self.holdTText.setEnabled(flag) self.numAverScansText.setEnabled(flag) self.delayBeforeMeasText.setEnabled(flag) self.numPointsText.setEnabled(flag) self.IntervalText.setEnabled(flag) self.saveButton.setEnabled(flag) self.defaultButton.setEnabled(flag) self.enableTrackingBox.setEnabled(flag)
class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.minimize_to_tray = True self.alarm = AlarmDaemon(self) # Window definitions self.setMinimumSize(QSize(480, 320)) self.setWindowTitle("AthanPy") self.centralwidget = QWidget(self) self.centralwidget.setObjectName("centralwidget") # Layout definitions self.gridLayout_2 = QGridLayout(self.centralwidget) self.gridLayout_2.setObjectName("gridLayout_2") self.gridLayout = QGridLayout() self.gridLayout.setObjectName("gridLayout") # Widget definitions #self.txt_times = QLabel(self.centralwidget) #sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) #sizePolicy.setHorizontalStretch(0) #sizePolicy.setVerticalStretch(0) #sizePolicy.setHeightForWidth(self.txt_times.sizePolicy().hasHeightForWidth()) #self.txt_times.setSizePolicy(sizePolicy) #self.txt_times.setAlignment(Qt.AlignCenter) #self.txt_times.setObjectName("txt_times") #self.txt_times.setText(self.get_prayertime_text()) #self.gridLayout.addWidget(self.txt_times, 1, 0, 1, 1) self.lbl_prayername = {} self.lbl_prayertime = {} i = 1 for n in [ 'Fajr', 'Sunrise', 'Dhuhr', 'Asr', 'Maghrib', 'Isha', 'Midnight' ]: self.lbl_prayername[n] = QLabel(self.centralwidget) self.lbl_prayername[n].setAlignment(Qt.AlignLeft) self.lbl_prayername[n].setText(n) self.gridLayout.addWidget(self.lbl_prayername[n], i, 0, 1, 1) self.lbl_prayertime[n] = QLabel(self.centralwidget) self.lbl_prayertime[n].setAlignment(Qt.AlignCenter) self.gridLayout.addWidget(self.lbl_prayertime[n], i, 1, 1, 1) i += 1 self.set_prayertime() self.txt_date = QLabel(self.centralwidget) self.txt_date.setObjectName("txt_date") self.gridLayout.addWidget(self.txt_date, 0, 0, 1, 2) self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1) # Menu bar self.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(self) self.menubar.setGeometry(QRect(0, 0, 480, 20)) self.menubar.setObjectName("menubar") self.menuFile = QMenu(self.menubar) self.menuFile.setObjectName("menuFile") self.setMenuBar(self.menubar) # Status bar self.statusbar = QStatusBar(self) self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) self.actionSettings = QAction(self) self.actionSettings.setObjectName("actionSettings") self.actionSettings.setText("Settings") self.actionSettings.triggered.connect(self.show_settings) self.actionQuit = QAction(self) self.actionQuit.setObjectName("actionQuit") self.actionQuit.setText("Quit") self.actionQuit.triggered.connect(qApp.quit) self.menuFile.addAction(self.actionSettings) self.menuFile.addAction(self.actionQuit) self.menuFile.setTitle("File") self.menubar.addAction(self.menuFile.menuAction()) # QSystemTrayIcon self.tray_icon = QSystemTrayIcon(self) self.tray_icon.setIcon(self.style().standardIcon( QStyle.SP_ComputerIcon)) show_action = QAction("Show", self) hide_action = QAction("Hide", self) mute_action = QAction("Mute sound", self) stopsound_action = QAction("Stop sound", self) quit_action = QAction("Quit", self) show_action.triggered.connect(self.show) hide_action.triggered.connect(self.hide) mute_action.setCheckable(True) mute_action.changed.connect( lambda: self.alarm.set_mute(mute_action.isChecked())) stopsound_action.triggered.connect(self.alarm.stop_sound) quit_action.triggered.connect(QCoreApplication.quit) tray_menu = QMenu() tray_menu.addAction(show_action) tray_menu.addAction(hide_action) tray_menu.addSeparator() tray_menu.addAction(stopsound_action) tray_menu.addAction(mute_action) tray_menu.addSeparator() tray_menu.addAction(quit_action) self.tray_icon.setContextMenu(tray_menu) self.tray_icon.show() # Settings window self.settingswindow = SettingsWindow(self) def closeEvent(self, event): if self.minimize_to_tray: print('triggered 1') event.ignore() self.hide() self.tray_icon.showMessage("Tray Program", "Application was minimized to tray", QSystemTrayIcon.Information, 2000) def set_prayertime(self): SettingsManager.refreshVariables(self.show_settings) SettingsManager.calcTimes() times = SettingsManager.times # For testing purposes, comment/delete when not in use #times['dhuhr'] = '08:02' #times['asr'] = '08:03' # times['isha'] = '16:20' for n in [ 'Fajr', 'Sunrise', 'Dhuhr', 'Asr', 'Maghrib', 'Isha', 'Midnight' ]: self.lbl_prayertime[n].setText(times[n.lower()]) self.alarm.stop_alarm() self.alarm.schedule_alarm(times) self.alarm.start() #return output def show_settings(self): self.settingswindow.show()
class MainWindow(QMainWindow): def __init__(self): super().__init__(flags=QtCore.Qt.Window) self.setWindowIcon(QIcon(QPixmap(":/icon/codeblock_icon.svg"))) scale_x = QDesktopWidget().screenGeometry().width()/1920 scale_y = QDesktopWidget().screenGeometry().height()/1080 self.resize(1280*scale_x, 720*scale_y) self.centralwidget = QWidget() self.centralwidget.setObjectName("centralwidget") self.horizontalLayout = QHBoxLayout(self.centralwidget) self.horizontalLayout.setObjectName("horizontalLayout") self.splitter = QSplitter(self.centralwidget) self.tabWidget = QTabWidget(self.centralwidget) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(4) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth()) self.tabWidget.setSizePolicy(sizePolicy) self.tabWidget.setTabShape(QTabWidget.Rounded) self.tabWidget.setMovable(True) self.tabWidget.setObjectName("tabWidget") self.tab = QWidget() self.tab.setObjectName("tab") self.verticalLayout2 = QVBoxLayout(self.tab) self.classView = QTreeWidget(self.tab) self.classView.header().setVisible(False) self.verticalLayout2.addWidget(self.classView) self.tabWidget.addTab(self.tab, "") self.splitter.addWidget(self.tabWidget) self.tabWidget_2 = QTabWidget(self.centralwidget) self.tab_3 = QWidget() self.tab_3.setObjectName("tab_3") self.tabWidget_2.addTab(self.tab_3, "") self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 184, 148)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(7) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tabWidget_2.sizePolicy().hasHeightForWidth()) self.tabWidget_2.setSizePolicy(sizePolicy) self.tabWidget_2.setTabsClosable(False) self.tabWidget_2.setMovable(True) self.tabWidget_2.setObjectName("tabWidget_2") self.splitter.addWidget(self.tabWidget_2) self.horizontalLayout.addWidget(self.splitter) self.setCentralWidget(self.centralwidget) self.menubar = QMenuBar() self.menubar.setGeometry(QtCore.QRect(0, 0, 1280, 23)) self.menubar.setObjectName("menubar") self.menuFile = QMenu(self.menubar) self.menuHelp = QMenu(self.menubar) self.actionOpen = QAction(self) self.actionOpen.setText("Open") self.menuFile.addAction(self.actionOpen) self.menuFile.setTitle("File") self.menubar.addAction(self.actionOpen) self.actionAbout = QAction(self) self.actionAbout.setText("About Codeblock Visual Studio") self.actionTutorial = QAction(self) self.actionTutorial.setText("Rerun Tutorial") self.menuHelp.addAction(self.actionAbout) self.menuHelp.addAction(self.actionTutorial) self.menuHelp.setTitle("Help") self.menubar.addAction(self.menuHelp.menuAction()) self.setMenuBar(self.menubar) self.statusbar = QStatusBar() self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) self.frameLayout = QHBoxLayout(self.tab_3) self.scroll = QScrollArea() self.scrollContents = QWidget() self.scrollContents.setGeometry(QtCore.QRect(0, 0, 5000, 50000)) self.scrollLayout = QHBoxLayout(self.scrollContents) self.codeArea = QFrame(self.scrollContents) self.codeArea.setMinimumSize(QtCore.QSize(200, 2000)) self.scrollLayout.addWidget(self.codeArea) self.frameLayout.addWidget(self.scroll) self.scroll.setWidget(self.scrollContents) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), "Class View") self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_3), "Code Area")
class UI_MainWindow(object): def __init__(self, MainWindow): self.load_ui(MainWindow) def load_ui(self, MainWindow): # Set Main window and main widget MainWindow.setObjectName("MainWindow") MainWindow.resize(531, 693) MainWindow.setWindowTitle("Scope settings") self.MainWidget = QWidget(MainWindow) self.MainWidget.setObjectName("MainWidget") MainWindow.setCentralWidget(self.MainWidget) # Y-Scale of the signal self.comboBox_signal_y_scale = QComboBox(self.MainWidget) self.comboBox_signal_y_scale.setGeometry(QRect(10, 20, 85, 27)) self.comboBox_signal_y_scale.setObjectName("comboBox_signal_y_scale") self.label_signal_y_scale = QLabel(self.MainWidget) self.label_signal_y_scale.setGeometry(QRect(10, 60, 67, 17)) self.label_signal_y_scale.setObjectName("label_signal_y_scale") self.label_signal_y_scale.setText("Time (s)") # X-Scale of the signal self.spinBox_signal_x_scale = QSpinBox(self.MainWidget) # Integers self.spinBox_signal_x_scale.setGeometry(QRect(10, 80, 85, 27)) self.spinBox_signal_x_scale.setMinimum(1) self.spinBox_signal_x_scale.setMaximum(int(_BUFFER_DURATION)) self.spinBox_signal_x_scale.setProperty("value", 10) # Default 10s self.spinBox_signal_x_scale.setObjectName("spinBox_signal_x_scale") self.label_signal_x_scale = QLabel(self.MainWidget) self.label_signal_x_scale.setGeometry(QRect(10, 0, 67, 17)) self.label_signal_x_scale.setObjectName("label_signal_x_scale") self.label_signal_x_scale.setText("Scale") # CAR self.checkBox_car = QCheckBox(self.MainWidget) self.checkBox_car.setGeometry(QRect(120, 0, 97, 22)) self.checkBox_car.setObjectName("checkBox_car") self.checkBox_car.setText("CAR Filter") # BP Filter self.checkBox_bandpass = QCheckBox(self.MainWidget) self.checkBox_bandpass.setGeometry(QRect(120, 20, 141, 22)) self.checkBox_bandpass.setObjectName("checkBox_bandpass") self.checkBox_bandpass.setText("Bandpass Filter") # Set bandpass 'LOW' self.doubleSpinBox_bandpass_low = QDoubleSpinBox(self.MainWidget) # Floats self.doubleSpinBox_bandpass_low.setGeometry(QRect(250, 17, 69, 27)) self.doubleSpinBox_bandpass_low.setMinimum(0.1) self.doubleSpinBox_bandpass_low.setMaximum(1000.0) self.doubleSpinBox_bandpass_low.setSingleStep(1.0) self.doubleSpinBox_bandpass_low.setProperty("value", 1.0) # Default 1Hz self.doubleSpinBox_bandpass_low.setObjectName("doubleSpinBox_bandpass_low") # Set bandpass 'HIGH' self.doubleSpinBox_bandpass_high = QDoubleSpinBox(self.MainWidget) self.doubleSpinBox_bandpass_high.setGeometry(QRect(330, 17, 69, 27)) self.doubleSpinBox_bandpass_high.setMinimum(1.0) self.doubleSpinBox_bandpass_high.setMaximum(1000.0) self.doubleSpinBox_bandpass_high.setSingleStep(1.0) self.doubleSpinBox_bandpass_high.setProperty("value", 40.0) # Default 40Hz self.doubleSpinBox_bandpass_high.setObjectName("doubleSpinBox_bandpass_high") # Show LPT events self.checkBox_show_LPT_events = QCheckBox(self.MainWidget) self.checkBox_show_LPT_events.setGeometry(QRect(120, 80, 151, 22)) self.checkBox_show_LPT_events.setObjectName("checkBox_show_LPT_events") self.checkBox_show_LPT_events.setText("Show LPT events") # Lines self.line1 = QFrame(self.MainWidget) self.line1.setGeometry(QRect(100, -1, 21, 133)) self.line1.setFrameShape(QFrame.VLine) self.line1.setFrameShadow(QFrame.Sunken) self.line1.setObjectName("line1") self.line2 = QFrame(self.MainWidget) self.line2.setGeometry(QRect(110, 45, 421, 21)) self.line2.setFrameShape(QFrame.HLine) self.line2.setFrameShadow(QFrame.Sunken) self.line2.setObjectName("line2") self.line3 = QFrame(self.MainWidget) self.line3.setGeometry(QRect(290, 57, 21, 75)) self.line3.setFrameShape(QFrame.VLine) self.line3.setFrameShadow(QFrame.Sunken) self.line3.setObjectName("line3") # Start recording self.pushButton_start_recording = QPushButton(self.MainWidget) self.pushButton_start_recording.setGeometry(QRect(390, 60, 61, 31)) self.pushButton_start_recording.setObjectName("pushButton_start_recording") self.pushButton_start_recording.setText("REC") self.pushButton_start_recording.setEnabled(False) # Stop recording self.pushButton_stop_recording = QPushButton(self.MainWidget) self.pushButton_stop_recording.setGeometry(QRect(460, 60, 61, 31)) self.pushButton_stop_recording.setObjectName("pushButton_stop_recording") self.pushButton_stop_recording.setText("Stop REC") self.pushButton_stop_recording.setEnabled(False) # Set recording directory self.pushButton_set_recording_dir = QPushButton(self.MainWidget) self.pushButton_set_recording_dir.setGeometry(QRect(310, 60, 71, 31)) self.pushButton_set_recording_dir.setObjectName("pushButton_set_recording_dir") self.pushButton_set_recording_dir.setText("REC Dir") # Edit Line for the recording directory self.lineEdit_recording_dir = QLineEdit(self.MainWidget) self.lineEdit_recording_dir.setGeometry(QRect(310, 100, 211, 27)) self.lineEdit_recording_dir.setObjectName("lineEdit_recording_dir") # Table of channels self.table_channels = QTableWidget(self.MainWidget) self.table_channels.setGeometry(QRect(4, 131, 525, 503)) self.table_channels.setMaximumSize(QSize(529, 16777215)) self.table_channels.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.table_channels.setTextElideMode(QtCore.Qt.ElideMiddle) self.table_channels.setShowGrid(False) self.table_channels.setObjectName("table_channels") self.table_channels.setColumnCount(0) self.table_channels.setRowCount(0) self.table_channels.horizontalHeader().setVisible(False) self.table_channels.horizontalHeader().setHighlightSections(False) self.table_channels.verticalHeader().setVisible(False) self.table_channels.verticalHeader().setHighlightSections(False) # Bottom status Bar self.statusBar = QStatusBar(MainWindow) self.statusBar.setObjectName("statusBar") MainWindow.setStatusBar(self.statusBar)
class TfrmBase(QMainWindow, TScreenStates): recordCount = 0 def __init__(self, parent=None): super(TfrmBase, self).__init__() self.FOnStateChange = self.onStateChange self.activeState = self.ssInactive self._defaultSettings() self._createWidgets() self._setEvents() def _defaultSettings(self): self.setObjectName("frmBase") self.resize(640, 480) self.setMinimumSize(QSize(640, 480)) def _createWidgets(self): self._createLayout() self._createMenus() self._createToolBar() self._createStatusBar() self._createPages() self._setLayouts() def _createLayout(self): self.clientArea = QWidget() self.clientArea.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) self.clientArea.setMinimumSize(QSize(640, 400)) self.clientArea.setBaseSize(QSize(640, 400)) self.clientArea.setLayoutDirection(Qt.LeftToRight) self.clientArea.setObjectName("clientArea") self.gridLayout = QGridLayout(self.clientArea) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setSpacing(0) self.gridLayout.setObjectName("gridLayout") def _createMenus(self): # Create a Menu Bar self.mnMenu = self.menuBar() self.mnMenu.setObjectName("mnMenu") # Create all Top Menus self.mnApp = QMenu('&Aplicação') self.mnApp.setObjectName('mnApp') self.mnOpe = QMenu('&Operação') self.mnOpe.setObjectName("mnOperations") self.mnNav = QMenu('&Navegação') self.mnNav.setObjectName("mnNav") # Set Menus to MenuBar self.mnMenu.addMenu(self.mnNav) self.mnMenu.addMenu(self.mnOpe) self.mnMenu.addMenu(self.mnApp) # Crealte all Actions to Application Menu self._createAppActions() self._createOpeActions() self._setMenuActions() self.mnMenu.addAction(self.mnApp.menuAction()) self.mnMenu.addAction(self.mnOpe.menuAction()) self.mnMenu.addAction(self.mnNav.menuAction()) self._settingActionsEvents() def _createAppActions(self): # Exit Program Action self.acExit = QAction( self.getIcon("./resources/exit.ico", QSize(32, 32)), '&Sair') self.acExit.setObjectName("acExit") self.acExit.setShortcut('Ctrl+Q') self.acExit.setStatusTip('Finalizar o Programa') self.acExit.triggered.connect(self.closeApp) def _createOpeActions(self): # Search Action self.acSearch = QAction( self.getIcon("./resources/Search.ico", QSize(32, 32)), '&Pesquisar') self.acSearch.setObjectName("acSearch") self.acSearch.setShortcut('F5,Ctrl+P') self.acSearch.setStatusTip( 'Preenche o Filtro para Selecionar Registros') # List Action self.acList = QAction( self.getIcon("./resources/list.ico", QSize(32, 32)), '&Listar') self.acList.setShortcut('Ctrl+L') self.acList.setStatusTip('Listar todos os Registros') self.acList.setObjectName("acList") # Insert Action self.acInsert = QAction( self.getIcon("./resources/db_add.ico", QSize(32, 32)), '&Inserir') self.acInsert.setShortcut('F2,Ins') self.acInsert.setStatusTip('Incluir Novo Registros') self.acInsert.setObjectName("acInsert") # Update Action self.acUpdate = QAction( self.getIcon("./resources/db_update.ico", QSize(32, 32)), '&Editar') self.acUpdate.setShortcut('Ctrl+U') self.acUpdate.setStatusTip('Editar o Registro Atual') self.acUpdate.setObjectName("acUpdate") # Delete Action self.acDelete = QAction( self.getIcon("./resources/db_remove.ico", QSize(32, 32)), '&Excluir') self.acDelete.setShortcut('Ctrl+Del') self.acDelete.setStatusTip('Exclui o Registro Atual') self.acDelete.setObjectName("acDelete") # Save Action self.acSave = QAction( self.getIcon("./resources/db_commit.ico", QSize(32, 32)), '&Salvar') self.acSave.setShortcut('F10,Ctrl+S') self.acSave.setStatusTip('Salva as Alterações do Registro') self.acSave.setObjectName("acSave") # Cancel Action self.acCancel = QAction( self.getIcon("./resources/cancel.ico", QSize(32, 32)), '&Cancelar') self.acCancel.setShortcut('Esc') self.acCancel.setStatusTip('Cancela as Alterações do Registro') self.acCancel.setObjectName("acCancel") # First Action self.acFirst = QAction( self.getIcon("./resources/start.ico", QSize(32, 32)), '&Início') self.acFirst.setShortcut('Ctrl+Left') self.acFirst.setStatusTip('Vai para o Primeiro Registro') self.acFirst.setObjectName("acFirst") # Prior Action self.acPrior = QAction( self.getIcon("./resources/left.ico", QSize(32, 32)), '&Anterior') self.acPrior.setShortcut('Left') self.acPrior.setStatusTip('Vai para o Registro Anterior') self.acPrior.setObjectName("acPrior") # Next Action self.acNext = QAction( self.getIcon("./resources/right.ico", QSize(32, 32)), '&Próximo') self.acNext.setShortcut('Right') self.acNext.setStatusTip('Vai para o Próximo Registro') self.acNext.setObjectName("acNext") # Last Action self.acLast = QAction( self.getIcon("./resources/end.ico", QSize(32, 32)), '&Último') self.acLast.setShortcut('Ctrl+Right') self.acLast.setStatusTip('Vai para o Último Registro') self.acLast.setObjectName("acLast") # Form Title Action self.dcTitle = QAction() font = QFont() font.setPointSize(14) font.setBold(True) font.setWeight(75) self.dcTitle.setFont(font) self.dcTitle.setObjectName("dcTitle") def getIcon(self, res: str, size: QSize) -> QIcon: icon = QIcon() icon.addPixmap( QPixmap(res).scaled(size.width(), size.height(), Qt.KeepAspectRatio), QIcon.Active, QIcon.On) return icon def _setMenuActions(self): # Set Menu Application Actions self.mnApp.addAction(self.acExit) # Set Menu Operations Actions self.mnOpe.addAction(self.acSearch) self.mnOpe.addAction(self.acList) self.mnOpe.addSeparator() self.mnOpe.addAction(self.acInsert) self.mnOpe.addAction(self.acUpdate) self.mnOpe.addAction(self.acDelete) self.mnOpe.addSeparator() self.mnOpe.addAction(self.acSave) self.mnOpe.addAction(self.acCancel) # Set Menu Navigation Actions self.mnNav.addAction(self.acFirst) self.mnNav.addAction(self.acPrior) self.mnNav.addAction(self.acNext) self.mnNav.addAction(self.acLast) def _settingActionsEvents(self): # Set Menu Operations Trigger onClick self.acSearch.triggered.connect( lambda: self.setFormStatus(self.ssSearch)) self.acList.triggered.connect( lambda: self.setFormStatus(self.ssSearchAll)) self.acInsert.triggered.connect( lambda: self.setFormStatus(self.ssInsert)) self.acUpdate.triggered.connect( lambda: self.setFormStatus(self.ssUpdate)) self.acDelete.triggered.connect( lambda: self.setFormStatus(self.ssDelete)) self.acSave.triggered.connect(lambda: self.setFormStatus(self.ssPost)) self.acCancel.triggered.connect( lambda: self.setFormStatus(self.ssCancel)) # Set Menu Navigation Trigger onClick self.acFirst.triggered.connect( lambda: self.setFormStatus(self.ssFirst)) self.acPrior.triggered.connect( lambda: self.setFormStatus(self.ssPrior)) self.acNext.triggered.connect(lambda: self.setFormStatus(self.ssNext)) self.acLast.triggered.connect(lambda: self.setFormStatus(self.ssLast)) def _createToolBar(self): # Create a tbActions ToolBar self.tbActions = QToolBar() self.tbActions.setMinimumSize(QSize(300, 34)) self.tbActions.setMaximumSize(QSize(16777215, 34)) self.tbActions.setBaseSize(QSize(300, 34)) self.tbActions.setAcceptDrops(False) self.tbActions.setToolTipDuration(3) self.tbActions.setAllowedAreas(Qt.TopToolBarArea) self.tbActions.setObjectName("tbActions") self.addToolBar(Qt.TopToolBarArea, self.tbActions) # Create a tbTitle ToolBar self.tbTitle = QToolBar() self.tbTitle.setMinimumSize(QSize(340, 34)) self.tbTitle.setMaximumSize(QSize(16777215, 34)) self.tbTitle.setBaseSize(QSize(341, 34)) self.tbTitle.setAllowedAreas(Qt.TopToolBarArea) self.tbTitle.setToolButtonStyle(Qt.ToolButtonTextOnly) self.tbTitle.setFloatable(False) self.tbTitle.setObjectName("tbTitle") # self.tbTitle.setLabelAlignment(Qt.AlignHCenter | Qt.AlignVCenter) self.addToolBar(Qt.TopToolBarArea, self.tbTitle) # Call Add Actions to ToolBar self._setToolBarActions() def _setToolBarActions(self): # Set ToolBar Actions self.tbActions.addAction(self.acSearch) self.tbActions.addAction(self.acInsert) self.tbActions.addAction(self.acUpdate) self.tbActions.addAction(self.acDelete) self.tbActions.addSeparator() self.tbActions.addAction(self.acSave) self.tbActions.addAction(self.acExit) self.tbTitle.addAction(self.dcTitle) def _createStatusBar(self): self.sbStatus = QStatusBar() self.sbStatus.setMaximumHeight(24) self.sbStatus.setObjectName("sbStatus") self.sbStatus.setStyleSheet(""" .QLabel { background-color: #FFFFFF; color: #000000; } """) self.lbStatus = QLabel(self.sbStatus) self.lbStatus.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) self.lbStatus.setText('Inactive') self.lbStatus.setMinimumSize(QSize(130, 15)) self.lbStatus.setFrameShape(QFrame.Panel) self.lbStatus.setFrameShadow(QFrame.Sunken) self.sbStatus.addPermanentWidget(self.lbStatus) self.setStatusBar(self.sbStatus) def _createPages(self): self.tabMain = QTabWidget(self.clientArea) self.tabMain.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) self.tabMain.setTabPosition(QTabWidget.South) self.tabMain.setObjectName("tabMain") self.pgList = QWidget(self.tabMain) self.pgList.setObjectName("pgList") self.pgDetail = QWidget(self.tabMain) self.pgDetail.setObjectName("pgDetail") self.tabMain.addTab(self.pgList, "") self.tabMain.addTab(self.pgDetail, "") self._createPageListContent() def _createPageListContent(self): self.treeWidget = QTreeWidget(self.pgList) self.treeWidget.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) self.treeWidget.setFrameShape(QFrame.NoFrame) self.treeWidget.setFrameShadow(QFrame.Plain) self.treeWidget.setColumnCount(3) self.treeWidget.setObjectName("treeWidget") self.treeWidget.headerItem().setText(0, "Campo") self.treeWidget.headerItem().setText(1, "Campo") self.treeWidget.headerItem().setText(2, "Campo") self.treeWidget.setGeometry(QRect(0, 0, 640, 370)) self.treeWidget.setMinimumSize(QSize(640, 370)) self.tabMain.setCurrentIndex(0) def _setLayouts(self): self.gridLayout.addWidget(self.tabMain, 0, Qt.AlignBottom | Qt.AlignRight, 1, 1) self.setCentralWidget(self.clientArea) def translateForm(self): self._translate = QCoreApplication.translate self.setWindowTitle( self._translate("TfrmBase", "Tela de Básica de Cadastros")) self.mnApp.setTitle(self._translate("TfrmBase", "Aplicação")) self.mnOpe.setTitle(self._translate("TfrmBase", "Operações")) self.mnNav.setTitle(self._translate("TfrmBase", "Navegação")) self.sbStatus.setToolTip(self._translate("TfrmBase", "Barra de Status")) self.tbActions.setWindowTitle( self._translate("TfrmBase", "Ferramentas")) self.tbActions.setToolTip( self._translate("TfrmBase", "Barra de Ferramentas")) self.tbTitle.setWindowTitle(self._translate("TfrmBase", "Descrição")) self.acExit.setText(self._translate("TfrmBase", "&Sair")) self.acExit.setToolTip(self._translate("TfrmBase", "Sair do Programa")) self.acSearch.setText(self._translate("TfrmBase", "&Pesquisar")) self.acSearch.setStatusTip( self._translate("TfrmBase", "Procurar Por um Registro")) self.acList.setText(self._translate("TfrmBase", "&Listar Todos")) self.acList.setStatusTip( self._translate("TfrmBase", "Lista todos os Registros")) self.acInsert.setText(self._translate("TfrmBase", "&Inserir")) self.acInsert.setStatusTip( self._translate("TfrmBase", "Adicionar Registro")) self.acUpdate.setText(self._translate("TfrmBase", "&Editar")) self.acUpdate.setStatusTip( self._translate("TfrmBase", "Editar Registro")) self.acDelete.setText(self._translate("TfrmBase", "E&xcluir")) self.acDelete.setStatusTip( self._translate("TfrmBase", "Excluir Registro")) self.acSave.setText(self._translate("TfrmBase", "&Salvar")) self.acSave.setToolTip(self._translate("TfrmBase", "Salvar Registro")) self.acCancel.setText(self._translate("TfrmBase", "&Cancelar")) self.acCancel.setToolTip( self._translate("TfrmBase", "Cencelar Alterações")) self.dcTitle.setText( self._translate("TfrmBase", "Título da Tela de Cadastros")) self.dcTitle.setToolTip( self._translate("TfrmBase", "Título da Tela de Cadastros")) self.tabMain.setTabText( self.tabMain.indexOf(self.pgList), self._translate("TfrmBase", "Lista dos Registros")) self.tabMain.setTabToolTip( self.tabMain.indexOf(self.pgList), self._translate("TfrmBase", "Listagem das Ferramentas")) self.tabMain.setTabText( self.tabMain.indexOf(self.pgDetail), self._translate("TfrmBase", "Detalhes do Registro Selecionando")) @property def activeState(self): return self._activeValue @property def activeStateColor(self): return self.activeValue['FG'] @property def activeStateBackgroud(self): return self.activeValue['BG'] @activeState.setter # Seta a Propriedade _activeState def activeState(self, value: int): self.workValue = value self._activeState = value def setScreenState(self, stt: int): self.acExit.setEnabled(self.inBrowse(stt)) # Set Menu Operations Actions self.acSearch.setEnabled((self.inBrowse(stt) or (self.recordCount == 0))) self.acList.setEnabled((self.inBrowse(stt) or (self.recordCount == 0))) self.acInsert.setEnabled(self.inBrowse(stt)) self.acUpdate.setEnabled((self.inBrowse(stt) and (self.recordCount > 0))) self.acDelete.setEnabled((self.inBrowse(stt) and (self.recordCount > 0))) self.acSave.setEnabled(self.inUpdate(stt)) self.acCancel.setEnabled(self.inUpdate(stt)) # Set Menu Navigation Actions self.acFirst.setEnabled((self.inBrowse(stt) and (self.recordCount > 0))) self.acPrior.setEnabled((self.inBrowse(stt) and (self.recordCount > 0))) self.acNext.setEnabled((self.inBrowse(stt) and (self.recordCount > 0))) self.acLast.setEnabled((self.inBrowse(stt) and (self.recordCount > 0))) # Set tab Main if state in Browse enabled self.tabMain.setEnabled(self.inBrowse(stt)) def _layoutWidgets(self): return (self.frmLayout.itemAt(i) for i in range(self.frmLayout.count())) def _getAllFields(self): arrFields = [] for w in self._layoutWidgets(): if (not (isinstance(w, QLabel))): arrFields.append(w) return arrFields def setEnableFields(self, enable: bool = True): # Enable All Fields for controls in self._layoutWidgets(): QWidget(controls).setEnabled(enable) def clearFields(self): # cliar content of all fileds for controls in self._getAllFields(): QWidget(controls).setText('') def setColorFields(self): # cliar content of all fileds style = ".QWidget { backgroud-color: " + self.activeStateBackgroud + "; }" for controls in self._getAllFields(): QWidget(controls).setStyle(style) def showDataDetails(self): # move data of selected record to fileds if (self.tabMain.currentIndex() == 0): self.tabMain.setCurrentIndex(1) def filterRecord(self): raise NotImplementedError(500) def getFirstRecord(self): raise NotImplementedError(500) def getPriorRecord(self): raise NotImplementedError(500) def getNextRecord(self): raise NotImplementedError(500) def getLastRecord(self): raise NotImplementedError(500) def insertRecord(self): raise NotImplementedError(500) def deleteRecord(self): raise NotImplementedError(500) def updateRecord(self): raise NotImplementedError(500) def postRecord(self): raise NotImplementedError(500) def execOpertations(self, state: int): if ((state == self.ssFilter) or (state == self.ssSearchAll)): self.filterRecord() elif (state == self.ssFirst): self.getFirstRecord() elif (state == self.ssPrior): self.getPriorRecord() elif (state == self.ssNext): self.getNextRecord() elif (state == self.ssLast): self.getLastRecord() elif (state == self.ssInsert): self.insertRecord() elif (state == self.ssDelete): self.deleteRecord() elif (state == self.ssUpdate): self.updateRecord() elif (state == self.ssPost): self.postRecord() else: raise NotImplementedError(401, 'Operação não suportada') @pyqtSlot(int) def setFormStatus(self, state: int): if ((state == self.ssSearch) and (self.activeState != state)): self.clearFields() self.setColorFields() self.showDataDetails() if (self.activeState != state): self.activeState = state if (state == self.ssCancel): self.activeState = self.ssBrowse @pyqtSlot(int, int, dict, str) def onStateChange(self, NewState: int, OldState: int, Result: dict = {}, Err: str = ''): try: # show screen state on status bar state = self.getStateProperties(NewState) style = '.QLabel { background-color: ' + state[ 'BG'] + '; color: ' + state['FG'] + '; }' self.sbStatus.setStyleSheet(style) self.lbStatus.setText(state['Descr']) # call operation into child screen self.execOpertations(NewState) # change buttons states self.setScreenState(NewState) # set result status code and result satatus Message self.setResultStatusCode = 200 self.setResultStatusMessage = '' except Exception as e: self.ResultStatusCode = 200 self.ResultStatusMessage = str(e) QMessageBox.critical(self, self.windowTitle(), self.ResultStatusMessage) return self.result @pyqtSlot() def tabMainChanged(self): self.sbStatus.showMessage('TabMain change tabIndex to (' + str(self.tabMain.currentIndex()) + ')!') if (self.tabMain.currentIndex() == 1): self.showDataDetails() @pyqtSlot() def InsertData(self): # self.sbStatus.showMessage('Prepare to insert data....') pass def _setEvents(self): self.tabMain.blockSignals( True) # just for not showing the initial message self.tabMain.currentChanged.connect(self.tabMainChanged) # changed! self.tabMain.blockSignals(False) # wait signals now @pyqtSlot() def closeApp(self): self.close()
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.lastyear = int(time.strftime('%Y', time.localtime(time.time()))) - 1 self.in_parameters = {u'datetime': str(self.lastyear) + u'年', u'target_area': u'绍兴市', u'density_cell': u'10', u'density_class': 10, u'day_cell': u'15', u'day_class': 10, u'out_type': u'tiff'} self.setupUi() def setupUi(self): self.setObjectName("MainWindow") self.setFixedSize(1040, 915) sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) self.setSizePolicy(sizePolicy) icon = QIcon() icon.addPixmap(QPixmap('./resource/weather-thunder.png'),QIcon.Normal, QIcon.Off) self.setWindowIcon(icon) self.centralwidget = QWidget(self) sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth()) self.centralwidget.setSizePolicy(sizePolicy) self.centralwidget.setObjectName("centralwidget") self.layoutWidget = QWidget(self.centralwidget) self.layoutWidget.setGeometry(QRect(32, 10, 979, 851)) self.layoutWidget.setObjectName("layoutWidget") self.verticalLayout_5 =QVBoxLayout(self.layoutWidget) self.verticalLayout_5.setContentsMargins(0, 0, 0, 0) self.verticalLayout_5.setObjectName("verticalLayout_5") self.horizontalLayout = QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") spacerItem = QSpacerItem(300, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.datetime_label = QLabel(self.layoutWidget) self.datetime_label.setObjectName("datetime_label") self.horizontalLayout.addWidget(self.datetime_label) self.datetime = QDateEdit(self.layoutWidget) self.datetime.setDateTime(QDateTime(QDate(self.lastyear, 1, 1), QTime(0, 0, 0))) self.datetime.setObjectName("datetime") self.horizontalLayout.addWidget(self.datetime) spacerItem1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.target_area_label = QLabel(self.layoutWidget) self.target_area_label.setObjectName("target_area_label") self.horizontalLayout.addWidget(self.target_area_label) self.target_area = QComboBox(self.layoutWidget) self.target_area.setObjectName("target_area") self.target_area.addItem("") self.target_area.addItem("") self.target_area.addItem("") self.target_area.addItem("") self.target_area.addItem("") self.target_area.addItem("") self.horizontalLayout.addWidget(self.target_area) spacerItem2 = QSpacerItem(300, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem2) self.verticalLayout_5.addLayout(self.horizontalLayout) self.tabWidget = QTabWidget(self.layoutWidget) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth()) self.tabWidget.setSizePolicy(sizePolicy) self.tabWidget.setObjectName("tabWidget") self.density_tab = QWidget() self.density_tab.setObjectName("density_tab") self.verticalLayout_3 =QVBoxLayout(self.density_tab) self.verticalLayout_3.setObjectName("verticalLayout_3") self.verticalLayout_2 =QVBoxLayout() self.verticalLayout_2.setObjectName("verticalLayout_2") self.horizontalLayout_2 = QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.density_cell_label = QLabel(self.density_tab) self.density_cell_label.setObjectName("density_cell_label") self.horizontalLayout_2.addWidget(self.density_cell_label) self.density_cell = QSpinBox(self.density_tab) self.density_cell.setProperty("value", 10) self.density_cell.setObjectName("density_cell") self.horizontalLayout_2.addWidget(self.density_cell) spacerItem3 = QSpacerItem(40, 0, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem3) self.density_class_label = QLabel(self.density_tab) self.density_class_label.setObjectName("density_class_label") self.horizontalLayout_2.addWidget(self.density_class_label) self.density_class = QSpinBox(self.density_tab) self.density_class.setProperty("value", 10) self.density_class.setObjectName("density_class") self.horizontalLayout_2.addWidget(self.density_class) spacerItem4 = QSpacerItem(478, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem4) self.density_mxd = QPushButton(self.density_tab) self.density_mxd.setObjectName("density_mxd") self.horizontalLayout_2.addWidget(self.density_mxd) self.verticalLayout_2.addLayout(self.horizontalLayout_2) self.density_view = QGraphicsView(self.density_tab) self.density_view.setObjectName("density_view") self.verticalLayout_2.addWidget(self.density_view) self.verticalLayout_3.addLayout(self.verticalLayout_2) self.tabWidget.addTab(self.density_tab, "") self.day_tab = QWidget() self.day_tab.setObjectName("day_tab") self.verticalLayout_4 =QVBoxLayout(self.day_tab) self.verticalLayout_4.setObjectName("verticalLayout_4") self.verticalLayout =QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout_3 =QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.day_cell_label = QLabel(self.day_tab) sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.day_cell_label.sizePolicy().hasHeightForWidth()) self.day_cell_label.setSizePolicy(sizePolicy) self.day_cell_label.setObjectName("day_cell_label") self.horizontalLayout_3.addWidget(self.day_cell_label) self.day_cell = QSpinBox(self.day_tab) self.day_cell.setProperty("value", 15) self.day_cell.setObjectName("day_cell") self.horizontalLayout_3.addWidget(self.day_cell) spacerItem5 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem5) self.day_class_label = QLabel(self.day_tab) self.day_class_label.setObjectName("day_class_label") self.horizontalLayout_3.addWidget(self.day_class_label) self.day_class = QSpinBox(self.day_tab) self.day_class.setProperty("value", 10) self.day_class.setObjectName("day_class") self.horizontalLayout_3.addWidget(self.day_class) spacerItem6 = QSpacerItem(478, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem6) self.day_mxd = QPushButton(self.day_tab) self.day_mxd.setObjectName("day_mxd") self.horizontalLayout_3.addWidget(self.day_mxd) self.verticalLayout.addLayout(self.horizontalLayout_3) self.day_view = QGraphicsView(self.day_tab) self.day_view.setObjectName("day_view") self.verticalLayout.addWidget(self.day_view) self.verticalLayout_4.addLayout(self.verticalLayout) self.tabWidget.addTab(self.day_tab, "") self.verticalLayout_5.addWidget(self.tabWidget) self.horizontalLayout_4 =QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.progressBar = QProgressBar(self.layoutWidget) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.progressBar.sizePolicy().hasHeightForWidth()) self.progressBar.setSizePolicy(sizePolicy) self.progressBar.setProperty("value", 0) self.progressBar.setObjectName("progressBar") self.horizontalLayout_4.addWidget(self.progressBar) self.execute_button = QPushButton(self.layoutWidget) sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.execute_button.sizePolicy().hasHeightForWidth()) self.execute_button.setSizePolicy(sizePolicy) self.execute_button.setObjectName("execute_button") self.horizontalLayout_4.addWidget(self.execute_button) self.verticalLayout_5.addLayout(self.horizontalLayout_4) self.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(self) self.menubar.setGeometry(QRect(0, 0, 1040, 26)) self.menubar.setObjectName("menubar") self.file_menu = QMenu(self.menubar) self.file_menu.setObjectName("file_menu") self.help_menu = QMenu(self.menubar) self.help_menu.setObjectName("help_menu") self.setMenuBar(self.menubar) self.statusbar = QStatusBar(self) self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) self.action_add_data = QAction(self) self.action_add_data.setObjectName("action_add_data") self.action_help = QAction(self) self.action_help.setObjectName("action_help") self.action_about = QAction(self) self.action_about.setObjectName("action_about") self.action_save_pic = QAction(self) self.action_save_pic.setObjectName("action_save_pic") self.file_menu.addAction(self.action_add_data) self.file_menu.addAction(self.action_save_pic) self.help_menu.addAction(self.action_help) self.help_menu.addAction(self.action_about) self.menubar.addAction(self.file_menu.menuAction()) self.menubar.addAction(self.help_menu.menuAction()) self.retranslateUi() self.tabWidget.setCurrentIndex(0) QMetaObject.connectSlotsByName(self) self.center() self.show() self.target_area.activated[str].connect(self.updateTargetArea) self.datetime.dateChanged.connect(self.updateDatetime) self.density_cell.valueChanged.connect(self.updateDensityCell) self.density_class.valueChanged.connect(self.updateDensityClass) self.day_cell.valueChanged.connect(self.updateDayCell) self.day_class.valueChanged.connect(self.updateDayClass) self.action_add_data.triggered.connect(self.addData) self.action_save_pic.triggered.connect(self.savePic) self.action_about.triggered.connect(self.showAbout) self.action_help.triggered.connect(self.showHelp) self.execute_button.clicked.connect(self.execute) self.density_mxd.clicked.connect(self.openMxdDensity) self.day_mxd.clicked.connect(self.openMxdDay) self.density_mxd.setDisabled(True) self.day_mxd.setDisabled(True) self.action_save_pic.setDisabled(True) def execute(self): dir = u"E:/Documents/工作/雷电公报/闪电定位原始文本数据/" + self.in_parameters[u'datetime'] if os.path.exists(dir): datafiles = os.listdir(dir) datafiles = map(lambda x:os.path.join(dir,x),datafiles) self.in_parameters[u'origin_data_path'] = datafiles if not self.in_parameters.has_key(u'origin_data_path'): message = u"请加载%s的数据" % self.in_parameters[u'datetime'] msgBox = QMessageBox() msgBox.setText(message) msgBox.setIcon(QMessageBox.Information) icon = QIcon() icon.addPixmap(QPixmap('./resource/weather-thunder.png'), QIcon.Normal, QIcon.Off) msgBox.setWindowIcon(icon) msgBox.setWindowTitle(" ") msgBox.exec_() return self.execute_button.setDisabled(True) self.execute_button.setText(u'正在制图中……') self.progressBar.setMaximum(0) self.progressBar.setMinimum(0) self.action_add_data.setDisabled(True) self.target_area.setDisabled(True) self.datetime.setDisabled(True) self.density_cell.setDisabled(True) self.density_class.setDisabled(True) self.day_cell.setDisabled(True) self.day_class.setDisabled(True) # for outfile in self.in_parameters[u'origin_data_path']: # infile = # try: # with open(infile, 'w+') as in_f: # for line in in_f: # line = line.replace(u":",":") # in_f.write(line) # except Exception,inst: # print infile self.process_thread = WorkThread() self.process_thread.trigger.connect(self.finished) self.process_thread.beginRun(self.in_parameters) def finished(self): #绘制闪电密度图 ##清除上一次的QGraphicsView对象,防止其记录上一次图片结果,影响显示效果 self.density_view.setAttribute(Qt.WA_DeleteOnClose) self.verticalLayout_2.removeWidget(self.density_view) size = self.density_view.size() self.density_view.close() self.density_view = QGraphicsView(self.density_tab) self.density_view.setObjectName("density_view") self.density_view.resize(size) self.verticalLayout_2.addWidget(self.density_view) densityPic = ''.join([cwd,u'/bulletinTemp/', self.in_parameters[u'datetime'],u'/',self.in_parameters[u'datetime'], self.in_parameters[u'target_area'],u'闪电密度空间分布.tif']) scene = QGraphicsScene() pixmap_density = QPixmap(densityPic) scene.addPixmap(pixmap_density) self.density_view.setScene(scene) scale = float(self.density_view.width()) / pixmap_density.width() self.density_view.scale(scale, scale) #绘制雷暴日图 self.day_view.setAttribute(Qt.WA_DeleteOnClose) self.verticalLayout.removeWidget(self.day_view) size = self.day_view.size() self.day_view.close() self.day_view = QGraphicsView(self.day_tab) self.day_view.setObjectName("day_view") self.day_view.resize(size) self.verticalLayout.addWidget(self.day_view) dayPic = ''.join([cwd,u'/bulletinTemp/', self.in_parameters[u'datetime'],u'/',self.in_parameters[u'datetime'], self.in_parameters[u'target_area'],u'地闪雷暴日空间分布.tif']) pixmap_day = QPixmap(dayPic) scene = QGraphicsScene() scene.addPixmap(pixmap_day) self.day_view.resize(self.density_view.width(),self.density_view.height()) self.day_view.setScene(scene) scale = float(self.day_view.width()) / pixmap_day.width() self.day_view.scale(scale, scale) #处理进度条和执行按钮状态 self.progressBar.setMinimum(0) self.progressBar.setMaximum(100) self.progressBar.setValue(100) self.progressBar.setFormat(u'完成!') self.execute_button.setDisabled(False) self.execute_button.setText(u'执行') #改变一些控件的状态 self.action_add_data.setDisabled(False) self.target_area.setDisabled(False) self.datetime.setDisabled(False) self.density_cell.setDisabled(False) self.density_class.setDisabled(False) self.day_cell.setDisabled(False) self.day_class.setDisabled(False) self.density_mxd.setDisabled(False) self.day_mxd.setDisabled(False) self.action_save_pic.setDisabled(False) def addData(self): fnames = QFileDialog.getOpenFileNames(self, u'请选择原始的电闪数据', u'E:/Documents/工作/雷电公报/闪电定位原始文本数据', 'Text files (*.txt);;All(*.*)') self.in_parameters[u'origin_data_path'] = fnames[0] def savePic(self): densityPic = ''.join([cwd,u'/bulletinTemp/',self.in_parameters[u'datetime'],u'/', self.in_parameters[u'target_area'],'.gdb',u'/',self.in_parameters[u'datetime'], self.in_parameters[u'target_area'],u'闪电密度空间分布.tif']) dayPic = ''.join([cwd,u'/bulletinTemp/',self.in_parameters[u'datetime'],u'/', self.in_parameters[u'target_area'],'.gdb',u'/',self.in_parameters[u'datetime'], self.in_parameters[u'target_area'],u'地闪雷暴日空间分布.tif']) directory = QFileDialog.getExistingDirectory(self,u'请选择图片保存位置', u'E:/Documents/工作/雷电公报', QFileDialog.ShowDirsOnly|QFileDialog.DontResolveSymlinks) dest_density = os.path.join(directory,os.path.basename(densityPic)) dest_day = os.path.join(directory,os.path.basename(dayPic)) if os.path.isfile(dest_day) or os.path.isfile(dest_density): message = u"文件已经存在!" msgBox = QMessageBox() msgBox.setText(message) msgBox.setIcon(QMessageBox.Information) icon = QIcon() icon.addPixmap(QPixmap("./resource/weather-thunder.png"), QIcon.Normal, QIcon.Off) msgBox.setWindowIcon(icon) msgBox.setWindowTitle(" ") msgBox.exec_() return move(dayPic,directory) move(densityPic,directory) def openMxdDay(self): program = u'C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe' src_dir = ''.join([cwd,u'/data/LightningBulletin.gdb']) dest_dir = ''.join([cwd,u"/bulletinTemp/",self.in_parameters[u'datetime'], u"/" , self.in_parameters[u'target_area']]) src_file = ''.join([self.in_parameters[u'target_area'] , u"地闪雷暴日空间分布模板.mxd"]) copy(os.path.join(src_dir,src_file),dest_dir) arguments = [os.path.join(dest_dir,src_file)] self.process = QProcess(self) self.process.start(program,arguments) def openMxdDensity(self): program = u'C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe' src_dir = ''.join([cwd,u'/data/LightningBulletin.gdb']) dest_dir = ''.join([cwd,u"/bulletinTemp/",self.in_parameters[u'datetime'], u"/" , self.in_parameters[u'target_area']]) src_file = ''.join([self.in_parameters[u'target_area'] ,u"闪电密度空间分布模板.mxd"]) copy(os.path.join(src_dir,src_file),dest_dir) arguments = [os.path.join(dest_dir,src_file)] self.process = QProcess(self) self.process.start(program,arguments) def showAbout(self): self.about = About_Dialog() def showHelp(self): program = u'C:/Windows/hh.exe' arguments = [''.join([cwd,'/help/help.CHM'])] self.process = QProcess(self) self.process.start(program,arguments) def updateTargetArea(self, area): self.in_parameters[u'target_area'] = area def updateDatetime(self, date): self.in_parameters[u'datetime'] = str(date.year()) + u'年' if self.in_parameters.has_key(u'origin_data_path'): self.in_parameters.__delitem__(u'origin_data_path') def updateDensityCell(self, cell): self.in_parameters[u'density_cell'] = str(cell) def updateDensityClass(self, nclass): self.in_parameters[u'density_class'] = nclass def updateDayCell(self, cell): self.in_parameters[u'day_cell'] = str(cell) def updateDayClass(self, nclass): self.in_parameters[u'day_class'] = nclass def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def retranslateUi(self): _translate = QCoreApplication.translate self.setWindowTitle(_translate("MainWindow", "绍兴防雷中心 雷电公报制图")) self.datetime_label.setText(_translate("MainWindow", "年份")) self.datetime.setDisplayFormat(_translate("MainWindow", "yyyy")) self.target_area_label.setText(_translate("MainWindow", "地区")) self.target_area.setItemText(0, _translate("MainWindow", "绍兴市")) self.target_area.setItemText(1, _translate("MainWindow", "柯桥区")) self.target_area.setItemText(2, _translate("MainWindow", "上虞区")) self.target_area.setItemText(3, _translate("MainWindow", "诸暨市")) self.target_area.setItemText(4, _translate("MainWindow", "嵊州市")) self.target_area.setItemText(5, _translate("MainWindow", "新昌县")) self.density_cell_label.setText(_translate("MainWindow", "插值网格大小")) self.density_class_label.setText(_translate("MainWindow", "制图分类数目")) self.density_mxd.setText(_translate("MainWindow", "ArcGIS文档")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.density_tab), _translate("MainWindow", "电闪密度")) self.day_cell_label.setText(_translate("MainWindow", "插值网格大小")) self.day_class_label.setText(_translate("MainWindow", "制图分类数目")) self.day_mxd.setText(_translate("MainWindow", "ArcGIS文档")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.day_tab), _translate("MainWindow", "雷暴日")) self.execute_button.setText(_translate("MainWindow", "执行")) self.file_menu.setTitle(_translate("MainWindow", "文件")) self.help_menu.setTitle(_translate("MainWindow", "帮助")) self.action_add_data.setText(_translate("MainWindow", "加载数据")) self.action_help.setText(_translate("MainWindow", "使用说明")) self.action_about.setText(_translate("MainWindow", "关于")) self.action_save_pic.setText(_translate("MainWindow", "图片另存为"))
class MyWidget(QMainWindow): def __init__(self): super().__init__() self.setupUi(self) self.btn_1.clicked.connect(self.one) self.btn_2.clicked.connect(self.two) self.btn_3.clicked.connect(self.three) self.btn_4.clicked.connect(self.four) self.btn_5.clicked.connect(self.five) self.btn_6.clicked.connect(self.six) self.btn_7.clicked.connect(self.seven) self.btn_8.clicked.connect(self.eight) self.btn_9.clicked.connect(self.nine) self.btn_0.clicked.connect(self.zero) self.btn_00.clicked.connect(self.zerozero) self.btn_floating.clicked.connect(self.floating) self.btn_m_plus.clicked.connect(self.m_plus) self.btn_m_minus.clicked.connect(self.m_minus) self.btn_mr.clicked.connect(self.mr) self.btn_mc.clicked.connect(self.mc) self.btn_sin.clicked.connect(self.sin) self.btn_cos.clicked.connect(self.cos) self.btn_tg.clicked.connect(self.tg) self.btn_ctg.clicked.connect(self.ctg) self.btn_plus.clicked.connect(self.plus) self.btn_minus.clicked.connect(self.minus) self.btn_ymn.clicked.connect(self.ymn) self.btn_step.clicked.connect(self.step) self.btn_delen.clicked.connect(self.delen) self.btn_pr.clicked.connect(self.pr) self.btn_delet.clicked.connect(self.delet) self.btn_ac.clicked.connect(self.ac) self.btn_result.clicked.connect(self.result) def one(self): global operator, operation if operation: operator.append('1') operation = False else: operator[-1] += '1' self.window.display(operator[-1]) self.sprav.setText(''.join(operator)) def two(self): global operator, operation if operation: operator.append('2') operation = False else: operator[-1] += '2' self.window.display(operator[-1]) self.sprav.setText(''.join(operator)) def three(self): global operator, operation if operation: operator.append('3') operation = False else: operator[-1] += '3' self.window.display(operator[-1]) self.sprav.setText(''.join(operator)) def four(self): global operator, operation if operation: operator.append('4') operation = False else: operator[-1] += '4' self.window.display(operator[-1]) self.sprav.setText(''.join(operator)) def five(self): global operator, operation if operation: operator.append('5') operation = False else: operator[-1] += '5' self.window.display(operator[-1]) self.sprav.setText(''.join(operator)) def six(self): global operator, operation if operation: operator.append('6') operation = False else: operator[-1] += '6' self.window.display(operator[-1]) self.sprav.setText(''.join(operator)) def seven(self): global operator, operation if operation: operator.append('7') operation = False else: operator[-1] += '7' self.window.display(operator[-1]) self.sprav.setText(''.join(operator)) def eight(self): global operator, operation if operation: operator.append('8') operation = False else: operator[-1] += '8' self.window.display(operator[-1]) self.sprav.setText(''.join(operator)) def nine(self): global operator, operation if operation: operator.append('9') operation = False else: operator[-1] += '9' self.window.display(operator[-1]) self.sprav.setText(''.join(operator)) def zero(self): global operator, operation if operation: operator.append('0') operation = False else: operator[-1] += '0' self.window.display(operator[-1]) self.sprav.setText(''.join(operator)) def zerozero(self): global operator, operation if operation: operator.append('00') operation = False else: operator[-1] += '00' self.window.display(operator[-1]) self.sprav.setText(''.join(operator)) def floating(self): global operator, operation if operation: operator.append('.') operation = False else: operator[-1] += '.' self.window.display(operator[-1]) self.sprav.setText(''.join(operator)) def m_plus(self): global memory, operator if operator[-1].isdigit(): memory = float(memory) + float(operator[-1]) self.m.setText("M+") def m_minus(self): global memory, operator if operator[-1].isdigit(): memory = float(memory) - float(operator[-1]) self.m.setText("M-") def mr(self): global operator, memory if memory != 0: operator.append('mr') self.window.display(memory) self.sprav.setText(''.join(operator)) def mc(self): global memory memory = 0 self.m.setText("") def sin(self): global operator, operation operation = True operator.append('sin') self.sprav.setText(''.join(operator)) def cos(self): global operator, operation operation = True operator.append('cos') self.sprav.setText(''.join(operator)) def tg(self): global operator, operation operation = True operator.append('tg') self.sprav.setText(''.join(operator)) def ctg(self): global operator, operation operation = True operator.append('ctg') self.sprav.setText(''.join(operator)) def plus(self): global operator, operation operation = True operator.append('+') self.sprav.setText(''.join(operator)) def minus(self): global operator, operation operation = True operator.append('-') self.sprav.setText(''.join(operator)) def ymn(self): global operator, operation operation = True operator.append('*') self.sprav.setText(''.join(operator)) def step(self): global operator, operation operation = True operator.append('^') self.sprav.setText(''.join(operator)) def delen(self): global operator, operation operation = True operator.append('/') self.sprav.setText(''.join(operator)) def pr(self): global operator, operation operation = True operator.append('%') self.sprav.setText(''.join(operator)) def delet(self): global operator, operation if len(operator) != 0: last = operator[-1] if last == 'sin' or last == 'cos' or last == 'tg' or last == 'ctg' or last == 'mr': del operator[-1] else: operator[-1] = operator[-1][:-1:] if operator[-1] == '': del operator[-1] if len(operator) != 0: self.window.display(operator[-1]) else: operator = [''] self.window.display(0) self.sprav.setText(''.join(operator)) def ac(self): global operator, operation, k k += 1 if k == 7: self.resize(912, 689) operator = [] operation = True self.window.display(0) self.sprav.setText(''.join(operator)) def result(self): global operator, memory, operation try: while 'mr' in operator: index = operator.index('mr') operator[index] = memory while 'sin' in operator: index = operator.index('sin') rad = math.radians(float(operator[index + 1])) sin = math.sin(rad) del operator[index + 1] operator[index] = str(sin) while 'cos' in operator: index = operator.index('cos') rad = math.radians(float(operator[index + 1])) cos = math.cos(rad) del operator[index + 1] operator[index] = str(cos) while 'tg' in operator: index = operator.index('tg') rad = math.radians(float(operator[index + 1])) tg = math.tan(rad) del operator[index + 1] operator[index] = str(tg) while 'ctg' in operator: index = operator.index('ctg') rad = math.radians(float(operator[index + 1])) ctg = 1 / math.tan(rad) del operator[index + 1] operator[index] = str(ctg) while '^' in operator: index = operator.index('^') count = float(operator[index - 1]) ** float(operator[index + 1]) del operator[index + 1] operator[index] = str(float(round(count, 15))) del operator[index - 1] while ('*' in operator) or ("/" in operator) or ("%" in operator): if '*' in operator: index_1 = operator.index('*') else: index_1 = 1000 if '/' in operator: index_2 = operator.index('/') else: index_2 = 1000 if '%' in operator: index_3 = operator.index('%') else: index_3 = 1000 spisok = [index_1, index_2, index_3] if min(spisok) == index_2: count = float(operator[index_2 - 1]) / float(operator[index_2 + 1]) del operator[index_2 + 1] operator[index_2] = str(count) del operator[index_2 - 1] elif min(spisok) == index_1: count = float(operator[index_1 - 1]) * float(operator[index_1 + 1]) del operator[index_1 + 1] operator[index_1] = str(float(round(count, 15))) del operator[index_1 - 1] elif min(spisok) == index_3: count = float(operator[index_3 - 1]) % float(operator[index_3 + 1]) del operator[index_3 + 1] operator[index_3] = str(float(round(count, 15))) del operator[index_3 - 1] while ('+' in operator) or ("-" in operator): if '+' in operator: index_1 = operator.index('+') else: index_1 = 1000 if '-' in operator: index_2 = operator.index('-') else: index_2 = 1000 if (index_1 > index_2) and (index_2 != -1): count = float(operator[index_2 - 1]) - float(operator[index_2 + 1]) del operator[index_2 + 1] operator[index_2] = str(count) del operator[index_2 - 1] elif (index_1 < index_2) and (index_1 != -1): count = float(operator[index_1 - 1]) + float(operator[index_1 + 1]) del operator[index_1 + 1] operator[index_1] = str(count) del operator[index_1 - 1] self.sprav.setText(''.join(operator)) self.window.display(operator[0]) except Exception: self.window.display('Error') def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") #MainWindow.resize(912, 689) MainWindow.resize(490, 440) font = QFont() font.setFamily("MS Gothic") MainWindow.setFont(font) MainWindow.setStyleSheet("background-color: rgb(0, 0, 0);") self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.window = QLCDNumber(self.centralwidget) self.window.setGeometry(QRect(10, 10, 461, 60)) self.window.setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:2, fx:0.5, fy:0.5, stop:1 rgba(249, 187, 0, 255));") self.window.setDigitCount(20) self.window.setObjectName("window") self.btn_ac = QPushButton(self.centralwidget) self.btn_ac.setGeometry(QRect(410, 320, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(20) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_ac.setFont(font) self.btn_ac.setStyleSheet("font: 75 20pt \"Segoe Script\";color: rgb(255, 0, 0);\n" "background-color: rgb(29, 29, 29);") self.btn_ac.setIconSize(QSize(16, 16)) self.btn_ac.setObjectName("btn_ac") self.btn_mr = QPushButton(self.centralwidget) self.btn_mr.setGeometry(QRect(170, 80, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(15) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_mr.setFont(font) self.btn_mr.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 239, 239);font: 75 15pt \"Segoe Script\";") self.btn_mr.setIconSize(QSize(16, 16)) self.btn_mr.setObjectName("btn_mr") self.btn_mc = QPushButton(self.centralwidget) self.btn_mc.setGeometry(QRect(250, 80, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(15) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_mc.setFont(font) self.btn_mc.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 239, 239);font: 75 15pt \"Segoe Script\";") self.btn_mc.setIconSize(QSize(16, 16)) self.btn_mc.setObjectName("btn_mc") self.btn_m_plus = QPushButton(self.centralwidget) self.btn_m_plus.setEnabled(True) self.btn_m_plus.setGeometry(QRect(10, 80, 61, 50)) self.btn_m_plus.setMaximumSize(QSize(61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(15) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_m_plus.setFont(font) self.btn_m_plus.setCursor(QCursor(Qt.ArrowCursor)) self.btn_m_plus.setMouseTracking(True) self.btn_m_plus.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 239, 239);font: 75 15pt \"Segoe Script\";") self.btn_m_plus.setIconSize(QSize(16, 16)) self.btn_m_plus.setCheckable(False) self.btn_m_plus.setChecked(False) self.btn_m_plus.setObjectName("btn_m_plus") self.btn_m_minus = QPushButton(self.centralwidget) self.btn_m_minus.setGeometry(QRect(90, 80, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(15) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_m_minus.setFont(font) self.btn_m_minus.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 239, 239);font: 75 15pt \"Segoe Script\";") self.btn_m_minus.setIconSize(QSize(16, 16)) self.btn_m_minus.setObjectName("btn_m_minus") self.btn_cos = QPushButton(self.centralwidget) self.btn_cos.setGeometry(QRect(410, 80, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(20) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_cos.setFont(font) self.btn_cos.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 169, 254);font: 75 20pt \"Segoe Script\";") self.btn_cos.setIconSize(QSize(16, 16)) self.btn_cos.setObjectName("btn_cos") self.btn_sin = QPushButton(self.centralwidget) self.btn_sin.setGeometry(QRect(330, 80, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(20) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_sin.setFont(font) self.btn_sin.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 169, 254);font: 75 20pt \"Segoe Script\";") self.btn_sin.setIconSize(QSize(16, 16)) self.btn_sin.setObjectName("btn_sin") self.btn_tg = QPushButton(self.centralwidget) self.btn_tg.setGeometry(QRect(330, 140, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(20) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_tg.setFont(font) self.btn_tg.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 169, 254);font: 75 20pt \"Segoe Script\";") self.btn_tg.setIconSize(QSize(16, 16)) self.btn_tg.setObjectName("btn_tg") self.btn_minus = QPushButton(self.centralwidget) self.btn_minus.setGeometry(QRect(250, 200, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_minus.setFont(font) self.btn_minus.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);") self.btn_minus.setIconSize(QSize(16, 16)) self.btn_minus.setObjectName("btn_minus") self.btn_plus = QPushButton(self.centralwidget) self.btn_plus.setGeometry(QRect(250, 140, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_plus.setFont(font) self.btn_plus.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);") self.btn_plus.setIconSize(QSize(16, 16)) self.btn_plus.setObjectName("btn_plus") self.btn_ymn = QPushButton(self.centralwidget) self.btn_ymn.setGeometry(QRect(250, 260, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_ymn.setFont(font) self.btn_ymn.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);") self.btn_ymn.setIconSize(QSize(16, 16)) self.btn_ymn.setObjectName("btn_ymn") self.btn_result = QPushButton(self.centralwidget) self.btn_result.setGeometry(QRect(330, 320, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(40) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_result.setFont(font) self.btn_result.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 40pt \"Segoe Script\";color: rgb(255, 140, 0);") self.btn_result.setIconSize(QSize(16, 16)) self.btn_result.setObjectName("btn_result") self.btn_step = QPushButton(self.centralwidget) self.btn_step.setGeometry(QRect(330, 200, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_step.setFont(font) self.btn_step.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);") self.btn_step.setIconSize(QSize(16, 16)) self.btn_step.setObjectName("btn_step") self.btn_1 = QPushButton(self.centralwidget) self.btn_1.setGeometry(QRect(10, 140, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_1.setFont(font) self.btn_1.setMouseTracking(False) self.btn_1.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";") self.btn_1.setIconSize(QSize(16, 16)) self.btn_1.setCheckable(False) self.btn_1.setChecked(False) self.btn_1.setObjectName("btn_1") self.btn_2 = QPushButton(self.centralwidget) self.btn_2.setGeometry(QRect(90, 140, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_2.setFont(font) self.btn_2.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";") self.btn_2.setIconSize(QSize(16, 16)) self.btn_2.setObjectName("btn_2") self.btn_3 = QPushButton(self.centralwidget) self.btn_3.setGeometry(QRect(170, 140, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_3.setFont(font) self.btn_3.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";") self.btn_3.setIconSize(QSize(16, 16)) self.btn_3.setObjectName("btn_3") self.btn_4 = QPushButton(self.centralwidget) self.btn_4.setGeometry(QRect(10, 200, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_4.setFont(font) self.btn_4.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";") self.btn_4.setIconSize(QSize(16, 16)) self.btn_4.setObjectName("btn_4") self.btn_5 = QPushButton(self.centralwidget) self.btn_5.setGeometry(QRect(90, 200, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_5.setFont(font) self.btn_5.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";") self.btn_5.setIconSize(QSize(16, 16)) self.btn_5.setObjectName("btn_5") self.btn_6 = QPushButton(self.centralwidget) self.btn_6.setGeometry(QRect(170, 200, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_6.setFont(font) self.btn_6.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);") self.btn_6.setIconSize(QSize(16, 16)) self.btn_6.setObjectName("btn_6") self.btn_7 = QPushButton(self.centralwidget) self.btn_7.setGeometry(QRect(10, 260, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_7.setFont(font) self.btn_7.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);") self.btn_7.setIconSize(QSize(16, 16)) self.btn_7.setObjectName("btn_7") self.btn_8 = QPushButton(self.centralwidget) self.btn_8.setGeometry(QRect(90, 260, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_8.setFont(font) self.btn_8.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);") self.btn_8.setIconSize(QSize(16, 16)) self.btn_8.setObjectName("btn_8") self.btn_9 = QPushButton(self.centralwidget) self.btn_9.setGeometry(QRect(170, 260, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_9.setFont(font) self.btn_9.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);") self.btn_9.setIconSize(QSize(16, 16)) self.btn_9.setObjectName("btn_9") self.btn_0 = QPushButton(self.centralwidget) self.btn_0.setGeometry(QRect(10, 320, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_0.setFont(font) self.btn_0.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);") self.btn_0.setIconSize(QSize(16, 16)) self.btn_0.setObjectName("btn_0") self.btn_ctg = QPushButton(self.centralwidget) self.btn_ctg.setGeometry(QRect(410, 140, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(20) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_ctg.setFont(font) self.btn_ctg.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 169, 254);font: 75 20pt \"Segoe Script\";") self.btn_ctg.setIconSize(QSize(16, 16)) self.btn_ctg.setObjectName("btn_ctg") self.btn_delen = QPushButton(self.centralwidget) self.btn_delen.setGeometry(QRect(330, 260, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_delen.setFont(font) self.btn_delen.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);") self.btn_delen.setIconSize(QSize(16, 16)) self.btn_delen.setObjectName("btn_delen") self.Sprav = QLabel(self.centralwidget) self.Sprav.setGeometry(QRect(500, 10, 401, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(20) self.Sprav.setFont(font) self.Sprav.setStyleSheet("color: rgb(255, 255, 255);\n" "color: rgb(255, 255, 0);") self.Sprav.setObjectName("Sprav") self.Text_sprav = QTextBrowser(self.centralwidget) self.Text_sprav.setGeometry(QRect(490, 69, 411, 351)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(12) font.setBold(False) font.setItalic(False) font.setWeight(50) self.Text_sprav.setFont(font) self.Text_sprav.setStyleSheet("color: rgb(255, 255, 0);\n" "font: 12pt \"Segoe Script\";") self.Text_sprav.setObjectName("Text_sprav") self.textEdit = QTextEdit(self.centralwidget) self.textEdit.setGeometry(QRect(10, 480, 391, 160)) font = QFont() font.setPointSize(14) self.textEdit.setFont(font) self.textEdit.setStyleSheet("color: rgb(255, 170, 0);") self.textEdit.setObjectName("textEdit") self.Sprav_2 = QLabel(self.centralwidget) self.Sprav_2.setGeometry(QRect(10, 430, 391, 41)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(20) self.Sprav_2.setFont(font) self.Sprav_2.setStyleSheet("color: rgb(255, 255, 255);\n" "color: rgb(255, 255, 0);") self.Sprav_2.setObjectName("Sprav_2") self.Text_sprav_2 = QTextBrowser(self.centralwidget) self.Text_sprav_2.setGeometry(QRect(410, 480, 491, 161)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(12) font.setBold(False) font.setItalic(False) font.setWeight(50) self.Text_sprav_2.setFont(font) self.Text_sprav_2.setStyleSheet("color: rgb(255, 255, 0);\n" "font: 12pt \"Segoe Script\";") self.Text_sprav_2.setObjectName("Text_sprav_2") self.m = QLabel(self.centralwidget) self.m.setGeometry(QRect(13, 13, 20, 10)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(9) self.m.setFont(font) self.m.setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:2, fx:0.5, fy:0.5, stop:1 rgba(249, 187, 0, 255));") self.m.setText("") self.m.setObjectName("m") self.btn_floating = QPushButton(self.centralwidget) self.btn_floating.setGeometry(QRect(250, 320, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(40) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_floating.setFont(font) self.btn_floating.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 40pt \"Segoe Script\";\n" "color: rgb(20, 24, 255);") self.btn_floating.setIconSize(QSize(16, 16)) self.btn_floating.setObjectName("btn_floating") self.btn_00 = QPushButton(self.centralwidget) self.btn_00.setGeometry(QRect(90, 320, 141, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_00.setFont(font) self.btn_00.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";") self.btn_00.setIconSize(QSize(16, 16)) self.btn_00.setObjectName("btn_00") self.btn_delet = QPushButton(self.centralwidget) self.btn_delet.setGeometry(QRect(410, 260, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(20) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_delet.setFont(font) self.btn_delet.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 0, 0);font: 75 20pt \"Segoe Script\";") self.btn_delet.setIconSize(QSize(16, 16)) self.btn_delet.setObjectName("btn_delet") self.btn_pr = QPushButton(self.centralwidget) self.btn_pr.setGeometry(QRect(410, 200, 61, 50)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(30) font.setBold(False) font.setItalic(False) font.setWeight(9) self.btn_pr.setFont(font) self.btn_pr.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(27, 147, 0);font: 75 30pt \"Segoe Script\";") self.btn_pr.setIconSize(QSize(16, 16)) self.btn_pr.setObjectName("btn_pr") self.sprav = QLabel(self.centralwidget) self.sprav.setGeometry(QRect(40, 380, 441, 41)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(15) self.sprav.setFont(font) self.sprav.setStyleSheet("color: rgb(255, 255, 255);") self.sprav.setText("") self.sprav.setObjectName("sprav") self.Sprav_4 = QLabel(self.centralwidget) self.Sprav_4.setGeometry(QRect(410, 430, 491, 41)) font = QFont() font.setFamily("Segoe Script") font.setPointSize(20) self.Sprav_4.setFont(font) self.Sprav_4.setStyleSheet("color: rgb(255, 255, 255);\n" "color: rgb(255, 255, 0);") self.Sprav_4.setObjectName("Sprav_4") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setGeometry(QRect(0, 0, 912, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.btn_ac.setText(_translate("MainWindow", "AC")) self.btn_mr.setText(_translate("MainWindow", "MR")) self.btn_mc.setText(_translate("MainWindow", "MC")) self.btn_m_plus.setText(_translate("MainWindow", "M+")) self.btn_m_minus.setText(_translate("MainWindow", "M-")) self.btn_cos.setText(_translate("MainWindow", "cos")) self.btn_sin.setText(_translate("MainWindow", "sin")) self.btn_tg.setText(_translate("MainWindow", "tg")) self.btn_minus.setText(_translate("MainWindow", "-")) self.btn_plus.setText(_translate("MainWindow", "+")) self.btn_ymn.setText(_translate("MainWindow", "x")) self.btn_result.setText(_translate("MainWindow", "=")) self.btn_step.setText(_translate("MainWindow", "^")) self.btn_1.setText(_translate("MainWindow", "1")) self.btn_2.setText(_translate("MainWindow", "2")) self.btn_3.setText(_translate("MainWindow", "3")) self.btn_4.setText(_translate("MainWindow", "4")) self.btn_5.setText(_translate("MainWindow", "5")) self.btn_6.setText(_translate("MainWindow", "6")) self.btn_7.setText(_translate("MainWindow", "7")) self.btn_8.setText(_translate("MainWindow", "8")) self.btn_9.setText(_translate("MainWindow", "9")) self.btn_0.setText(_translate("MainWindow", "0")) self.btn_ctg.setText(_translate("MainWindow", "ctg")) self.btn_delen.setText(_translate("MainWindow", "/")) self.Sprav.setText(_translate("MainWindow", " Справочник")) self.Text_sprav.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" "</style></head><body style=\" font-family:\'Segoe Script\'; font-size:12pt; font-weight:400; font-style:normal;\">\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[M+] – прибавление числа в память</span></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[M-] – вычитание числа из памяти</span></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[^] – возведение в выбранную степень</span></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[+][-][x][</span><span style=\" font-family:\'Symbol\'; color:#0febff;\">¸</span><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">] – арифметические операции</span></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[MR] – вывести содержимое памяти на дисплей</span></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[MC] – очистить содержимое памяти</span></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[AC] – общий сброс</span></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[sin][cos][tg][ctg] – формулы произведения тригонометрических функций, при работе с этими функциями сначала записывается sin, cos, tg, ctg потом число(Например sin 45)</span></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; color:#0febff;\">[Del]</span><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\"> – удаляет последнюю введенную цифру или знак действия</span></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; color:#0febff;\">[%]</span><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\"> – вычисляет остаток от деления</span><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:8pt; color:#0febff;\"><br /></span><span style=\" font-family:\'MS Shell Dlg 2\'; color:#0febff;\">[.]</span><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\"> – используется для записи дробной части</span></p></body></html>")) self.Sprav_2.setText(_translate("MainWindow", " Для заметок")) self.Text_sprav_2.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" "</style></head><body style=\" font-family:\'Segoe Script\'; font-size:12pt; font-weight:400; font-style:normal;\">\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#00ff7f;\"> </span><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"> - Если указанный порядок действий невозможно вычислить</span></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"> - Если мы накасячили</span></p>\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"><br /></p>\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"><br /></p>\n" "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"><br /></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"> По всем вопросам обращайтесь https://vk.com/vasily.shishkin</span></p>\n" "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"> https://vk.com/andrey.krivosheev</span></p></body></html>")) self.btn_floating.setText(_translate("MainWindow", ".")) self.btn_00.setText(_translate("MainWindow", "00")) self.btn_delet.setText(_translate("MainWindow", "Del")) self.btn_pr.setText(_translate("MainWindow", "%")) self.Sprav_4.setText(_translate("MainWindow", " Почему появляется ошибка?"))
class Ui_MainWindow(object): def setupUi(self, MainWindow, version): self.version = version self.ScRate = GetSystemMetrics(0) / 1920 self.font = QFont("Georgia", 8.8 * self.ScRate, weight=-2) MainWindow.setObjectName("MainWindow") MainWindow.resize(1126 * self.ScRate, 700) MainWindow.setMinimumSize(QSize(1126 * self.ScRate, 500 * self.ScRate)) MainWindow.setMaximumSize(QSize(GetSystemMetrics(0), 900 * self.ScRate)) MainWindow.setWindowIcon(QIcon(Icons["Standart"])) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.horizontalLayout_8 = QHBoxLayout(self.centralwidget) self.horizontalLayout_8.setObjectName("horizontalLayout_8") self.horizontalLayout = QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.verticalLayout_4 = QVBoxLayout() self.verticalLayout_4.setObjectName("verticalLayout_4") self.tableView = QTableView(self.centralwidget) self.tableView.setMinimumSize(QSize(550 * self.ScRate, 0)) self.tableView.setObjectName("tableView") self.verticalLayout_4.addWidget(self.tableView) self.tableView.setAcceptDrops(True) self.tableView.setHorizontalScrollMode( QAbstractItemView.ScrollPerPixel) self.tableView.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self.horizontalLayout_9 = QHBoxLayout() self.horizontalLayout_9.setObjectName("horizontalLayout_9") self.label_6 = QLabel(self.centralwidget) self.label_6.setObjectName("label_6") self.horizontalLayout_9.addWidget(self.label_6) spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_9.addItem(spacerItem) self.pushButton_8 = QPushButton(self.centralwidget) self.pushButton_8.setObjectName("pushButton_8") self.horizontalLayout_9.addWidget(self.pushButton_8) self.pushButton_9 = QPushButton(self.centralwidget) self.pushButton_9.setObjectName("pushButton_9") self.horizontalLayout_9.addWidget(self.pushButton_9) self.verticalLayout_4.addLayout(self.horizontalLayout_9) self.horizontalLayout.addLayout(self.verticalLayout_4) self.verticalLayout_3 = QVBoxLayout() self.verticalLayout_3.setObjectName("verticalLayout_3") self.horizontalLayout.addLayout(self.verticalLayout_3) self.line = QFrame(self.centralwidget) self.line.setFrameShape(QFrame.VLine) self.line.setFrameShadow(QFrame.Sunken) self.line.setObjectName("line") self.horizontalLayout.addWidget(self.line) self.verticalLayout = QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.pushButton = QPushButton(self.centralwidget) sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.pushButton.sizePolicy().hasHeightForWidth()) self.pushButton.setSizePolicy(sizePolicy) self.pushButton.setMinimumSize( QSize(507 * self.ScRate, 28 * self.ScRate)) self.pushButton.setMaximumSize( QSize(507 * self.ScRate, 28 * self.ScRate)) self.pushButton.setObjectName("pushButton") self.verticalLayout.addWidget(self.pushButton) self.pushButton_4 = QPushButton(self.centralwidget) sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.pushButton_4.sizePolicy().hasHeightForWidth()) self.pushButton_4.setSizePolicy(sizePolicy) self.pushButton_4.setMinimumSize( QSize(507 * self.ScRate, 28 * self.ScRate)) self.pushButton_4.setMaximumSize( QSize(507 * self.ScRate, 28 * self.ScRate)) self.pushButton_4.setObjectName("pushButton_4") self.verticalLayout.addWidget(self.pushButton_4) self.line_2 = QFrame(self.centralwidget) self.line_2.setFrameShape(QFrame.HLine) self.line_2.setFrameShadow(QFrame.Sunken) self.line_2.setObjectName("line_2") self.verticalLayout.addWidget(self.line_2) self.horizontalLayout_3 = QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.label = QLabel(self.centralwidget) self.label.setObjectName("label") sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.label.sizePolicy().hasHeightForWidth()) self.label.setSizePolicy(sizePolicy) self.label.setMinimumSize(QSize(100 * self.ScRate, 25 * self.ScRate)) self.label.setMaximumSize(QSize(100 * self.ScRate, 25 * self.ScRate)) self.label.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.horizontalLayout_3.addWidget(self.label) self.bar = QProgressBar(self.centralwidget) self.bar.setObjectName("bar") sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.bar.sizePolicy().hasHeightForWidth()) self.bar.setSizePolicy(sizePolicy) self.bar.setMinimumSize(QSize(430 * self.ScRate, 25 * self.ScRate)) self.bar.setMaximumSize(QSize(430 * self.ScRate, 25 * self.ScRate)) #self.bar.setValue(50) self.bar.setTextVisible(False) self.bar.setStyleSheet("QProgressBar {margin-right: 60px;}") self.bar.setAlignment(Qt.AlignLeft | Qt.AlignHCenter) self.horizontalLayout_3.addWidget(self.bar) #self.horizontalLayout_3.addStretch() self.verticalLayout.addLayout(self.horizontalLayout_3) """ self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setMinimumSize(QtCore.QSize(249, 31)) self.label.setMaximumSize(QtCore.QSize(249, 31)) self.label.setObjectName("label") self.horizontalLayout_3.addWidget(self.label) self.spinBox = QtWidgets.QSpinBox(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.spinBox.sizePolicy().hasHeightForWidth()) self.spinBox.setSizePolicy(sizePolicy) self.spinBox.setMinimumSize(QtCore.QSize(249*self.ScRate, 22*self.ScRate)) self.spinBox.setMaximumSize(QtCore.QSize(249*self.ScRate, 22*self.ScRate)) self.spinBox.setReadOnly(True) self.spinBox.setMaximum(999999) self.spinBox.setObjectName("spinBox") self.horizontalLayout_3.addWidget(self.spinBox) self.verticalLayout.addLayout(self.horizontalLayout_3) self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setMinimumSize(QtCore.QSize(249*self.ScRate, 32*self.ScRate)) self.label_2.setMaximumSize(QtCore.QSize(249*self.ScRate, 32*self.ScRate)) self.label_2.setObjectName("label_2") self.horizontalLayout_4.addWidget(self.label_2) self.spinBox_2 = QtWidgets.QSpinBox(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.spinBox_2.sizePolicy().hasHeightForWidth()) self.spinBox_2.setSizePolicy(sizePolicy) self.spinBox_2.setMinimumSize(QtCore.QSize(249*self.ScRate, 22*self.ScRate)) self.spinBox_2.setMaximumSize(QtCore.QSize(249*self.ScRate, 22*self.ScRate)) self.spinBox_2.setReadOnly(True) self.spinBox_2.setMaximum(999999) self.spinBox_2.setObjectName("spinBox_2") self.horizontalLayout_4.addWidget(self.spinBox_2) self.verticalLayout.addLayout(self.horizontalLayout_4) self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5.setObjectName("horizontalLayout_5") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setMinimumSize(QtCore.QSize(249*self.ScRate, 31*self.ScRate)) self.label_3.setMaximumSize(QtCore.QSize(249*self.ScRate, 31*self.ScRate)) self.label_3.setObjectName("label_3") self.label_3.setFont(self.font) self.horizontalLayout_5.addWidget(self.label_3) self.spinBox_3 = QtWidgets.QSpinBox(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.spinBox_3.sizePolicy().hasHeightForWidth()) self.spinBox_3.setSizePolicy(sizePolicy) self.spinBox_3.setMinimumSize(QtCore.QSize(249*self.ScRate, 22*self.ScRate)) self.spinBox_3.setMaximumSize(QtCore.QSize(249*self.ScRate, 22*self.ScRate)) self.spinBox_3.setReadOnly(True) self.spinBox_3.setMaximum(999999) self.spinBox_3.setObjectName("spinBox_3") self.horizontalLayout_5.addWidget(self.spinBox_3) self.verticalLayout.addLayout(self.horizontalLayout_5) """ self.horizontalLayout_6 = QHBoxLayout() self.horizontalLayout_6.setObjectName("horizontalLayout_6") self.label_4 = QLabel(self.centralwidget) self.label_4.setMinimumSize(QSize(249 * self.ScRate, 31 * self.ScRate)) self.label_4.setMaximumSize(QSize(249 * self.ScRate, 31 * self.ScRate)) self.label_4.setObjectName("label_4") self.label_4.setFont(self.font) self.horizontalLayout_6.addWidget(self.label_4) self.spinBox_4 = QSpinBox(self.centralwidget) sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.spinBox_4.sizePolicy().hasHeightForWidth()) self.spinBox_4.setSizePolicy(sizePolicy) self.spinBox_4.setMinimumSize( QSize(249 * self.ScRate, 22 * self.ScRate)) self.spinBox_4.setMaximumSize( QSize(249 * self.ScRate, 22 * self.ScRate)) self.spinBox_4.setReadOnly(True) self.spinBox_4.setMaximum(999999) self.spinBox_4.setObjectName("spinBox_4") self.horizontalLayout_6.addWidget(self.spinBox_4) self.verticalLayout.addLayout(self.horizontalLayout_6) self.horizontalLayout_7 = QHBoxLayout() self.horizontalLayout_7.setObjectName("horizontalLayout_7") self.line_3 = QFrame(self.centralwidget) self.line_3.setFrameShape(QFrame.HLine) self.line_3.setFrameShadow(QFrame.Sunken) self.line_3.setObjectName("line_3") self.verticalLayout.addWidget(self.line_3) self.verticalLayout_7 = QVBoxLayout() self.verticalLayout_7.setObjectName("verticalLayout_7") self.horizontalLayout_2 = QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.pushButton_2 = QPushButton(self.centralwidget) sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.pushButton_2.sizePolicy().hasHeightForWidth()) self.pushButton_2.setSizePolicy(sizePolicy) self.pushButton_2.setMinimumSize( QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_2.setMaximumSize( QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_2.setObjectName("pushButton_2") self.horizontalLayout_2.addWidget(self.pushButton_2) self.pushButton_3 = QPushButton(self.centralwidget) sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.pushButton_3.sizePolicy().hasHeightForWidth()) self.pushButton_3.setSizePolicy(sizePolicy) self.pushButton_3.setMinimumSize( QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_3.setMaximumSize( QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_3.setObjectName("pushButton_3") self.horizontalLayout_2.addWidget(self.pushButton_3) self.pushButton_7 = QPushButton(self.centralwidget) sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.pushButton_7.sizePolicy().hasHeightForWidth()) self.pushButton_7.setSizePolicy(sizePolicy) self.pushButton_7.setMinimumSize( QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_7.setMaximumSize( QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_7.setObjectName("pushButton_7") self.horizontalLayout_2.addWidget(self.pushButton_7) space = QSpacerItem(25, 0, QSizePolicy.Fixed, QSizePolicy.Maximum) self.horizontalLayout_2.addItem(space) self.pushButton_5 = QPushButton(self.centralwidget) sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.pushButton_5.sizePolicy().hasHeightForWidth()) self.pushButton_5.setSizePolicy(sizePolicy) self.pushButton_5.setMinimumSize( QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_5.setMaximumSize( QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_5.setObjectName("pushButton_5") self.horizontalLayout_2.addWidget(self.pushButton_5) self.pushButton_6 = QPushButton(self.centralwidget) sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.pushButton_6.sizePolicy().hasHeightForWidth()) self.pushButton_6.setSizePolicy(sizePolicy) self.pushButton_6.setMinimumSize( QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_6.setMaximumSize( QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_6.setObjectName("pushButton_6") self.horizontalLayout_2.addWidget(self.pushButton_6) #self.horizontalLayout_2.addStretch() self.horizontalLayout_2.setAlignment(Qt.AlignLeft) self.verticalLayout_7.addLayout(self.horizontalLayout_2) self.tab = QTabWidget() self.plain_1 = QPlainTextEdit(self.centralwidget) self.plain_1.setPlaceholderText("Mesajınız...") sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tab.sizePolicy().hasHeightForWidth()) self.tab.setSizePolicy(sizePolicy) self.tab.setMinimumSize(QSize(240 * self.ScRate, 380 * self.ScRate)) self.tab.setMaximumSize(QSize(240 * self.ScRate, 380 * self.ScRate)) self.tab.setObjectName("tab") self.tab.addTab(self.plain_1, "Mesaj 1") self.verticalLayout_7.addWidget(self.tab) self.horizontalLayout_7.addLayout(self.verticalLayout_7) self.verticalLayout_2 = QVBoxLayout() self.verticalLayout_2.setObjectName("verticalLayout_2") self.label_5 = QLabel(self.centralwidget) sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.label_5.sizePolicy().hasHeightForWidth()) self.label_5.setSizePolicy(sizePolicy) self.label_5.setMinimumSize(QSize(256 * self.ScRate, 130 * self.ScRate)) self.label_5.setMaximumSize(QSize(256 * self.ScRate, 130 * self.ScRate)) self.label_5.setObjectName("label_5") self.label_5.setFont(self.font) self.verticalLayout_2.addWidget(self.label_5) self.tableWidget = QTableWidget(self.centralwidget) #self.tableWidget = TableWidgetDragRows(self.centralwidget) #self.tableWidget.dropSignal.connect(self.updateTableDrag) self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows) self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) self.tableWidget.setColumnCount(2) sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.tableWidget.sizePolicy().hasHeightForWidth()) self.tableWidget.setSizePolicy(sizePolicy) self.tableWidget.setHorizontalHeaderItem(0, QTableWidgetItem("Dosya Adı")) self.tableWidget.setHorizontalHeaderItem( 1, QTableWidgetItem("Mesaj Sırası")) self.tableWidget.resizeColumnsToContents() self.tableWidget.setHorizontalScrollMode( QAbstractItemView.ScrollPerPixel) self.tableWidget.setVerticalScrollMode( QAbstractItemView.ScrollPerPixel) self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu) self.tableWidget.customContextMenuRequested.connect( self.on_context_menu) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.tableWidget.sizePolicy().hasHeightForWidth()) self.tableWidget.setSizePolicy(sizePolicy) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setMinimumSize( QSize(220 * self.ScRate, 280 * self.ScRate)) self.tableWidget.setMaximumSize( QSize(220 * self.ScRate, 280 * self.ScRate)) self.verticalLayout_2.addWidget(self.tableWidget) self.create_popup_menu() self.horizontalLayout_7.addLayout(self.verticalLayout_2) self.verticalLayout.addLayout(self.horizontalLayout_7) self.horizontalLayout.addLayout(self.verticalLayout) self.horizontalLayout_8.addLayout(self.horizontalLayout) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setGeometry( QRect(0, 0, 1100 * self.ScRate, 26 * self.ScRate)) self.menubar.setObjectName("menubar") self.menuDosya = QMenu(self.menubar) self.menuDosya.setObjectName("menuDosya") self.menuAbout = QMenu(self.menubar) self.menuAbout.setObjectName("menuAbout") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.actionDosya_A = QAction(MainWindow) self.actionDosya_A.setObjectName("actionDosya_A") self.actionKapat = QAction(MainWindow) self.actionKapat.setObjectName("actionKapat") self.actionAyarla = QAction(MainWindow) self.actionAyarla.setObjectName("actionAyarla") self.actionUpdate = QAction(MainWindow) self.actionUpdate.setObjectName("actionUpdate") self.actionFeedBack = QAction(MainWindow) self.actionFeedBack.setObjectName("actionFeedBack") self.actionAbout = QAction(MainWindow) self.actionAbout.setObjectName("actionAbout") self.menuDosya.addAction(self.actionDosya_A) self.menuDosya.addAction(self.actionAyarla) self.menuDosya.addAction(self.actionKapat) self.menuAbout.addAction(self.actionUpdate) self.menuAbout.addAction(self.actionAbout) self.menuAbout.addAction(self.actionFeedBack) self.menubar.addAction(self.menuDosya.menuAction()) self.menubar.addAction(self.menuAbout.menuAction()) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) self.i = 1 self.list_of_files = [["Mesaj", "1"]] self.updateTable() def create_popup_menu(self, parent=None): self.popup_menu = QMenu() self.popup_menu.addAction("Yeni Dosya veya Fotoğraf ekle", self.new_cluster) self.popup_menu.addAction("Sil", self.delete_cluster) self.popup_menu.addSeparator() self.popup_menu.addAction("Yukarı Taşı", self.up_cluster) self.popup_menu.addAction("Aşağı Taşı", self.down_cluster) def on_context_menu(self, pos): node = self.tableWidget.mapToGlobal(pos) self.popup_menu.exec_(self.tableWidget.mapToGlobal(pos)) def new_cluster(self): fileName, _ = QFileDialog.getOpenFileNames( self.window, "Yeni Dosya veya Fotoğraf Ekle", os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop'), "Tüm Dosyalar (*.*)") if (fileName): for x in fileName: self.i += 1 self.list_of_files.append([x, self.i]) lall = list(itertools.chain.from_iterable(self.list_of_files)) for i in lall: if (lall.count(i) > 1): warnMessage("Aynı Dosya", QMessageBox.Warning, "Aynı dosyayı iki kere seçemezsiniz.") self.list_of_files.pop() self.i -= 1 return self.updateTable() def delete_cluster(self): for item in self.tableWidget.selectedIndexes(): for i in self.list_of_files: if (self.tableWidget.item(item.row(), 0).text() == "Mesaj"): warnMessage("Uyarı!", QMessageBox.Warning, "'Mesaj' satırını silemezsiniz.") elif (self.tableWidget.item(item.row(), 0).text() == i[0].split("/")[-1]): self.list_of_files.remove(i) self.updateTable() def up_cluster(self): for item in self.tableWidget.selectedIndexes(): for i in self.list_of_files: if (self.tableWidget.item(item.row(), 0).text() == i[0].split("/")[-1]): index = self.list_of_files.index(i) try: self.list_of_files[index], self.list_of_files[ index - 1] = self.list_of_files[index - 1], self.list_of_files[index] self.updateTable() except: pass def down_cluster(self): for item in self.tableWidget.selectedIndexes(): for i in self.list_of_files: if (self.tableWidget.item(item.row(), 0).text() == i[0].split("/")[-1]): index = self.list_of_files.index(i) try: self.list_of_files[index], self.list_of_files[ index + 1] = self.list_of_files[index + 1], self.list_of_files[index] self.updateTable() except: pass def updateTable(self): self.tableWidget.setRowCount(len(self.list_of_files)) for j in range(len(self.list_of_files)): self.list_of_files[j][1] = j + 1 for i in range(len(self.list_of_files)): code = "self.tableWidget.setItem("+str(i)+",0,QTableWidgetItem('"+ self.list_of_files[i][0].split("/")[-1] +"'));" + \ "self.tableWidget.setItem("+str(i)+",1,QTableWidgetItem('"+ str(self.list_of_files[i][1]) +"'))" exec(code) def updateTableDrag(self, x): if x[0] == "s": self.itemSource = [x[1], x[2]] #elif x[0] == "i": elif x[0] == "d": c = self.list_of_files[self.itemSource[0]] self.list_of_files.pop(self.itemSource[0]) self.list_of_files.insert(x[1], c) self.updateTable() print(self.list_of_files) self.updateTable() """self.dragFiles = [] for i in range(self.tableWidget.rowCount()): item = self.tableWidget.item(i,0).text() self.dragFiles.append(item) print(self.dragFiles) for j in range(len(self.dragFiles)-1): for x in range(len(self.dragFiles)-1): if(self.dragFiles[j] == self.list_of_files[x][0].split("/")[-1]): if(self.list_of_files[x] != self.list_of_files[j]): c = self.list_of_files[x] self.list_of_files.pop(x) self.list_of_files.insert(j, c) print(self.dragFiles) print(self.list_of_files)""" def retranslateUi(self, MainWindow): _translate = QCoreApplication.translate # Window Title MainWindow.setWindowTitle( _translate("MainWindow", "Whats Message Sender v" + self.version)) self.pushButton.setText(_translate("MainWindow", "Başlat")) self.pushButton_4.setText(_translate("MainWindow", "Durdur")) self.pushButton_4.setVisible(False) self.pushButton_2.setIcon(QIcon(Icons["Preview"])) self.pushButton_2.setToolTip( _translate( "MainWindow", " Mesajınızın önizlemesine bu <br>butondan bakabilirsiniz.") ) self.pushButton_2.setIconSize(QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_2.setStyleSheet('QPushButton{border: 0px solid;}') self.pushButton_3.setIcon(QIcon(Icons["Report"])) self.pushButton_3.setToolTip( _translate( "MainWindow", " Atılan mesajların raporunu excel formatında kaydetmek için bu butonu kullanabilirsiniz." )) self.pushButton_3.setIconSize(QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_3.setStyleSheet('QPushButton{border: 0px solid;}') self.pushButton_7.setIcon(QIcon(Icons["Emoji"])) self.pushButton_7.setToolTip( _translate( "MainWindow", " Mesajınıza emoji eklemek için bu butonu kullanabilirsiniz, emojiler burada farklı görünsede mesaj atıldığı zaman düzelecektir." )) self.pushButton_7.setIconSize(QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_7.setStyleSheet('QPushButton{border: 0px solid;}') self.pushButton_5.setIcon(QIcon(Icons["Plus"])) self.pushButton_5.setToolTip( _translate( "MainWindow", " Mesaj kutusu oluşturmak için bu butonu kullanabilirsiniz." )) self.pushButton_5.setIconSize(QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_5.setStyleSheet('QPushButton{border: 0px solid;}') self.pushButton_6.setIcon(QIcon(Icons["Minus"])) self.pushButton_6.setToolTip( _translate( "MainWindow", " Son mesaj kutusunu silmek için bu butonu kullanabilirsiniz." )) self.pushButton_6.setIconSize(QSize(30 * self.ScRate, 30 * self.ScRate)) self.pushButton_6.setStyleSheet('QPushButton{border: 0px solid;}') self.pushButton_8.setText(_translate("MainWindow", "Tabloyu Temizle")) self.label.setText(_translate("MainWindow", "0/0 - 0%")) self.bar.setValue(0) self.label_4.setText(_translate("MainWindow", "Kalan Mesaj Hakkınız :")) self.label_5.setText( _translate( "MainWindow", " MESAJINIZI YAZARKEN\n" " BUNA DİKKAT EDİNİZ.\n" "\n" "Eğer mesajın attığınız kişiye özel\n" " olması için isim kullanmak\n" " istiyorsanız, mesajınızda isim\n" " olmasını istediğiniz yere {}\n" " işaretlerini koyunuz.")) """ self.label_5.setText(_translate("MainWindow", " MESAJINIZI YAZARKEN\n" " BUNA DİKKAT EDİNİZ.\n" "\n" "Eğer mesajın attığınız kişiye özel\n" " olması için kolon değeri kullanmak\n" " istiyorsanız, mesajınızda \n" "kullanmak istediğiniz değerleri içeren kolonu;\n" " {kolon sıra numarası} Örn. {1}, {2}, {3}\n" " şeklinde koyabilirsiniz.")) """ self.label_6.setText( _translate( "MainWindow", "Yukarıdaki alana dosyanızı sürükleyip\n" "bırakarak da dosyanızı açabilirsiniz.")) self.menuDosya.setTitle(_translate("MainWindow", "Dosya")) self.menuAbout.setTitle(_translate("MainWindow", "Hakkında")) self.actionDosya_A.setText(_translate("MainWindow", "Dosya Aç...")) self.actionDosya_A.setShortcut(_translate("MainWindow", "Ctrl+O")) self.actionKapat.setText(_translate("MainWindow", "Kapat")) self.actionKapat.setShortcut(_translate("MainWindow", "Ctrl+Q")) self.actionAyarla.setText(_translate("MainWindow", "Ayarlar")) self.actionAyarla.setShortcut(_translate("MainWindow", "Ctrl+Shift+A")) self.actionUpdate.setText(_translate("MainWindow", "Güncelle...")) self.actionAbout.setText( _translate("MainWindow", "Versiyon\t" + self.version)) self.actionFeedBack.setText( _translate("MainWindow", "Geri Bildirim..."))
class listExpiredUI(QMainWindow): def __init__(self, parent=None): super(listExpiredUI, self).__init__(parent) self.resize(900, 700) self.setupUi() def setupUi(self): self.setObjectName("MainWindow") self.centralwidget = QWidget(self) self.centralwidget.setObjectName("centralwidget") self.tableWidget = QTableWidget(self.centralwidget) self.tableWidget.setGeometry(QtCore.QRect(30, 50, 810, 520)) self.tableWidget.setRowCount(50) self.tableWidget.setColumnCount(4) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setHorizontalHeaderLabels( ["Id STNK", "Nomor Registrasi", "Nama Pemilik", "Masa Berlaku"]) self.tableWidget.setEditTriggers(QTreeView.NoEditTriggers) self.tableWidget.setStyleSheet("background-color:#ECEBE4") data_df = self.load_data() for data in data_df: self.tableWidget.setItem(data[0], data[1], data[2]) #self.btnHapus = QPushButton(self.centralwidget) #self.btnHapus.setGeometry(QtCore.QRect(28, 600, 90, 30)) #self.btnHapus.setObjectName("btnHapus") #self.setCentralWidget(self.centralwidget) #self.btnHapus.clicked.connect() self.btnKembali = QPushButton(self.centralwidget) self.btnKembali.setGeometry(QtCore.QRect(750, 600, 90, 30)) self.btnKembali.setStyleSheet("background-color:#3498DB") self.btnKembali.setObjectName("btnKembali") self.setCentralWidget(self.centralwidget) self.btnKembali.clicked.connect(self.kembali) self.statusbar = QStatusBar(self) self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) self.retranslateUi() QMetaObject.connectSlotsByName(self) def retranslateUi(self): _translate = QCoreApplication.translate self.setWindowTitle(_translate("MainWindow", "List Expired")) self.btnKembali.setText(_translate("MainWindow", "Kembali")) #self.btnHapus.setText(_translate("MainWindow", "Hapus")) def load_data(self): model = mUser() datenya = datetime.datetime.today() + datetime.timedelta(30) data = model.getData("stnk", "where masa_berlaku < '%s'" % datenya) key_data = list(data.keys()) len_data = len(data[key_data[0]]) data_return = [] for row in range(len_data): for col in range(len(key_data)): value = QTableWidgetItem(str(data[key_data[col]][row])) data_return.append((row, col, value)) return data_return """ def _removerow(self): row = self.tableWidget.currentRow() '''query = "DELETE FROM WHERE = ?" cur.execute(query, (item,customerId,date,qty)) con.commit() ''' self.tableWidget.removeRow(row) print("Berhasil Hapus!") """ def kembali(self): dash = cListExpired.cListExpired() dash.gotodash(self)
class ErrorStatusBar(QWidget): """ A pop-up status bar for displaying messages about application errors to the user. Messages will be displayed for a given duration or until the message is cleared or updated with a new message. """ CSS = ''' #error_vertical_bar { background-color: #f22b5d; } #error_icon { background-color: qlineargradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #fff, stop: 0.2 #fff, stop: 1 #fff ); } #error_status_bar { background-color: qlineargradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #fff, stop: 0.2 #fff, stop: 1 #fff ); font-weight: bold; color: #f22b5d; } ''' def __init__(self): super().__init__() # Set styles self.setStyleSheet(self.CSS) # Set layout layout = QHBoxLayout(self) self.setLayout(layout) # Remove margins and spacing layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) # Error vertical bar self.vertical_bar = QWidget() self.vertical_bar.setObjectName('error_vertical_bar') # Set css id self.vertical_bar.setFixedWidth(10) # Error icon self.label = SvgLabel('error_icon.svg', svg_size=QSize(32, 32)) self.label.setObjectName('error_icon') # Set css id self.label.setFixedWidth(42) # Error status bar self.status_bar = QStatusBar() self.status_bar.setObjectName('error_status_bar') # Set css id self.status_bar.setSizeGripEnabled(False) # Add widgets to layout layout.addWidget(self.vertical_bar) layout.addWidget(self.label) layout.addWidget(self.status_bar) # Hide until a message needs to be displayed self.vertical_bar.hide() self.label.hide() self.status_bar.hide() # Only show errors for a set duration self.status_timer = QTimer() self.status_timer.timeout.connect(self._on_status_timeout) def _hide(self): self.vertical_bar.hide() self.label.hide() self.status_bar.hide() def _show(self): self.vertical_bar.show() self.label.show() self.status_bar.show() def _on_status_timeout(self): self._hide() def update_message(self, message: str, duration: int): """ Display a status message to the user for a given duration. """ self.status_bar.showMessage(message, duration) self.status_timer.start(duration) self._show() def clear_message(self): """ Clear any message currently in the status bar. """ self.status_bar.clearMessage() self._hide()
class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") MainWindow.setWindowModality(Qt.NonModal) MainWindow.resize(423, 347) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.gridLayoutWidget = QWidget(self.centralwidget) self.gridLayoutWidget.setObjectName(u"gridLayoutWidget") self.gridLayoutWidget.setGeometry(QRect(10, 40, 123, 68)) self.gridLayout = QGridLayout(self.gridLayoutWidget) self.gridLayout.setObjectName(u"gridLayout") self.gridLayout.setSizeConstraint(QLayout.SetMaximumSize) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2 = QVBoxLayout() self.verticalLayout_2.setObjectName(u"verticalLayout_2") self.chkScreenRest = QCheckBox(self.gridLayoutWidget) self.chkScreenRest.setObjectName(u"chkScreenRest") sizePolicy1 = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) sizePolicy1.setHorizontalStretch(0) sizePolicy1.setVerticalStretch(0) sizePolicy1.setHeightForWidth( self.chkScreenRest.sizePolicy().hasHeightForWidth()) self.chkScreenRest.setSizePolicy(sizePolicy1) font = QFont() font.setFamily(u"Roboto") font.setPointSize(14) font.setBold(False) font.setItalic(True) font.setWeight(50) self.chkScreenRest.setFont(font) self.chkScreenRest.setChecked(False) self.verticalLayout_2.addWidget(self.chkScreenRest) self.chkEyeBlink = QCheckBox(self.gridLayoutWidget) self.chkEyeBlink.setObjectName(u"chkEyeBlink") font1 = QFont() font1.setFamily(u"Roboto") font1.setPointSize(14) font1.setItalic(True) self.chkEyeBlink.setFont(font1) self.verticalLayout_2.addWidget(self.chkEyeBlink) self.gridLayout.addLayout(self.verticalLayout_2, 1, 0, 1, 1) self.lblMonitor = QLabel(self.centralwidget) self.lblMonitor.setObjectName(u"lblMonitor") self.lblMonitor.setGeometry(QRect(20, 10, 141, 21)) sizePolicy2 = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) sizePolicy2.setHorizontalStretch(0) sizePolicy2.setVerticalStretch(0) sizePolicy2.setHeightForWidth( self.lblMonitor.sizePolicy().hasHeightForWidth()) self.lblMonitor.setSizePolicy(sizePolicy2) font2 = QFont() font2.setFamily(u"Open Sans") font2.setPointSize(16) font2.setBold(True) font2.setWeight(75) self.lblMonitor.setFont(font2) self.lblNotification = QLabel(self.centralwidget) self.lblNotification.setObjectName(u"lblNotification") self.lblNotification.setGeometry(QRect(190, 10, 141, 21)) sizePolicy2.setHeightForWidth( self.lblNotification.sizePolicy().hasHeightForWidth()) self.lblNotification.setSizePolicy(sizePolicy2) self.lblNotification.setFont(font2) self.gridLayoutWidget_2 = QWidget(self.centralwidget) self.gridLayoutWidget_2.setObjectName(u"gridLayoutWidget_2") self.gridLayoutWidget_2.setGeometry(QRect(180, 40, 233, 68)) self.gridLayout_2 = QGridLayout(self.gridLayoutWidget_2) self.gridLayout_2.setObjectName(u"gridLayout_2") self.gridLayout_2.setSizeConstraint(QLayout.SetMaximumSize) self.gridLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout = QVBoxLayout() self.verticalLayout.setObjectName(u"verticalLayout") self.chkNotificationBanner = QCheckBox(self.gridLayoutWidget_2) self.chkNotificationBanner.setObjectName(u"chkNotificationBanner") self.chkNotificationBanner.setFont(font1) self.verticalLayout.addWidget(self.chkNotificationBanner) self.chkConnectSmartphone = QCheckBox(self.gridLayoutWidget_2) self.chkConnectSmartphone.setObjectName(u"chkConnectSmartphone") sizePolicy1.setHeightForWidth( self.chkConnectSmartphone.sizePolicy().hasHeightForWidth()) self.chkConnectSmartphone.setSizePolicy(sizePolicy1) self.chkConnectSmartphone.setFont(font) self.chkConnectSmartphone.setChecked(False) self.verticalLayout.addWidget(self.chkConnectSmartphone) self.gridLayout_2.addLayout(self.verticalLayout, 1, 0, 1, 1) self.lblSetting = QLabel(self.centralwidget) self.lblSetting.setObjectName(u"lblSetting") self.lblSetting.setGeometry(QRect(20, 120, 141, 31)) sizePolicy2.setHeightForWidth( self.lblSetting.sizePolicy().hasHeightForWidth()) self.lblSetting.setSizePolicy(sizePolicy2) self.lblSetting.setFont(font2) self.btnStart = QPushButton(self.centralwidget) self.btnStart.setObjectName(u"btnStart") self.btnStart.setGeometry(QRect(50, 270, 161, 31)) font3 = QFont() font3.setFamily(u"Malgun Gothic") font3.setPointSize(14) self.btnStart.setFont(font3) self.btnStop = QPushButton(self.centralwidget) self.btnStop.setObjectName(u"btnStop") self.btnStop.setGeometry(QRect(260, 270, 91, 31)) self.btnStop.setFont(font3) self.widget = QWidget(self.centralwidget) self.widget.setObjectName(u"widget") self.widget.setGeometry(QRect(10, 160, 409, 99)) self.horizontalLayout = QHBoxLayout(self.widget) self.horizontalLayout.setObjectName(u"horizontalLayout") self.horizontalLayout.setSizeConstraint(QLayout.SetMinimumSize) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.lblBlinkTime = QLabel(self.widget) self.lblBlinkTime.setObjectName(u"lblBlinkTime") self.horizontalLayout.addWidget(self.lblBlinkTime) self.txtBlinkTime = QLineEdit(self.widget) self.txtBlinkTime.setObjectName(u"txtBlinkTime") font4 = QFont() font4.setPointSize(10) self.txtBlinkTime.setFont(font4) self.horizontalLayout.addWidget(self.txtBlinkTime) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName(u"menubar") self.menubar.setGeometry(QRect(0, 0, 423, 21)) MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName(u"statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) # settingsRestoration self.chkScreenRest.setChecked(bool(Util.get_screen_rest_monitoring())) self.chkEyeBlink.setChecked(bool(Util.get_blink_monitoring())) self.chkNotificationBanner.setChecked( bool(Util.get_notification_enabled())) self.chkConnectSmartphone.setChecked( bool(Util.get_smart_notification_enabled())) self.txtBlinkTime.setText(Util.get_timeout()) # events self.btnStart.clicked.connect( lambda: start_blink_detection()) # Set Start button self.chkScreenRest.stateChanged.connect( lambda: Util.set_screen_rest_monitoring(self.chkScreenRest. isChecked())) self.chkEyeBlink.stateChanged.connect( lambda: Util.set_blink_monitoring(self.chkEyeBlink.isChecked())) self.chkConnectSmartphone.stateChanged.connect( lambda: Util.set_smart_notification_enabled( self.chkConnectSmartphone.isChecked())) self.chkNotificationBanner.stateChanged.connect( lambda: Util.set_notification_enabled(self.chkNotificationBanner. isChecked())) self.txtBlinkTime.editingFinished.connect( lambda: Util.set_timeout(self.txtBlinkTime.text())) self.btnStop.clicked.connect(sys.exit) QMetaObject.connectSlotsByName(MainWindow) # setupUi def retranslateUi(self, MainWindow): MainWindow.setWindowTitle( QCoreApplication.translate("MainWindow", u"AI - Svasthya", None)) self.chkScreenRest.setText( QCoreApplication.translate("MainWindow", u"Screen Rest", None)) self.chkEyeBlink.setText( QCoreApplication.translate("MainWindow", u"Eye Blinks", None)) self.lblMonitor.setText( QCoreApplication.translate("MainWindow", u"Monitor", None)) self.lblNotification.setText( QCoreApplication.translate("MainWindow", u"Notification", None)) self.chkNotificationBanner.setText( QCoreApplication.translate("MainWindow", u"Show Notification Banner", None)) self.chkConnectSmartphone.setText( QCoreApplication.translate("MainWindow", u"Connect to Smartphone", None)) self.lblSetting.setText( QCoreApplication.translate("MainWindow", u"Settings", None)) self.btnStart.setText( QCoreApplication.translate("MainWindow", u"Start monitoring", None)) self.btnStop.setText( QCoreApplication.translate("MainWindow", u"Stop ", None)) self.lblBlinkTime.setText( QCoreApplication.translate( "MainWindow", u"Blink warning after not blinked for(per " u"minute)-", None)) self.txtBlinkTime.setText( QCoreApplication.translate("MainWindow", u"15", None))
class AuthWindowUI(object): def __init__(self, MainWin): # Main Window MainWin.setObjectName("AuthWindow") MainWin.setWindowIcon(MainWin.window_icon) MainWin.setWindowTitle(MainWin.tr(MainWin.window_title)) MainWin.resize(1024, 860) self.config = MainWin.config self.centralWidget = QWidget(MainWin) self.centralWidget.setObjectName("centralWidget") MainWin.setCentralWidget(self.centralWidget) self.verticalLayout = QVBoxLayout(self.centralWidget) self.verticalLayout.setContentsMargins(11, 11, 11, 11) self.verticalLayout.setSpacing(6) self.verticalLayout.setObjectName("verticalLayout") self.tabWidget = QTabWidget(MainWin) self.tabWidget.currentChanged.connect(MainWin.onTabChanged) self.tabWidget.tabCloseRequested.connect(MainWin.onTabClosed) self.tabWidget.setTabsClosable(True) # workaround for https://bugreports.qt.io/browse/QTBUG-58267 if "darwin" in sys.platform: self.tabWidget.setDocumentMode(True) # Splitter for log self.splitter = QSplitter(Qt.Vertical) self.splitter.addWidget(self.tabWidget) # Log Widget self.logTextBrowser = QPlainTextEditLogger(self.centralWidget) self.logTextBrowser.widget.setObjectName("logTextBrowser") self.logTextBrowser.widget.setStyleSheet(""" QPlainTextEdit { border: 2px solid grey; border-radius: 5px; background-color: lightgray; } """) self.splitter.addWidget(self.logTextBrowser.widget) # add splitter self.splitter.setSizes([800, 100]) self.verticalLayout.addWidget(self.splitter) # Tool Bar self.mainToolBar = QToolBar(MainWin) self.mainToolBar.setObjectName("mainToolBar") self.mainToolBar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) self.mainToolBar.setContextMenuPolicy(Qt.PreventContextMenu) MainWin.addToolBar(Qt.TopToolBarArea, self.mainToolBar) # Servers self.serverWidget = QWidget(MainWin) self.serverLayout = QHBoxLayout() self.serverLabel = QLabel("Server:") self.serverLayout.addWidget(self.serverLabel) self.serverComboBox = QComboBox() self.serverComboBox.setEditable(True) self.serverComboBox.setDuplicatesEnabled(False) self.serverComboBox.setMinimumContentsLength(50) self.serverComboBox.currentIndexChanged.connect( MainWin.onServerListChanged) lineEdit = self.serverComboBox.lineEdit() lineEdit.returnPressed.connect(MainWin.on_actionAdd_triggered) self.serverLayout.addWidget(self.serverComboBox) self.serverWidget.setLayout(self.serverLayout) self.mainToolBar.addWidget(self.serverWidget) # Add self.actionAdd = QAction(MainWin) self.actionAdd.setObjectName("actionAdd") self.actionAdd.setText(MainWin.tr("Add")) self.actionAdd.setToolTip(MainWin.tr("Add to server list")) self.actionAdd.setShortcut(MainWin.tr("Ctrl+A")) # Remove self.actionRemove = QAction(MainWin) self.actionRemove.setObjectName("actionRemove") self.actionRemove.setText(MainWin.tr("Remove")) self.actionRemove.setToolTip(MainWin.tr("Remove from server list")) self.actionRemove.setShortcut(MainWin.tr("Ctrl+X")) # Show Token self.actionShowToken = QAction(MainWin) self.actionShowToken.setEnabled(False) self.actionShowToken.setObjectName("actionShowToken") self.actionShowToken.setText(MainWin.tr("Show Token")) self.actionShowToken.setToolTip( MainWin.tr("Display the current authentication token")) self.actionShowToken.setShortcut(MainWin.tr("Ctrl+S")) # Login self.actionLogin = QAction(MainWin) self.actionLogin.setObjectName("actionLogin") self.actionLogin.setText(MainWin.tr("Login")) self.actionLogin.setToolTip( MainWin.tr("Login to the currently selected server")) self.actionLogin.setShortcut(MainWin.tr("Ctrl+L")) # Logout self.actionLogout = QAction(MainWin) self.actionLogout.setObjectName("actionLogout") self.actionLogout.setText(MainWin.tr("Logout")) self.actionLogout.setToolTip( MainWin.tr("Logout of the currently selected server")) self.actionLogout.setShortcut(MainWin.tr("Ctrl+O")) # Add self.mainToolBar.addAction(self.actionAdd) self.actionAdd.setIcon(qApp.style().standardIcon( QStyle.SP_FileDialogNewFolder)) # Remove self.mainToolBar.addAction(self.actionRemove) self.actionRemove.setIcon(qApp.style().standardIcon( QStyle.SP_DialogDiscardButton)) # Show Token self.mainToolBar.addAction(self.actionShowToken) self.actionShowToken.setIcon(qApp.style().standardIcon( QStyle.SP_FileDialogInfoView)) self.mainToolBar.addSeparator() # this spacer right justifies everything that comes after it spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.mainToolBar.addWidget(spacer) # Login self.mainToolBar.addSeparator() self.mainToolBar.addAction(self.actionLogin) self.actionLogin.setIcon(qApp.style().standardIcon( QStyle.SP_DialogApplyButton)) # Logout self.mainToolBar.addSeparator() self.mainToolBar.addAction(self.actionLogout) self.actionLogout.setIcon(qApp.style().standardIcon( QStyle.SP_DialogOkButton)) # Status Bar self.statusBar = QStatusBar(MainWin) self.statusBar.setToolTip("") self.statusBar.setStatusTip("") self.statusBar.setObjectName("statusBar") MainWin.setStatusBar(self.statusBar) # configure logging self.logTextBrowser.widget.log_update_signal.connect(MainWin.updateLog) self.logTextBrowser.setFormatter( logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")) logging.getLogger().addHandler(self.logTextBrowser) logging.getLogger().setLevel(logging.INFO) # finalize UI setup QMetaObject.connectSlotsByName(MainWin)
class UiInstagram(PageWindow): # UI for Instagram ,Downloads Instagram Video def __init__(self): super().__init__() self.initUI() self.setWindowTitle(" INSTAGRAM - ELITELOADER") def initUI(self): self.setupUi(self) def is_connected(self, test_url: str = "https://instagram.com", timeout: int = 2) -> bool: """ Checks Internet Connection returns-Bool value """ try: test_connection = requests.get(test_url, timeout=timeout) test_connection.raise_for_status() return True except requests.HTTPError as error: print("http error") QMessageBox.question(self, "Error", 'http error', QMessageBox.Ok) except requests.exceptions.ConnectionError: print( "An error happened when trying to establish a connection to Instagram." ) QMessageBox.question(self, "Error", 'http error', QMessageBox.Ok) return False def is_instagram_domain(self, post_url: str = None) -> bool: """ Check if its a insta domain returns-Bool value """ is_match = match(r"^(https:)[/][/]www.([^/]+[.])*instagram.com", post_url) if is_match: return True else: return False def determine_media_type(self, media_content: str = None) -> str: """ Determines the media type returns-media type (image or video) """ content_type_header: str = search( r'<meta name="medium" content=[\'"]?([^\'" >]+)', media_content).group() content_type = sub(r'<meta name="medium" content="', "", content_type_header) return content_type def extract_video_direct_link(self, media_content: str = None) -> str: """ Gets direct url of the video """ image_link_header: str = search( r'meta property="og:video" content=[\'"]?([^\'" >]+)', media_content).group() video_link: str = sub(r'meta property="og:video" content="', "", image_link_header) return video_link def download_video(self, post_content: str = None) -> None: """ Downloads the video and displays progressbar""" try: video_direct_url: str = self.extract_video_direct_link( post_content) video_content = requests.get(video_direct_url, stream=True) video_size = int(video_content.headers["Content-Length"]) video_file_path = data.get('loc') self.label_for_Size.setText("SIZE: " + str(round(video_size * (0.000001), 3)) + ' MB') downloaded = 0 with open(video_file_path, "wb") as video_file: for data_block in video_content.iter_content(BLOCK_SIZE): downloaded += len(data_block) video_file.write(data_block) pct = (downloaded / video_size) * 100 self.progressBar.setValue(int(pct)) except: QMessageBox.question(self, "Error", "Download Failed!!", QMessageBox.Ok) exit(0) def main(self, url): """ Checks URL and connetion """ if not self.is_connected(): QMessageBox.question(self, "Error", "Download Failed!!", QMessageBox.Ok) exit() if not self.is_instagram_domain(url): QMessageBox.question(self, "Error", "Download Failed!!", QMessageBox.Ok) exit() media_content = requests.get(url).content.decode("utf-8") media_type = self.determine_media_type(media_content) if media_type == "image": print("image link found") exit(0) elif media_type == "video": self.download_video(media_content) else: QMessageBox.question(self, "Error", "Download Failed!!", QMessageBox.Ok) exit() def Initiate_Download(self, url): self.main(url) exit(0) def download(self): """ Changes UI""" self.progressBar.setVisible(True) self.pushButton.setVisible(False) self.label_for_Size.setVisible(True) self.label_info.setVisible(False) self.Title_label.setText("Starting Download..\nPlease wait...") url = data.get('url') self.t = Thread(target=self.Initiate_Download(url)) self.t.start() process.join() def setupUi(self, general_vidloader): """ Sets up UI""" general_vidloader.setObjectName("general_vidloader") self.centralwidget = QWidget(general_vidloader) self.centralwidget.setObjectName("centralwidget") self.progressBar = QProgressBar(self.centralwidget) self.progressBar.setGeometry(QRect(110, 150, 381, 25)) self.progressBar.setProperty("value", 24) self.progressBar.setObjectName("progressBar") self.progressBar.setVisible(False) self.progressBar.setValue(0) self.Title_label = QLabel(self.centralwidget) self.Title_label.setGeometry(QRect(170, 10, 261, 51)) self.label_for_Size = QLabel(self.centralwidget) self.label_for_Size.setGeometry(QRect(220, 200, 180, 41)) self.label_for_Size.setObjectName("label_for_SizeDisplay") self.label_for_Size.setVisible(False) self.Title_label = QLabel(self.centralwidget) self.Title_label.setGeometry(QRect(230, 20, 230, 41)) font = QFont() font.setPointSize(14) font.setBold(True) font.setItalic(True) font.setWeight(75) self.Title_label.setFont(font) self.Title_label.setObjectName("Title_label") self.label_info = QLabel(self.centralwidget) self.label_info.setGeometry(QRect(30, 300, 271, 17)) self.label_info.setObjectName("label_info") self.pushButton = QPushButton(self.centralwidget) self.pushButton.setGeometry(QRect(430, 220, 88, 33)) self.pushButton.setObjectName("pushButton") self.pushButton.clicked.connect(lambda: self.download()) general_vidloader.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(general_vidloader) self.menubar.setGeometry(QRect(0, 0, 586, 25)) self.menubar.setObjectName("menubar") general_vidloader.setMenuBar(self.menubar) self.statusbar = QStatusBar(general_vidloader) self.statusbar.setObjectName("statusbar") general_vidloader.setStatusBar(self.statusbar) self.retranslateUi(general_vidloader) QMetaObject.connectSlotsByName(general_vidloader) def retranslateUi(self, general_vidloader): _translate = QCoreApplication.translate general_vidloader.setWindowTitle( _translate("general_vidloader", "Insta video downloader - ELITELOADER")) self.Title_label.setText( _translate("general_vidloader", "Continue.. ?")) self.label_info.setText( _translate("general_vidloader", "*save file with reqd. name and extension")) self.pushButton.setText(_translate("general_vidloader", "Download")) self.label_for_Size.setText(_translate("ELITE", "SIZE:"))
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1871, 1200) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.transformsGroupBox = QGroupBox(self.centralwidget) self.transformsGroupBox.setGeometry(QRect(1500, 170, 240, 500)) self.transformsGroupBox.setMaximumSize(QSize(240, 600)) font = QFont() font.setFamily("MS Shell Dlg 2") font.setPointSize(10) font.setBold(True) font.setWeight(75) self.transformsGroupBox.setFont(font) self.transformsGroupBox.setToolTip("") self.transformsGroupBox.setWhatsThis("") self.transformsGroupBox.setObjectName("transformsGroupBox") self.edgesButton = QPushButton(self.transformsGroupBox) self.edgesButton.setGeometry(QRect(110, 180, 120, 30)) self.edgesButton.setObjectName("edgesButton") self.brightnessButton = QPushButton(self.transformsGroupBox) self.brightnessButton.setGeometry(QRect(110, 20, 120, 30)) font = QFont() font.setPointSize(8) self.brightnessButton.setFont(font) self.brightnessButton.setObjectName("brightnessButton") self.getSizeButton = QPushButton(self.transformsGroupBox) self.getSizeButton.setGeometry(QRect(0, 470, 75, 23)) self.getSizeButton.setObjectName("getSizeButton") self.paramsGroupBox = QGroupBox(self.transformsGroupBox) self.paramsGroupBox.setGeometry(QRect(10, 29, 91, 321)) font = QFont() font.setPointSize(8) self.paramsGroupBox.setFont(font) self.paramsGroupBox.setObjectName("paramsGroupBox") self.leftSlider = QSlider(self.paramsGroupBox) self.leftSlider.setGeometry(QRect(10, 50, 20, 240)) sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.leftSlider.sizePolicy().hasHeightForWidth()) self.leftSlider.setSizePolicy(sizePolicy) self.leftSlider.setOrientation(Qt.Vertical) self.leftSlider.setTickPosition(QSlider.TicksAbove) self.leftSlider.setObjectName("leftSlider") self.rightSlider = QSlider(self.paramsGroupBox) self.rightSlider.setGeometry(QRect(50, 50, 20, 240)) sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.rightSlider.sizePolicy().hasHeightForWidth()) self.rightSlider.setSizePolicy(sizePolicy) self.rightSlider.setOrientation(Qt.Vertical) self.rightSlider.setTickPosition(QSlider.TicksAbove) self.rightSlider.setObjectName("rightSlider") self.leftLabel = QLabel(self.paramsGroupBox) self.leftLabel.setGeometry(QRect(10, 20, 20, 15)) self.leftLabel.setTextFormat(Qt.PlainText) self.leftLabel.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.leftLabel.setObjectName("leftLabel") self.rightLabel = QLabel(self.paramsGroupBox) self.rightLabel.setGeometry(QRect(50, 20, 20, 15)) self.rightLabel.setTextFormat(Qt.PlainText) self.rightLabel.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.rightLabel.setObjectName("rightLabel") self.adaptiveThresholdButton = QPushButton(self.transformsGroupBox) self.adaptiveThresholdButton.setGeometry(QRect(110, 140, 120, 30)) font = QFont() font.setPointSize(8) self.adaptiveThresholdButton.setFont(font) self.adaptiveThresholdButton.setObjectName("adaptiveThresholdButton") self.gray2colSelButton = QPushButton(self.transformsGroupBox) self.gray2colSelButton.setGeometry(QRect(110, 100, 120, 30)) font = QFont() font.setPointSize(8) self.gray2colSelButton.setFont(font) self.gray2colSelButton.setObjectName("gray2colSelButton") self.gray2colAllButton = QPushButton(self.transformsGroupBox) self.gray2colAllButton.setGeometry(QRect(110, 60, 120, 30)) font = QFont() font.setPointSize(8) self.gray2colAllButton.setFont(font) self.gray2colAllButton.setObjectName("gray2colAllButton") self.fftButton = QPushButton(self.transformsGroupBox) self.fftButton.setGeometry(QRect(110, 220, 120, 30)) self.fftButton.setObjectName("fftButton") self.dftButton = QPushButton(self.transformsGroupBox) self.dftButton.setGeometry(QRect(110, 260, 120, 30)) self.dftButton.setObjectName("dftButton") self.gaborButton = QPushButton(self.transformsGroupBox) self.gaborButton.setGeometry(QRect(110, 300, 120, 30)) self.gaborButton.setObjectName("gaborButton") self.differenceButton = QPushButton(self.transformsGroupBox) self.differenceButton.setGeometry(QRect(110, 340, 120, 30)) self.differenceButton.setObjectName("differenceButton") self.RGB2GrayButton = QPushButton(self.transformsGroupBox) self.RGB2GrayButton.setGeometry(QRect(110, 380, 120, 30)) self.RGB2GrayButton.setObjectName("RGB2GrayButton") self.invertedCheckBox = QCheckBox(self.transformsGroupBox) self.invertedCheckBox.setGeometry(QRect(110, 430, 121, 17)) self.invertedCheckBox.setObjectName("invertedCheckBox") self.angleDial = QDial(self.transformsGroupBox) self.angleDial.setGeometry(QRect(20, 360, 81, 64)) self.angleDial.setMinimum(1) self.angleDial.setMaximum(4) self.angleDial.setPageStep(1) self.angleDial.setSliderPosition(1) self.angleDial.setWrapping(False) self.angleDial.setNotchesVisible(True) self.angleDial.setObjectName("angleDial") self.groupButtonsBox = QGroupBox(self.centralwidget) self.groupButtonsBox.setGeometry(QRect(1500, 730, 241, 141)) self.groupButtonsBox.setMaximumSize(QSize(250, 600)) font = QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.groupButtonsBox.setFont(font) self.groupButtonsBox.setObjectName("groupButtonsBox") self.addImgButton = QPushButton(self.groupButtonsBox) self.addImgButton.setGeometry(QRect(50, 20, 150, 30)) palette = QPalette() brush = QBrush(QColor(180, 146, 66)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Active, QPalette.Button, brush) brush = QBrush(QColor(180, 146, 66)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Inactive, QPalette.Button, brush) brush = QBrush(QColor(180, 146, 66)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Disabled, QPalette.Button, brush) self.addImgButton.setPalette(palette) font = QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.addImgButton.setFont(font) self.addImgButton.setObjectName("addImgButton") self.saveSceneImgButton = QPushButton(self.groupButtonsBox) self.saveSceneImgButton.setGeometry(QRect(50, 60, 150, 30)) font = QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.saveSceneImgButton.setFont(font) self.saveSceneImgButton.setObjectName("saveSceneImgButton") self.saveImgButton = QPushButton(self.groupButtonsBox) self.saveImgButton.setGeometry(QRect(50, 100, 150, 30)) font = QFont() font.setPointSize(9) font.setBold(True) font.setWeight(75) self.saveImgButton.setFont(font) self.saveImgButton.setObjectName("saveImgButton") self.graphicsView = QGraphicsView(self.centralwidget) self.graphicsView.setGeometry(QRect(10, 15, 1471, 900)) self.graphicsView.setMaximumSize(QSize(4000, 3000)) self.graphicsView.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.graphicsView.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.graphicsView.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) self.graphicsView.setObjectName("graphicsView") self.scene = TransformScene() self.graphicsView.setScene(self.scene) self.scaleEditLabel = QLabel(self.centralwidget) self.scaleEditLabel.setGeometry(QRect(1500, 100, 47, 13)) font = QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.scaleEditLabel.setFont(font) self.scaleEditLabel.setObjectName("scaleEditLabel") self.scaleBox = QDoubleSpinBox(self.centralwidget) self.scaleBox.setGeometry(QRect(1550, 100, 62, 22)) font = QFont() font.setBold(True) font.setWeight(75) self.scaleBox.setFont(font) self.scaleBox.setMinimum(0.1) self.scaleBox.setMaximum(10.0) self.scaleBox.setSingleStep(0.1) self.scaleBox.setProperty("value", 0.5) self.scaleBox.setObjectName("scaleBox") self.infoLabel = QLabel(self.centralwidget) self.infoLabel.setGeometry(QRect(1499, 130, 230, 20)) self.infoLabel.setFrameShape(QFrame.WinPanel) self.infoLabel.setText("") self.infoLabel.setAlignment(Qt.AlignCenter) self.infoLabel.setObjectName("infoLabel") self.infoLabel_2 = QLabel(self.centralwidget) self.infoLabel_2.setGeometry(QRect(1500, 20, 230, 20)) font = QFont() font.setBold(True) font.setItalic(True) font.setWeight(75) self.infoLabel_2.setFont(font) self.infoLabel_2.setFrameShape(QFrame.WinPanel) self.infoLabel_2.setText("") self.infoLabel_2.setAlignment(Qt.AlignCenter) self.infoLabel_2.setObjectName("infoLabel_2") self.infoLabel_3 = QLabel(self.centralwidget) self.infoLabel_3.setGeometry(QRect(1500, 60, 230, 20)) font = QFont() font.setBold(True) font.setItalic(True) font.setWeight(75) self.infoLabel_3.setFont(font) self.infoLabel_3.setFrameShape(QFrame.Box) self.infoLabel_3.setText("") self.infoLabel_3.setAlignment(Qt.AlignCenter) self.infoLabel_3.setObjectName("infoLabel_3") self.clearImgButton = QPushButton(self.centralwidget) self.clearImgButton.setGeometry(QRect(1550, 690, 150, 30)) font = QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.clearImgButton.setFont(font) self.clearImgButton.setObjectName("clearImgButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setGeometry(QRect(0, 0, 1871, 21)) self.menubar.setObjectName("menubar") self.menuHelp = QMenu(self.menubar) self.menuHelp.setObjectName("menuHelp") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.actionExit = QAction(MainWindow) self.actionExit.setObjectName("actionExit") self.actionHelp = QAction(MainWindow) self.actionHelp.setObjectName("actionHelp") self.actionAbout = QAction(MainWindow) self.actionAbout.setObjectName("actionAbout") self.actionDefault_Values = QAction(MainWindow) self.actionDefault_Values.setObjectName("actionDefault_Values") self.menuHelp.addAction(self.actionHelp) self.menuHelp.addAction(self.actionAbout) self.menuHelp.addSeparator() self.menuHelp.addAction(self.actionDefault_Values) self.menubar.addAction(self.menuHelp.menuAction()) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) self.scene.file_signal.connect(on_file_signal) self.scene.info_signal.connect(on_info_signal) self.scene.sliders_reset_signal.connect(on_sliders_reset_signal) def retranslateUi(self, MainWindow): _translate = QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Green Monkey")) self.transformsGroupBox.setTitle(_translate("MainWindow", "Transformations")) self.edgesButton.setText(_translate("MainWindow", "Edges, Sobel")) self.brightnessButton.setToolTip(_translate("MainWindow", "You can change brightness with left slider and blur with rigt one.")) self.brightnessButton.setWhatsThis(_translate("MainWindow", "You can change brightness with left slider and blur with rigt one.")) self.brightnessButton.setText(_translate("MainWindow", "Brightness and Blur")) self.getSizeButton.setText(_translate("MainWindow", "get Size")) self.paramsGroupBox.setTitle(_translate("MainWindow", "Parameters")) self.leftSlider.setToolTip(_translate("MainWindow", "Adaptive Threshold\n" "blockSize – Size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on.")) self.leftSlider.setWhatsThis(_translate("MainWindow", "Adaptive Threshold\n" "blockSize – Size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on.")) self.rightSlider.setToolTip(_translate("MainWindow", "Adaptive Threshold\n" "C – Constant subtracted from the mean or weighted mean (see the details below). Normally, it is positive but may be zero or negative as well.")) self.rightSlider.setWhatsThis(_translate("MainWindow", "Adaptive Threshold\n" "C – Constant subtracted from the mean or weighted mean (see the details below). Normally, it is positive but may be zero or negative as well.")) self.leftLabel.setText(_translate("MainWindow", "0")) self.rightLabel.setText(_translate("MainWindow", "0")) self.adaptiveThresholdButton.setText(_translate("MainWindow", "Adaptive Threshold")) self.gray2colSelButton.setToolTip(_translate("MainWindow", "Gray scale 0..255 to color with selected method only.\n" "Image is converted to gray and finally to color.")) self.gray2colSelButton.setWhatsThis(_translate("MainWindow", "Gray scale 0..255 to color with selected method only.\n" "Image is converted to gray and and finally to color.")) self.gray2colSelButton.setText(_translate("MainWindow", "Gray2Color Sel.")) self.gray2colAllButton.setToolTip(_translate("MainWindow", "Gray scale 0..255 to color for all available methods.\n" "Image resized as per scale window and then is converted to gray and finally to color.")) self.gray2colAllButton.setWhatsThis(_translate("MainWindow", "Gray scale 0..255 to color for all available methods.\n" "Image resized as per scale window and then is converted to gray and finally to color.")) self.gray2colAllButton.setText(_translate("MainWindow", "Gray2Color All")) self.fftButton.setText(_translate("MainWindow", "FFT")) self.dftButton.setText(_translate("MainWindow", "DFT")) self.gaborButton.setToolTip(_translate("MainWindow", "Applies Gabor Filter")) self.gaborButton.setWhatsThis(_translate("MainWindow", "Applies Gabor Filter")) self.gaborButton.setText(_translate("MainWindow", "Gabor Filter")) self.differenceButton.setText(_translate("MainWindow", "Difference")) self.RGB2GrayButton.setText(_translate("MainWindow", "RGB to Gray")) self.invertedCheckBox.setText(_translate("MainWindow", "Inverted Image")) self.angleDial.setToolTip(_translate("MainWindow", "GABOR Filter - angle 1..4 ~ 1*np.pi/angle")) self.angleDial.setWhatsThis(_translate("MainWindow", "GABOR Filter - angle 1..4 ~ 1*np.pi/angle")) self.groupButtonsBox.setTitle(_translate("MainWindow", "Images")) self.addImgButton.setText(_translate("MainWindow", "Add Image(s)")) self.addImgButton.setShortcut(_translate("MainWindow", "Ctrl+A")) self.saveSceneImgButton.setText(_translate("MainWindow", "Save Scene as Image")) self.saveImgButton.setText(_translate("MainWindow", "Save Selected as Image")) self.scaleEditLabel.setText(_translate("MainWindow", "Scale:")) self.clearImgButton.setText(_translate("MainWindow", "Clear Image(s)")) self.menuHelp.setTitle(_translate("MainWindow", "Help")) self.actionExit.setText(_translate("MainWindow", "Exit")) self.actionHelp.setText(_translate("MainWindow", "Help")) self.actionAbout.setText(_translate("MainWindow", "About")) self.actionDefault_Values.setText(_translate("MainWindow", "Default Values")) self.actionHelp.setShortcut('F1') self.actionHelp.setStatusTip('Help') self.actionHelp.triggered.connect(self.showHelp) self.actionAbout.setStatusTip('About') self.actionAbout.triggered.connect(self.showAbout) self.actionDefault_Values.setStatusTip('Default folders and other values') self.actionDefault_Values.triggered.connect(self.updateINI) self.addImgButton.clicked.connect(partial(self.scene.addImg)) self.clearImgButton.clicked.connect(self.scene.dialogClearScene) self.saveSceneImgButton.clicked.connect(partial(self.scene.saveScene)) self.saveImgButton.clicked.connect(partial(self.scene.saveImg)) self.scaleBox.valueChanged.connect(self.onScaleBoxValueChanged) self.getSizeButton.clicked.connect(self.showSceneSize) self.brightnessButton.clicked.connect(self.startBrightnessAndBlur) self.gray2colAllButton.clicked.connect(self.startGray2colAllButton) self.gray2colSelButton.clicked.connect(self.startGray2colSelButton) self.adaptiveThresholdButton.clicked.connect(self.startAdaptiveThreshold) self.edgesButton.clicked.connect(self.startSobelXY) self.fftButton.clicked.connect(self.startFFT) self.dftButton.clicked.connect(self.startDFT) self.gaborButton.clicked.connect(self.startGabor) self.differenceButton.clicked.connect(self.startDifference) self.RGB2GrayButton.clicked.connect(self.starRGB2Gray) self.leftSlider.valueChanged['int'].connect(self. leftSliderChanged) self.rightSlider.valueChanged['int'].connect(self.rightSliderChanged) self.angleDial.valueChanged['int'].connect(self.angleDialChanged) def setStart(self): self.graphicsView.setAlignment(Qt.AlignLeft|Qt.AlignTop) self.scene.setSceneRect(0, 0, 0, 0) self.scene.imgScale = self.scaleBox.value() self.clearSliders() self.infoLabel.setText("") self.scene.cv2Images = {} self.transformsGroupBox.setEnabled(False) self.transformsGroupBox.setEnabled(False) self.invertedCheckBox.setChecked(False) def clearSliders(self): self.infoLabel_2.setText('') self.infoLabel_3.setText('') self.scene.currentTransform = 0 self.leftSlider.setEnabled(False) self.leftSlider.setToolTip("") self.leftSlider.setWhatsThis("") self.leftSlider.setMaximum(99) self.leftSlider.setMinimum(0) self.leftSlider.setTickInterval(10) self.leftSlider.setSingleStep(1) self.leftSlider.setTickPosition(11) self.rightSlider.setEnabled(False) self.rightSlider.setToolTip("") self.rightSlider.setWhatsThis("") self.rightSlider.setMaximum(99) self.rightSlider.setMinimum(0) self.rightSlider.setTickInterval(10) self.rightSlider.setSingleStep(1) self.rightSlider.setTickPosition(0) self.paramsGroupBox.setFlat(False) self.paramsGroupBox.setStyleSheet('QGroupBox * {color: black; font-weight: normal;}') self.angleDial.setEnabled(False) self.angleDial.setToolTip(" ") self.angleDial.setWhatsThis("") def invertCheckBoxEvent(self, checked): self.scene.inverted = checked def showSceneSize(self): x = self.scene.sceneRect().width() y = self.scene.sceneRect().height() self.infoLabel.setText(f'size: {x}x{y}, {self.scene.findSceneArea()}') def onScaleBoxValueChanged(self, val): self.scene.imgScale = val def startBrightnessAndBlur(self): self.scene.currentTransform = 1 self.infoLabel_2.setText('Adaptive Threshold') self.scene.currentBrightnessValue = 0 self.scene.currentBlurValue = 0 self.scene.transform1() self.infoLabel_2.setText('Brightness and Blur') self.scene.currentTransform = 1 self.leftSlider.setEnabled(True) self.rightSlider.setEnabled(True) self.leftSlider.setToolTip("Change Brightness -> 0 .. 99") self.leftSlider.setWhatsThis("Change Brightness -> 0 .. 99") self.rightSlider.setToolTip("Change Blur -> 0 .. 99") self.rightSlider.setWhatsThis("Change Blur -> 0 .. 99") self.leftSlider.setMaximum(99) self.leftSlider.setMinimum(0) self.leftSlider.setTickInterval(10) self.leftSlider.setSingleStep(1) self.leftSlider.setTickPosition(11) self.rightSlider.setMaximum(99) self.rightSlider.setMinimum(0) self.rightSlider.setTickInterval(10) self.rightSlider.setSingleStep(1) self.rightSlider.setTickPosition(0) self.paramsGroupBox.setFlat(True) self.paramsGroupBox.setStyleSheet('QGroupBox * {color: red; font-weight: bold;}') def startGray2colAllButton(self): self.infoLabel_2.setText('Gray to Color All Methods') self.scene.currentTransform = 2 self.scene.transform2(1, 1) def startGray2colSelButton(self): self.scene.currentTransform = 3 self.infoLabel_2.setText(' Gray to Color') self.scene.transform2(0, 1) def startSobelXY(self): self.scene.currentTransform = 4 self.infoLabel_2.setText('Edge Detection') self.scene.transform4() def startFFT(self): self.scene.currentTransform = 7 self.infoLabel_2.setText('FFT') self.scene.transform7() def startDFT(self): self.scene.currentTransform = 6 self.infoLabel_2.setText('DFT') self.scene.transform6() def startDenoising(self): self.scene.currentTransform = 8 self.infoLabel_2.setText('Denoising') self.scene.transform8() def startDifference(self): self.scene.currentTransform = 9 self.infoLabel_2.setText('Difference') self.scene.transform9() def starRGB2Gray(self): self.scene.currentTransform = 10 #txt = self.infoLabel_2.text() self.infoLabel_2.setText('RGB to Gray') self.scene.transform10() def startAdaptiveThreshold(self): self.scene.currentTransform = 5 self.infoLabel_2.setText('Adaptive Threshold') self.scene.currentBlockSizeValue = 11 self.scene.currentCValue = 5 self.scene.transform5() self.leftSlider.setEnabled(True) self.rightSlider.setEnabled(True) self.leftSlider.setToolTip("Adaptive Threshold\n" "blockSize – Size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on.") self.leftSlider.setWhatsThis("Adaptive Threshold\n" "blockSize – Size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on.") self.rightSlider.setToolTip("Adaptive Threshold\n" "C – Constant subtracted from the mean or weighted mean (see the details below). Normally, it is positive but may be zero or negative as well.") self.rightSlider.setWhatsThis("Adaptive Threshold\n" "C – Constant subtracted from the mean or weighted mean (see the details below). Normally, it is positive but may be zero or negative as well.") self.leftSlider.setMaximum(16) self.leftSlider.setMinimum(1) self.leftSlider.setTickInterval(1) self.leftSlider.setSingleStep(1) self.leftSlider.setTickPosition(11) self.rightSlider.setMaximum(20) self.rightSlider.setMinimum(-5) self.rightSlider.setTickInterval(1) self.rightSlider.setSingleStep(1) self.rightSlider.setTickPosition(5) self.paramsGroupBox.setFlat(True) self.paramsGroupBox.setStyleSheet('QGroupBox * {color: red; font-weight: bold;}') def startGabor(self): self.scene.currentTransform = 8 self.infoLabel_2.setText('Gabor Filter') self.scene.currentKernelSizeValue = 10 self.scene.currentSigmaValue = 10 self.scene.thetaCurrentValue self.scene.transform8() self.angleDial.setEnabled(True) self.leftSlider.setEnabled(True) self.rightSlider.setEnabled(True) self.leftSlider.setToolTip("Gabor Filter\n" "kernelSize – Size of a kernel 1..50") self.leftSlider.setWhatsThis("Gabor Filter\n" "kernelSize – Size of a kernel") self.rightSlider.setToolTip("Gabor Filter\n" "Standard Deviation – 1..30") self.rightSlider.setWhatsThis("Gabor Filter\n" "Standard Deviation – 1..30") self.angleDial.setToolTip("GABOR Filter - angle 1..4 ~ 1*np.pi/angle") self.angleDial.setWhatsThis("GABOR Filter - angle 1..4 ~ 1*np.pi/angle") self.leftSlider.setMaximum(50) self.leftSlider.setMinimum(1) self.leftSlider.setTickInterval(5) self.leftSlider.setSingleStep(5) self.leftSlider.setTickPosition(10) self.rightSlider.setMaximum(30) self.rightSlider.setMinimum(1) self.rightSlider.setTickInterval(5) self.rightSlider.setSingleStep(5) self.rightSlider.setTickPosition(10) self.paramsGroupBox.setFlat(True) self.paramsGroupBox.setStyleSheet('QGroupBox * {color: red; font-weight: bold;}') def leftSliderChanged(self, value): self.leftLabel.setText(str(value)) if self.scene.currentTransform == 1: self.scene.currentBrightnessValue = value elif self.scene.currentTransform == 5: if value % 2 == 1:return self.scene.currentBlockSizeValue = value elif self.scene.currentTransform == 8: self.scene.currentKernelSizeValue = value else: pass self.update() def rightSliderChanged(self, value): self.rightLabel.setText(str(value)) if self.scene.currentTransform == 1: self.scene.currentBlurValue = value elif self.scene.currentTransform == 5: self.scene.currentCValue = value elif self.scene.currentTransform == 8: self.scene.currentSigmaValue = value else: pass self.update() def angleDialChanged(self, value): if self.scene.currentTransform == 8: self.scene.thetaCurrentValue = value self.update() def update(self): if self.scene.currentTransform == 1: if len(self.scene.selectedItems()) > 0: self.scene.transform1() elif self.scene.currentTransform == 5: self.infoLabel_2.setText(f'Adaptive Threshold {self.scene.currentBlockSizeValue} {self.scene.currentCValue}') if len(self.scene.selectedItems()) > 0: self.scene.transform5() elif self.scene.currentTransform == 8: if len(self.scene.selectedItems()) > 0: self.scene.transform8() else: ... def updateINI(self): Dialog = QDialog() ui = Ui_INI_Dialog() ui.setupUi(Dialog) Dialog.show() Dialog.exec_() self.readINI() def readINI(self): self.scene.source_dir = '' self.scene.result_dir = '' self.scene.color_map = '' self.scene.scale = '' if os.path.exists("elilik.ini"): f = open("elilik.ini", "r") Lines = f.readlines() # Strips the newline character for line in Lines: l = line.strip() if "source_dir : " in l: self.scene.source_dir = l.replace("source_dir : ","").strip() elif "result_dir : " in l: self.scene.result_dir = l.replace("result_dir : ","").strip() elif "color_map : " in l: s = l.replace("color_map : ","").strip() self.scene.color_map = s.split() elif "scale : " in l: self.scene.scale = l.replace("scale : ","").strip() else: ... def showHelp(self): help = showText(os.getcwd()+"/help.html") help.exec_() def showAbout(self): about = showText(os.getcwd()+"/about.html") about.resize(280,250) about.exec_()
class UiYoutube(PageWindow): # Youtube UI and Youtube Download Manager def __init__(self): super().__init__() self.initUI() self.setWindowTitle("Youtube Downloader") def initUI(self): self.setupUi(self) def UiTest(self): # Used for testing UI self.progressBar.setVisible(True) self.pushButton.setVisible(False) self.groupBox_for_videoFormats.setVisible(False) self.groupBox_for_typeSelection.setVisible(False) self.label_for_SizeDisplay.setVisible(True) self.label_for_FilenameDisplay.setVisible(True) def type_vid(self): # Executed, if the type video is selected """ Changes the UI for video downloading """ self.groupBox_for_typeSelection.setVisible(False) self.groupBox_for_videoFormats.setVisible(True) self.resolution_comboBox.setVisible(True) self.pushButton.setVisible(True) self.progressive_checkbox.setVisible(True) QMessageBox.question( self, 'NOTE', "HD Videos are stored separately as Audio and Only Video " "formats in youtube.\nUse High" " resolution option to download HD video and combine it with" " audio with FFMPEG for best result.\n**-->>SD(480p-) videos " "are available in combined form.", QMessageBox.Ok) TYPE = "video" data.add('type', TYPE) print('Type -> video proceeding to qual,format setup') def type_aud(self): # Executed, if the type Audio is selected """ Establishes connection and downloads audio """ print('Type audio -> ask loc and start download') TYPE = "audio" data.add('type', TYPE) self.groupBox_for_typeSelection.setVisible(False) self.Title_label.setText('PLEASE WAIT...\nStarting Download..') path_to_save = QFileDialog.getExistingDirectory() print(path_to_save) data.add('loc', path_to_save) print(data, '@ type aud') try: yt = YouTube(data.get('url')) aud_stream = yt.streams.filter(type='audio').first( ) # Establish connection and gets audio stream except: print('OOPs!') QMessageBox.question(self, 'ELITE', 'Server Connection Failed!!', QMessageBox.Ok) exit(0) if aud_stream is None: # Check if audio stream is available print('SGS_ERROR-404_NO_STREAM') QMessageBox.question( self, 'ELITE', 'Selected Stream not available\nPing Streams' ' from other menu or retry a different stream', QMessageBox.Ok) exit(0) else: try: aud_stream.download(str( data.get('loc'))) # Download in given location print('SGS_CODE_SUCCESS') QMessageBox.question(self, 'ELITE', 'Download succesful !!!', QMessageBox.Ok) except: print('ERROR_IN_DOWNLOAD') QMessageBox.question(self, 'ELITE', 'Download Failed !!!', QMessageBox.Ok) exit(0) exit(0) def progress_check(self, stream=None, chunk=None, remaining=None): """ Computes percentage for displaying in progressbar """ percentage = (100 * (data.get('size') - remaining)) / data.get('size') self.progressBar.setValue(int(percentage)) def download_manager_vid(self): # Downloads Youtube videos """ Establishes connection and selects reqd. stream and downloads it """ try: yt = YouTube(data.get('url'), on_progress_callback=self.progress_check) except: print('internet??') return 'Server Connection failed! \nCheck Internet and URL' resolution = data.get('qual') format = data.get('format') path = data.get('loc') Progressive_or_not = data.get('ext') if Progressive_or_not: if resolution == 'any' and format == 'mp4': self.selected_stream = yt.streams.filter( progressive=Progressive_or_not, file_extension=format).order_by('resolution').last() elif format == 'any' and resolution == 'any': self.selected_stream = yt.streams.filter( progressive=Progressive_or_not).order_by( 'resolution').last() else: self.selected_stream = yt.streams.filter( progressive=Progressive_or_not, file_extension=format).get_by_resolution(resolution) if not Progressive_or_not: if resolution == 'any' and format == 'mp4': self.selected_stream = yt.streams.filter( type='video', file_extension=format).order_by('resolution').last() elif format == 'any' and resolution == 'any': self.selected_stream = yt.streams.filter( type='video').order_by('resolution').last() else: self.selected_stream = yt.streams.filter( file_extension=format).get_by_resolution(resolution) if self.selected_stream is None: print('SGS_ERROR-404_NO_STREAM') return 'Selected Stream not available\nPing Streams' + 'from other menu or retry a different stream' data.add('size', self.selected_stream.filesize) self.selected_stream.download(path) print('SGS_CODE_SUCCESS') return 'Download Successful !!' def get_VideoSpecs(self): """Gets Video specifications and location and adjusts UI accordingly""" if self.mp4_radioButton.isChecked(): print('Mp4 is selected -- proceed 147') data.add('format', 'mp4') elif self.webm_radioButton.isChecked(): print('WEBM is selected -- proceed 149') data.add('format', 'webm') else: data.add('format', 'any') QUALITY = str(self.resolution_comboBox.currentText()) data.add('qual', QUALITY) if self.progressive_checkbox.isChecked(): data.add('ext', False) print('Progressive - False') else: data.add('ext', True) print('Progressive - True') print(data.get('format'), data.get('qual'), data.get('ext'), "End of info collection") self.groupBox_for_videoFormats.setVisible(False) self.pushButton.setVisible(False) self.progressive_checkbox.setVisible(False) self.resolution_comboBox.setVisible(False) self.Title_label.setText('PLEASE WAIT...\nStarting Download...') self.Title_label.setVisible(True) try: yt = YouTube(data.get('url')) except: QMessageBox.question( self, 'ELITE', 'Server Connection Failed!!\nCheck url or Internet', QMessageBox.Ok) print('internet??') exit(0) resolution = data.get('qual') format = data.get('format') Progressive_or_not = data.get('ext') if Progressive_or_not: if resolution == 'any' and format == 'mp4': selected_stream = yt.streams.filter( progressive=Progressive_or_not, file_extension=format).order_by('resolution').last() elif format == 'any' and resolution == 'any': selected_stream = yt.streams.filter( progressive=Progressive_or_not).order_by( 'resolution').last() else: selected_stream = yt.streams.filter( progressive=Progressive_or_not, file_extension=format).get_by_resolution(resolution) if not Progressive_or_not: if resolution == 'any' and format == 'mp4': selected_stream = yt.streams.filter( type='video', file_extension=format).order_by('resolution').last() elif format == 'any' and resolution == 'any': selected_stream = yt.streams.filter( type='video').order_by('resolution').last() else: selected_stream = yt.streams.filter( file_extension=format).get_by_resolution(resolution) if selected_stream is None: QMessageBox.question( self, 'ELITE', 'Selected Stream not available\nPing Streams' ' from other menu or retry a different stream', QMessageBox.Ok) print('SGS_ERROR-404_NO_STREAM @ 484') exit(0) filesize = (selected_stream.filesize) * (10**-6) filename = selected_stream.default_filename self.label_for_SizeDisplay.setText("FILE SIZE: " + str(round(filesize, 2)) + ' MB') self.label_for_SizeDisplay.setVisible(True) self.label_for_FilenameDisplay.setText('VIDEO NAME: ' + str(filename)) self.label_for_FilenameDisplay.setVisible(True) self.progressBar.setVisible(True) self.pushButton_.setVisible(False) path_to_save = QFileDialog.getExistingDirectory(self) print(path_to_save) data.add('loc', path_to_save) print(data) message_from_func = self.download_manager_vid() QMessageBox.question(self, 'ELITE', message_from_func, QMessageBox.Ok) exit(0) def setupUi(self, youtube_setup): """Sets up the page UI""" youtube_setup.setObjectName("youtube_setup") self.centralwidget = QWidget(youtube_setup) self.centralwidget.setObjectName("centralwidget") self.resolution_comboBox = QComboBox(self.centralwidget) self.resolution_comboBox.setGeometry(QRect(410, 110, 100, 33)) self.resolution_comboBox.setObjectName("resolution_comboBox") list_quality = ['any', '240p', '360p', '720p', '1080p'] self.resolution_comboBox.addItems(list_quality) self.resolution_comboBox.setVisible(False) self.progressive_checkbox = QCheckBox(self.centralwidget) self.progressive_checkbox.setGeometry(QRect(20, 230, 350, 50)) self.progressive_checkbox.setObjectName("check_box") self.progressive_checkbox.setVisible(False) self.Title_label = QLabel(self.centralwidget) self.Title_label.setGeometry(QRect(170, 10, 261, 51)) self.label_for_SizeDisplay = QLabel(self.centralwidget) self.label_for_SizeDisplay.setGeometry(QRect(160, 160, 180, 41)) self.label_for_SizeDisplay.setObjectName("label_for_SizeDisplay") self.label_for_SizeDisplay.setVisible(False) self.label_info = QLabel(self.centralwidget) self.label_info.setGeometry(QRect(20, 310, 260, 20)) self.label_info.setObjectName("label_info") font = QFont() font.setPointSize(14) font.setBold(True) font.setItalic(True) font.setWeight(75) self.Title_label.setFont(font) self.Title_label.setObjectName("Title_label") self.groupBox_for_typeSelection = QGroupBox(self.centralwidget) self.groupBox_for_typeSelection.setGeometry(QRect(200, 90, 191, 121)) self.groupBox_for_typeSelection.setObjectName( "groupBox_for_typeSelection") self.type_audio_radioButton = QRadioButton( self.groupBox_for_typeSelection) self.type_audio_radioButton.setGeometry(QRect(40, 40, 104, 23)) self.type_audio_radioButton.setObjectName("type_audio_radioButton") self.type_audio_radioButton.clicked.connect(lambda: self.type_aud()) self.type_video_radioButton = QRadioButton( self.groupBox_for_typeSelection) self.type_video_radioButton.setGeometry(QRect(40, 70, 104, 23)) self.type_video_radioButton.setObjectName("type_video_radioButton") self.type_video_radioButton.clicked.connect(lambda: self.type_vid()) self.pushButton = QPushButton(self.centralwidget) self.pushButton.setGeometry(QRect(460, 290, 88, 33)) self.pushButton.setObjectName("pushButton") self.pushButton.setVisible(False) self.pushButton.clicked.connect(lambda: self.get_VideoSpecs()) self.pushButton_ = QPushButton(self.centralwidget) self.pushButton_.setGeometry(QRect(460, 290, 88, 33)) self.pushButton_.setObjectName("pushButton") self.pushButton_.setVisible(False) self.pushButton_.clicked.connect( lambda: self.YoutubeManager.download_manager_vid(self)) self.groupBox_for_videoFormats = QGroupBox(self.centralwidget) self.groupBox_for_videoFormats.setGeometry(QRect(200, 90, 141, 111)) self.groupBox_for_videoFormats.setObjectName( "groupBox_for_videoFormats") self.groupBox_for_videoFormats.setVisible(False) self.mp4_radioButton = QRadioButton(self.groupBox_for_videoFormats) self.mp4_radioButton.setGeometry(QRect(20, 30, 104, 23)) self.mp4_radioButton.setObjectName("mp4_radioButton") self.webm_radioButton = QRadioButton(self.groupBox_for_videoFormats) self.webm_radioButton.setGeometry(QRect(20, 60, 104, 23)) self.webm_radioButton.setObjectName("webm_radioButton") self.progressBar = QProgressBar(self.centralwidget) self.progressBar.setGeometry(QRect(90, 230, 391, 23)) self.progressBar.setProperty("value", 24) self.progressBar.setObjectName("progressBar") self.progressBar.setVisible(False) self.label_for_FilenameDisplay = QLabel(self.centralwidget) self.label_for_FilenameDisplay.setGeometry(QRect(75, 110, 500, 50)) self.label_for_FilenameDisplay.setObjectName( "label_for_FilenameDisplay") self.label_for_FilenameDisplay.setVisible(False) youtube_setup.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(youtube_setup) self.menubar.setGeometry(QRect(0, 0, 586, 25)) self.menubar.setObjectName("menubar") youtube_setup.setMenuBar(self.menubar) self.progressBar.setValue(0) self.statusbar = QStatusBar(youtube_setup) self.statusbar.setObjectName("statusbar") youtube_setup.setStatusBar(self.statusbar) self.retranslateUi(youtube_setup) QMetaObject.connectSlotsByName(youtube_setup) def retranslateUi(self, youtube_setup): _translate = QCoreApplication.translate youtube_setup.setWindowTitle( _translate("youtube_setup", "Youtube Video Download-ELITELOADER")) self.Title_label.setText( _translate("youtube_setup", "Select Format and Quality")) self.label_for_SizeDisplay.setText(_translate("ELITE", "SIZE:")) self.label_for_FilenameDisplay.setText(_translate( "ELITE", "FILENAME:")) self.groupBox_for_typeSelection.setTitle( _translate("youtube_setup", "Type")) self.progressive_checkbox.setText( _translate('youtube_setup', "High Resolution/Non-Progressive")) self.type_audio_radioButton.setText( _translate("youtube_setup", "Audio")) self.label_info.setText( _translate("StartPage_Url", "*This checking process may take longer")) self.type_video_radioButton.setText( _translate("youtube_setup", "Video")) self.pushButton.setText(_translate("youtube_setup", "Proceed")) self.pushButton_.setText(_translate("youtube_setup", "Download")) self.groupBox_for_videoFormats.setTitle( _translate("youtube_setup", "Format")) self.mp4_radioButton.setText(_translate("youtube_setup", "MP4")) self.webm_radioButton.setText(_translate("youtube_setup", "WEBM")) class YoutubeManager: # Manage Youtube Downloads def __init__(self): pass def ping( self): # Check Available Streams and returns a list of streams try: yt = YouTube(data.get('url')) pingster = yt.streams.all() return pingster except: print('Error in connection') return 'Error in connection\nCheck URL and Internet'
class Ui_MainWindow(object): def setupUi(self, MainWindow): self.conn = pymysql.connect(host='localhost', port=3306, user='******', password='', db='') self.cur = self.conn.cursor() self.sqlString = "select * from student where " MainWindow.setObjectName('MainWindow') MainWindow.resize(760, 440) MainWindow.setFixedSize(MainWindow.width(), MainWindow.height()) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName('centralwidget') self.frame = QFrame(self.centralwidget) self.frame.setGeometry(QtCore.QRect(10, 10, 491, 121)) self.frame.setFrameShape(QFrame.StyledPanel) self.frame.setFrameShadow(QFrame.Raised) self.frame.setObjectName('frame') self.check_sid = QCheckBox(self.frame) self.check_sid.setGeometry(QtCore.QRect(20, 10, 71, 16)) self.check_sid.setObjectName('check_sid') # self.check_sage = QCheckBox(self.frame) # self.check_sage.setGeometry(QtCore.QRect(20, 70, 71, 16)) # self.check_sage.setObjectName("check_Sage") self.check_sname = QCheckBox(self.frame) self.check_sname.setGeometry(QtCore.QRect(20, 40, 71, 16)) self.check_sname.setObjectName('check_sname') self.check_sgender = QCheckBox(self.frame) self.check_sgender.setGeometry(QtCore.QRect(20, 100, 71, 16)) self.check_sgender.setObjectName('check_sgender') self.sid = QLineEdit(self.frame) self.sid.setGeometry(QtCore.QRect(90, 10, 113, 16)) self.sid.setObjectName('sid') self.sname = QLineEdit(self.frame) self.sname.setGeometry(QtCore.QRect(90, 40, 113, 16)) self.sname.setObjectName("sname") # self.first_sage = QLineEdit(self.frame) # self.first_sage.setGeometry(QtCore.QRect(90, 70, 41, 16)) # self.first_sage.setObjectName("first_sage") self.sgender = QLineEdit(self.frame) self.sgender.setGeometry(QtCore.QRect(90, 100, 113, 16)) self.sgender.setObjectName("sgender") self.label = QLabel(self.frame) self.label.setGeometry(QtCore.QRect(140, 70, 16, 16)) self.label.setObjectName('label') self.check_sdept = QCheckBox(self.frame) self.check_sdept.setGeometry(QtCore.QRect(270, 40, 71, 16)) self.check_sdept.setObjectName("check_sdept") self.sdept = QLineEdit(self.frame) self.sdept.setGeometry(QtCore.QRect(340, 40, 113, 16)) self.sdept.setObjectName("sdept") self.sclass = QLineEdit(self.frame) self.sclass.setGeometry(QtCore.QRect(340, 10, 113, 16)) self.sclass.setObjectName("sclass") self.check_sclass = QCheckBox(self.frame) self.check_sclass.setGeometry(QtCore.QRect(270, 10, 71, 16)) self.check_sclass.setObjectName("check_sclass") self.find = QPushButton(self.frame) self.find.setGeometry(QtCore.QRect(380, 100, 75, 21)) self.find.setObjectName('find') self.find.clicked.connect(self.find_btn) self.sql_out = QTextBrowser(self.centralwidget) self.sql_out.setGeometry(QtCore.QRect(10, 140, 740, 61)) self.sql_out.setObjectName('sql_out') self.result_out = QTableWidget(self.centralwidget) self.result_out.setEditTriggers(QAbstractItemView.NoEditTriggers) self.result_out.setGeometry(QtCore.QRect(10, 210, 740, 171)) self.result_out.setObjectName('result_out') self.result_out.setColumnCount(5) self.result_out.setRowCount(5) self.result_out.resizeColumnsToContents() self.result_out.resizeRowsToContents() item = QTableWidgetItem() self.result_out.setHorizontalHeaderItem(0, item) item = QTableWidgetItem() self.result_out.setHorizontalHeaderItem(1, item) item = QTableWidgetItem() self.result_out.setHorizontalHeaderItem(2, item) item = QTableWidgetItem() self.result_out.setHorizontalHeaderItem(3, item) item = QTableWidgetItem() self.result_out.setHorizontalHeaderItem(4, item) self.result_out.horizontalHeader().setDefaultSectionSize(100) self.result_out.horizontalHeader().setMinimumSectionSize(25) self.result_out.verticalHeader().setDefaultSectionSize(30) self.pushButton_2 = QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(675, 390, 75, 21)) self.pushButton_2.setObjectName("pushButton_2") self.pushButton_2.clicked.connect(self.p2_clicked) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 509, 23)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def p2_clicked(self): self.pyqt_clicked1.emit() def find_btn(self): self.pyqt_clicked2.emit() def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) self.check_sid.setText(_translate("MainWindow", "学号", None)) # self.check_Sage.setText(_translate("MainWindow", "年龄自", None)) self.check_sname.setText(_translate("MainWindow", "姓名", None)) self.check_sgender.setText(_translate("MainWindow", "性别", None)) # self.label.setText(_translate("MainWindow", "到", None)) self.check_sdept.setText(_translate("MainWindow", "方向", None)) self.check_sclass.setText(_translate("MainWindow", "班级", None)) self.find.setText(_translate("MainWindow", "查询", None)) self.sql_out.setText(self.sqlString) item = self.result_out.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "学号", None)) item = self.result_out.horizontalHeaderItem(1) item.setText(_translate("MainWindow", "姓名", None)) item = self.result_out.horizontalHeaderItem(2) item.setText(_translate("MainWindow", "性别", None)) item = self.result_out.horizontalHeaderItem(3) item.setText(_translate("MainWindow", "班级", None)) item = self.result_out.horizontalHeaderItem(4) item.setText(_translate("MainWindow", "专业方向", None)) self.pushButton_2.setText(_translate("MainWindow", "退出", None)) def mousePressEvent(self, event): print(">_<") def buttonTest(self): temp_sqlstring = self.sqlString is_first = True if self.check_sid.isChecked(): mystr = self.sid.text() if is_first: is_first = False if mystr.find("%") == -1: temp_sqlstring += "sid='" + self.sid.text() + "'" else: temp_sqlstring += "sid like'" + self.sid.text() + "'" else: if mystr.find("%") == -1: temp_sqlstring += " and sid = '" + self.sid.text() + "'" else: temp_sqlstring += " and sid like '" + self.sid.text() + "'" if self.check_sname.isChecked(): if is_first: mystr = self.sname.text() is_first = False if mystr.find("%") == -1: temp_sqlstring += "sname = '" + self.sname.text() + "'" else: temp_sqlstring += "sname like '" + self.sname.text() + "'" else: if mystr.find("%") == -1: temp_sqlstring += " and sname = '" + self.sname.text( ) + "'" else: temp_sqlstring += " and sname like '" + self.sname.text( ) + "'" if self.check_sgender.isChecked(): if is_first: is_first = False temp_sqlstring += "sgender = '" + self.sgender.text() + "'" else: temp_sqlstring += " and sgender = '" + self.sgender.text( ) + "'" if self.check_sclass.isChecked(): if is_first: mystr = self.sclass.text() is_first = False if mystr.find("%") == -1: temp_sqlstring += "sclass = '" + self.sclass.text() + "'" else: temp_sqlstring += "sclass like '" + self.sclass.text( ) + "'" else: if mystr.find("%") == -1: temp_sqlstring += " and sclass = '" + self.sclass.text( ) + "'" else: temp_sqlstring += " and sclass like '" + self.sclass.text( ) + "'" if self.check_sdept.isChecked(): if is_first: mystr = self.sdept.text() is_first = False if mystr.find("%") == -1: temp_sqlstring += "sdept = '" + self.sdept.text() + "'" else: temp_sqlstring += "sdept like '" + self.sdept.text() + "'" else: if mystr.find("%") == -1: temp_sqlstring += " and sdept = '" + self.sdept.text( ) + "'" else: temp_sqlstring += " and sdept like '" + self.sdept.text( ) + "'" self.result_out.clearContents() if not (is_first): print(temp_sqlstring) self.cur.execute(temp_sqlstring) k = 0 for i in self.cur: print("------------", i) w = 0 for j in i: if type(j) == int: newItem = QTableWidgetItem(str(j)) else: newItem = QTableWidgetItem(j) self.result_out.setItem(k, w, newItem) w += 1 k += 1 self.sql_out.setText("") self.sql_out.append(temp_sqlstring) print("find button pressed") def buttonExit(self): self.conn.commit() self.cur.close() self.conn.close() self.close() def keyPressEvent(self, e): if e.key() == QtCore.Qt.key_Escape: self.buttonExit()
class GeneralManager(PageWindow): # Download Normal Video def __init__(self): super().__init__() self.initUI() self.BLOCK_SIZE: int = 1024 self.setWindowTitle("ELITELOADER") def initUI(self): self.setupUi(self) def download(self): """ Downloads file and writes with Progressbar""" url = data.get('url') self.progressBar.setVisible(True) self.pushButton.setVisible(False) self.label_forSize.setVisible(True) self.label_info.setVisible(False) self.Title_label.setText("Starting Download..\nPlease wait...") try: response = requests.get(url, stream=True) total = response.headers.get('content-length') print('Total_size = ', total) with open(data.get('loc'), 'wb') as f: self.label_forSize.setText( "FILE SIZE: " + str(round(float(total) * (0.000001), 3)) + ' MB') if total is None: f.write(response.content) else: downloaded = 0 total = int(total) for datas in response.iter_content( chunk_size=max(int(total / 1000), 1024 * 1024)): downloaded += len(datas) f.write(datas) pct = downloaded / total * 100 if downloaded <= total: self.progressBar.setValue(int(pct)) print('Download Successful !!!') except: QMessageBox.question(self, "Error", "Download Failed!!", QMessageBox.Ok) exit(0) def setupUi(self, general_vidloader): """ Sets up UI""" general_vidloader.setObjectName("general_vidloader") self.centralwidget = QWidget(general_vidloader) self.centralwidget.setObjectName("centralwidget") self.progressBar = QProgressBar(self.centralwidget) self.progressBar.setGeometry(QRect(110, 150, 381, 25)) self.progressBar.setProperty("value", 24) self.progressBar.setObjectName("progressBar") self.progressBar.setVisible(False) self.progressBar.setValue(0) self.Title_label = QLabel(self.centralwidget) self.Title_label.setGeometry(QRect(170, 10, 261, 51)) self.label_forSize = QLabel(self.centralwidget) self.label_forSize.setGeometry(QRect(220, 200, 180, 41)) self.label_forSize.setObjectName("label_for_SizeDisplay") self.label_forSize.setVisible(False) self.Title_label = QLabel(self.centralwidget) self.Title_label.setGeometry(QRect(230, 20, 230, 41)) font = QFont() font.setPointSize(14) font.setBold(True) font.setItalic(True) font.setWeight(75) self.Title_label.setFont(font) self.Title_label.setObjectName("Title_label") self.label_info = QLabel(self.centralwidget) self.label_info.setGeometry(QRect(30, 300, 271, 17)) self.label_info.setObjectName("label_info") self.pushButton = QPushButton(self.centralwidget) self.pushButton.setGeometry(QRect(430, 220, 88, 33)) self.pushButton.setObjectName("pushButton") self.pushButton.clicked.connect(lambda: self.download()) general_vidloader.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(general_vidloader) self.menubar.setGeometry(QRect(0, 0, 586, 25)) self.menubar.setObjectName("menubar") general_vidloader.setMenuBar(self.menubar) self.statusbar = QStatusBar(general_vidloader) self.statusbar.setObjectName("statusbar") general_vidloader.setStatusBar(self.statusbar) self.retranslateUi(general_vidloader) QMetaObject.connectSlotsByName(general_vidloader) def retranslateUi(self, general_vidloader): _translate = QCoreApplication.translate general_vidloader.setWindowTitle( _translate("general_vidloader", "Video downloader - ELITELOADER")) self.Title_label.setText( _translate("general_vidloader", "Continue.. ?")) self.label_info.setText( _translate("general_vidloader", "*save file with reqd. name and extension")) self.pushButton.setText(_translate("general_vidloader", "Download")) self.label_forSize.setText(_translate("ELITE", "SIZE:"))
class Ui_MainWindows(object): def setupUi(self, MainWindows): MainWindows.setObjectName("MainWindows") MainWindows.resize(800, 506) self.centralwidget = QWidget(MainWindows) self.centralwidget.setObjectName("centralwidget") self.plot = QGraphicsView(self.centralwidget) self.plot.setGeometry(QRect(135, 0, 671, 461)) self.plot.setObjectName("plot") self.open = QPushButton(self.centralwidget) self.open.setGeometry(QRect(30, 210, 75, 23)) self.open.setObjectName("open") self.closebtn = QPushButton(self.centralwidget) self.closebtn.setGeometry(QRect(30, 260, 75, 23)) self.closebtn.setObjectName("close") self.COM = QComboBox(self.centralwidget) self.COM.setGeometry(QRect(10, 50, 111, 22)) self.COM.setObjectName("COM") self.COM.addItem("") self.COM.addItem("") self.COM.addItem("") self.COM.addItem("") self.COM.addItem("") self.COM.addItem("") self.COM.addItem("") self.COM.addItem("") self.COMlable = QLabel(self.centralwidget) self.COMlable.setGeometry(QRect(10, 30, 54, 12)) self.COMlable.setObjectName("COMlable") self.baud = QLineEdit(self.centralwidget) self.baud.setGeometry(QRect(10, 140, 113, 20)) self.baud.setObjectName("baud") self.baudlable = QLabel(self.centralwidget) self.baudlable.setGeometry(QRect(10, 120, 54, 12)) self.baudlable.setObjectName("baudlable") self.output = QTextBrowser(self.centralwidget) self.output.setGeometry(QRect(10, 380, 111, 81)) self.output.setObjectName("output") self.outputlabel = QLabel(self.centralwidget) self.outputlabel.setGeometry(QRect(10, 350, 54, 12)) self.outputlabel.setObjectName("outputlabel") MainWindows.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindows) self.menubar.setGeometry(QRect(0, 0, 800, 23)) self.menubar.setObjectName("menubar") MainWindows.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindows) self.statusbar.setObjectName("statusbar") MainWindows.setStatusBar(self.statusbar) self.retranslateUi(MainWindows) QMetaObject.connectSlotsByName(MainWindows) def retranslateUi(self, MainWindows): _translate = QCoreApplication.translate MainWindows.setWindowTitle(_translate("MainWindows", "Serial Helper")) self.open.setText(_translate("MainWindows", "打开串口")) self.closebtn.setText(_translate("MainWindows", "关闭串口")) self.COM.setItemText(0, _translate("MainWindows", "COM1")) self.COM.setItemText(1, _translate("MainWindows", "COM2")) self.COM.setItemText(2, _translate("MainWindows", "COM3")) self.COM.setItemText(3, _translate("MainWindows", "COM4")) self.COM.setItemText(4, _translate("MainWindows", "COM5")) self.COM.setItemText(5, _translate("MainWindows", "COM6")) self.COM.setItemText(6, _translate("MainWindows", "COM7")) self.COM.setItemText(7, _translate("MainWindows", "COM8")) self.COMlable.setText(_translate("MainWindows", "COM口")) self.baudlable.setText(_translate("MainWindows", "波特率")) self.outputlabel.setText(_translate("MainWindows", "串口输出"))
class UiFacebook(PageWindow): # Facebook UI def __init__(self): super().__init__() self.initUI() self.setWindowTitle("FaceBook - ELITELOADER") def initUI(self): self.setupUi(self) def Progressbar_Manager(self, current, total, width): pct = (current / total) * 100 self.progressBar.setValue(int(pct)) def Download_H(self): # For High Quality ERASE_LINE = '\x1b[2K' Location = os_path.join(data.get('loc')) try: html = requests.get(data.get('url')) hdvideo_url = search('hd_src:"(.+?)"', html.text)[1] except requests.ConnectionError as e: print("OOPS!! Connection Error.") return 'Connection Error\n' + 'Check your Internet' except requests.Timeout as e: print("OOPS!! Timeout Error") return 'Network Timeout' except requests.RequestException as e: print("OOPS!! General Error or Invalid URL") return 'General Error or Invalid URL' except (KeyboardInterrupt, SystemExit): print("Ok ok, quitting") exit(1) except TypeError: print("Video May be Private or Hd version not available") return 'Video May Private or Hd version not available' else: hd_url = hdvideo_url.replace('hd_src:"', '') print("\n") print("High Quality: " + hd_url) print("[+] Video Started Downloading") wget.download(hd_url, Location, bar=self.Progressbar_Manager) stdout.write(ERASE_LINE) print("\n") print("Video downloaded") return 'Video Downloaded Successfully !!' def Download_L(self): # For Low Quality ERASE_LINE = '\x1b[2K' Location = os_path.join(data.get('loc')) try: html = requests.get(data.get('url')) sdvideo_url = search('sd_src:"(.+?)"', html.text)[1] except requests.ConnectionError as e: print("OOPS!! Connection Error.") return 'Connection Error\n' + 'Check your Internet' except requests.Timeout as e: print("OOPS!! Timeout Error") return 'Network Timeout' except requests.RequestException as e: print("OOPS!! General Error or Invalid URL") return 'General Error or Invalid URL' except (KeyboardInterrupt, SystemExit): print("Ok ok, quitting") exit(1) except TypeError: print("Video May Private or Invalid URL") return 'Video May be Private or Invalid URL' else: sd_url = sdvideo_url.replace('sd_src:"', '') print("\n") print("Normal Quality: " + sd_url) print("[+] Video Started Downloading") wget.download(sd_url, Location, bar=self.Progressbar_Manager) stdout.write(ERASE_LINE) print("\n") print("Video downloaded") return 'Video Downloaded Successfully !!' def Selector(self): """ Identifies which Quality is reqd.""" if self.HighQual_radioButton.isChecked(): print('HQ selected--fwding to manager') self.groupBox_forQuality.setVisible(False) self.pushButton.setVisible(False) self.label.setText('PLEASE WAIT..\nSTARTING DOWNLOAD...') sgs = QFileDialog.getExistingDirectory() print(sgs) data.add('loc', sgs) self.progressBar.setVisible(True) print(data) msg = self.Download_H() QMessageBox.question(self, 'ELITE', msg, QMessageBox.Ok) exit(0) if self.LowQual_radioButton.isChecked(): print('LQ selected--fwding to manager') self.groupBox_forQuality.setVisible(False) self.pushButton.setVisible(False) self.label.setText('PLEASE WAIT..\nSTARTING DOWNLOAD...') sgs = QFileDialog.getExistingDirectory() print(sgs) data.add('loc', sgs) self.progressBar.setVisible(True) print(data) msg = self.Download_L() QMessageBox.question(self, 'ELITE', msg, QMessageBox.Ok) exit(0) def setupUi(self, facebook_dwn): facebook_dwn.setObjectName("facebook_dwn") facebook_dwn.resize(586, 379) self.centralwidget = QWidget(facebook_dwn) self.centralwidget.setObjectName("centralwidget") self.label = QLabel(self.centralwidget) self.label.setGeometry(QRect(220, 10, 250, 61)) font = QFont() font.setPointSize(14) font.setBold(True) font.setItalic(True) font.setWeight(75) self.label.setFont(font) self.label.setObjectName("Title_label") self.pushButton = QPushButton(self.centralwidget) self.pushButton.setGeometry(QRect(460, 290, 88, 33)) self.pushButton.setObjectName("pushButton") self.pushButton.clicked.connect(lambda: self.Selector()) self.groupBox_forQuality = QGroupBox(self.centralwidget) self.groupBox_forQuality.setGeometry(QRect(200, 90, 141, 111)) self.groupBox_forQuality.setObjectName("groupBox_for_videoFormats") self.HighQual_radioButton = QRadioButton(self.groupBox_forQuality) self.HighQual_radioButton.setGeometry(QRect(20, 30, 104, 23)) self.HighQual_radioButton.setObjectName("mp4_radioButton") self.LowQual_radioButton = QRadioButton(self.groupBox_forQuality) self.LowQual_radioButton.setGeometry(QRect(20, 60, 104, 23)) self.LowQual_radioButton.setObjectName("webm_radioButton") self.progressBar = QProgressBar(self.centralwidget) self.progressBar.setGeometry(QRect(110, 180, 391, 23)) self.progressBar.setProperty("value", 0) self.progressBar.setObjectName("progressBar") self.progressBar.setVisible(False) facebook_dwn.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(facebook_dwn) self.menubar.setGeometry(QRect(0, 0, 586, 25)) self.menubar.setObjectName("menubar") facebook_dwn.setMenuBar(self.menubar) self.statusbar = QStatusBar(facebook_dwn) self.statusbar.setObjectName("statusbar") facebook_dwn.setStatusBar(self.statusbar) self.retranslateUi(facebook_dwn) QMetaObject.connectSlotsByName(facebook_dwn) def retranslateUi(self, facebook_dwn): _translate = QCoreApplication.translate facebook_dwn.setWindowTitle( _translate("facebook_dwn", "Facebook Video Download-ELITELOADER")) self.label.setText(_translate("facebook_dwn", "Select Quality")) self.pushButton.setText(_translate("facebook_dwn", "Proceed")) self.groupBox_forQuality.setTitle(_translate("facebook_dwn", "Quality")) self.HighQual_radioButton.setText( _translate("facebook_dwn", "High Quality")) self.LowQual_radioButton.setText( _translate("facebook_dwn", "Low Quality"))
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(460, 606) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.timer = QLabel(self.centralwidget) self.timer.setGeometry(QRect(170, 420, 104, 32)) font = QFont() font.setFamily(".PingFang SC0") font.setPointSize(14) self.timer.setFont(font) self.timer.setObjectName("timer") self.layoutWidget = QWidget(self.centralwidget) self.layoutWidget.setGeometry(QRect(10, 10, 424, 397)) self.layoutWidget.setObjectName("layoutWidget") self.gridLayout = QGridLayout(self.layoutWidget) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setObjectName("gridLayout") self.label_0 = QLabel(self.layoutWidget) self.label_0.setText("") self.label_0.setPixmap(QPixmap("../ui/bob_0.png")) self.label_0.setObjectName("label_0") self.gridLayout.addWidget(self.label_0, 0, 0, 1, 1) self.label_1 = QLabel(self.layoutWidget) self.label_1.setText("") self.label_1.setPixmap(QPixmap("../ui/bob_1.png")) self.label_1.setObjectName("label_1") self.gridLayout.addWidget(self.label_1, 0, 1, 1, 1) self.label_2 = QLabel(self.layoutWidget) self.label_2.setText("") self.label_2.setPixmap(QPixmap("../ui/bob_2.png")) self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_2, 0, 2, 1, 1) self.label_3 = QLabel(self.layoutWidget) self.label_3.setText("") self.label_3.setPixmap(QPixmap("../ui/bob_3.png")) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.label_4 = QLabel(self.layoutWidget) self.label_4.setText("") self.label_4.setPixmap(QPixmap("../ui/bob_4.png")) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 1, 1, 1, 1) self.label_5 = QLabel(self.layoutWidget) self.label_5.setText("") self.label_5.setPixmap(QPixmap("../ui/bob_5.png")) self.label_5.setObjectName("label_5") self.gridLayout.addWidget(self.label_5, 1, 2, 1, 1) self.label_6 = QLabel(self.layoutWidget) self.label_6.setText("") self.label_6.setPixmap(QPixmap("../ui/bob_6.png")) self.label_6.setObjectName("label_6") self.gridLayout.addWidget(self.label_6, 2, 0, 1, 1) self.label_7 = QLabel(self.layoutWidget) self.label_7.setText("") self.label_7.setPixmap(QPixmap("../ui/bob_7.png")) self.label_7.setObjectName("label_7") self.gridLayout.addWidget(self.label_7, 2, 1, 1, 1) self.label_8 = QLabel(self.layoutWidget) self.label_8.setText("") self.label_8.setPixmap(QPixmap("../ui/bob_8.png")) self.label_8.setObjectName("label_8") self.gridLayout.addWidget(self.label_8, 2, 2, 1, 1) self.layoutWidget1 = QWidget(self.centralwidget) self.layoutWidget1.setGeometry(QRect(10, 420, 195, 34)) self.layoutWidget1.setObjectName("layoutWidget1") self.horizontalLayout = QHBoxLayout(self.layoutWidget1) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setObjectName("horizontalLayout") self.counter = QLabel(self.layoutWidget1) font = QFont() font.setFamily(".PingFang SC0") font.setPointSize(14) self.counter.setFont(font) self.counter.setObjectName("counter") self.horizontalLayout.addWidget(self.counter) self.level = QLabel(self.centralwidget) self.level.setGeometry(QRect(310, 420, 151, 31)) font = QFont() font.setFamily(".PingFang SC0") font.setPointSize(14) self.level.setFont(font) self.level.setObjectName("level") self.layoutWidget2 = QWidget(self.centralwidget) self.layoutWidget2.setGeometry(QRect(260, 470, 171, 101)) self.layoutWidget2.setObjectName("layoutWidget2") self.gridLayout_2 = QGridLayout(self.layoutWidget2) self.gridLayout_2.setContentsMargins(0, 0, 0, 0) self.gridLayout_2.setObjectName("gridLayout_2") self.U = QPushButton(self.layoutWidget2) font = QFont() font.setFamily(".PingFang SC0") font.setPointSize(22) self.U.setFont(font) self.U.setObjectName("U") self.gridLayout_2.addWidget(self.U, 0, 1, 1, 1) self.L = QPushButton(self.layoutWidget2) font = QFont() font.setFamily(".PingFang SC0") font.setPointSize(22) self.L.setFont(font) self.L.setObjectName("L") self.gridLayout_2.addWidget(self.L, 1, 0, 1, 1) self.D = QPushButton(self.layoutWidget2) font = QFont() font.setFamily(".PingFang SC0") font.setPointSize(22) self.D.setFont(font) self.D.setObjectName("D") self.gridLayout_2.addWidget(self.D, 1, 1, 1, 1) self.R = QPushButton(self.layoutWidget2) font = QFont() font.setFamily(".PingFang SC0") font.setPointSize(22) self.R.setFont(font) self.R.setObjectName("R") self.gridLayout_2.addWidget(self.R, 1, 2, 1, 1) self.layoutWidget3 = QWidget(self.centralwidget) self.layoutWidget3.setGeometry(QRect(10, 460, 241, 121)) self.layoutWidget3.setObjectName("layoutWidget3") self.gridLayout_3 = QGridLayout(self.layoutWidget3) self.gridLayout_3.setContentsMargins(0, 0, 0, 0) self.gridLayout_3.setObjectName("gridLayout_3") self.start = QPushButton(self.layoutWidget3) font = QFont() font.setFamily(".PingFang SC0") font.setPointSize(14) self.start.setFont(font) self.start.setObjectName("start") self.gridLayout_3.addWidget(self.start, 0, 0, 1, 1) self.reset = QPushButton(self.layoutWidget3) font = QFont() font.setFamily(".PingFang SC0") font.setPointSize(14) self.reset.setFont(font) self.reset.setObjectName("reset") self.gridLayout_3.addWidget(self.reset, 0, 1, 1, 1) self.setting = QPushButton(self.layoutWidget3) font = QFont() font.setFamily(".PingFang SC0") font.setPointSize(14) self.setting.setFont(font) self.setting.setObjectName("setting") self.gridLayout_3.addWidget(self.setting, 1, 0, 1, 1) self.file = QPushButton(self.layoutWidget3) font = QFont() font.setFamily(".PingFang SC0") font.setPointSize(14) self.file.setFont(font) self.file.setObjectName("file") self.gridLayout_3.addWidget(self.file, 1, 1, 1, 1) self.start.raise_() self.reset.raise_() self.file.raise_() self.setting.raise_() MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "拼图小游戏")) self.timer.setText(_translate("MainWindow", "用时 0")) self.counter.setText(_translate("MainWindow", "步数 0")) self.level.setText(_translate("MainWindow", "关数")) self.U.setText(_translate("MainWindow", "U")) self.L.setText(_translate("MainWindow", "L")) self.D.setText(_translate("MainWindow", "D")) self.R.setText(_translate("MainWindow", "R")) self.start.setText(_translate("MainWindow", "开始")) self.reset.setText(_translate("MainWindow", "重置")) self.setting.setText(_translate("MainWindow", "设置")) self.file.setText(_translate("MainWindow", "文件"))
class UiStartPage(PageWindow): # Starting Page UI def __init__(self): super().__init__() self.initUI() self.setWindowTitle("ELITELOADER") def initUI(self): self.setupUi(self) def ping(self): """ Pings youtube Streams""" data.add('url', self.url_txtbox.text()) obj = UiYoutube.YoutubeManager() print('Please Wait..') QMessageBox.question(self, 'ELITE', 'It takes a while, please wait..', QMessageBox.Ok) streams = UiYoutube.YoutubeManager.ping(obj) if isinstance(streams, list): Mstream = "" for i in streams: Mstream += str(i) + '\n' QMessageBox.question(self, 'Streams', Mstream, QMessageBox.Ok) print(streams) if isinstance(streams, str): QMessageBox.question(self, 'ELITE', streams, QMessageBox.Ok) def TypeFinder(self): """ Identfies URL and calls resective pages""" print(self.url_txtbox.text(), 'All clear @ main page after getting link') data.add('url', self.url_txtbox.text()) URl = self.url_txtbox.text() if URl != '': try: partition = URl.split('/') type = partition[2] except: QMessageBox.question(self, "ELITE_ERROR", 'Invalid URL !!!') exit(0) if type == 'www.youtube.com': print("Youtube link is found -> fwding to youtube page ") self.goto("Youtube") elif type == 'youtu.be': print("Youtube link is found -> fwding to youtube page ") self.goto("Youtube") elif type == 'www.facebook.com': print("facebook link is found -> forwarding to fb page ") self.goto("fb_setup") elif type == 'www.instagram.com': sg = QFileDialog.getSaveFileName(self) data.add('loc', sg[0]) print("instagram link is found -> forwarding to insta page ") self.goto("insta") else: sg = QFileDialog.getSaveFileName(self) data.add('loc', sg[0]) print(data, 'Before General manage call') self.goto("general") def setupUi(self, StartPage_Url): StartPage_Url.setObjectName("StartPage_Url") self.centralwidget = QWidget(StartPage_Url) self.centralwidget.setObjectName("centralwidget") self.btn_go = QPushButton(self.centralwidget) self.btn_go.setGeometry(QRect(250, 150, 88, 33)) self.btn_go.setObjectName("btn_go") self.btn_go.clicked.connect(lambda: self.TypeFinder()) self.L_Heading = QLabel(self.centralwidget) self.L_Heading.setGeometry(QRect(120, 20, 331, 20)) font = QFont() font.setPointSize(14) font.setBold(True) font.setItalic(True) font.setWeight(75) self.L_Heading.setFont(font) self.L_Heading.setLayoutDirection(Qt.LeftToRight) self.L_Heading.setAutoFillBackground(True) self.L_Heading.setObjectName("L_Heading") self.groupBox = QGroupBox(self.centralwidget) self.groupBox.setGeometry(QRect(20, 200, 231, 111)) self.groupBox.setObjectName("groupBox_for_typeSelection") self.label = QLabel(self.groupBox) self.label.setGeometry(QRect(40, 20, 111, 17)) self.label.setObjectName("Title_label") self.label_2 = QLabel(self.groupBox) self.label_2.setGeometry(QRect(40, 40, 121, 17)) self.label_2.setObjectName("label_info") self.label_5 = QLabel(self.groupBox) self.label_5.setGeometry(QRect(40, 60, 141, 20)) self.label_5.setObjectName("label_5") self.label_3 = QLabel(self.groupBox) self.label_3.setGeometry(QRect(40, 80, 141, 20)) self.label_3.setObjectName("label_3") self.label_4 = QLabel(self.centralwidget) self.label_4.setGeometry(QRect(200, 310, 451, 20)) self.label_4.setObjectName("label_info") self.url_txtbox = QLineEdit(self.centralwidget) self.url_txtbox.setGeometry(QRect(72, 70, 431, 33)) self.url_txtbox.setObjectName("url_txtbox") self.url_txtbox.returnPressed.connect(self.TypeFinder) StartPage_Url.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(StartPage_Url) self.menubar.setGeometry(QRect(0, 0, 586, 25)) self.menubar.setObjectName("menubar") self.menuAbout = QMenu(self.menubar) self.menuAbout.setObjectName("menuAbout") self.about_opt = QMenu(self.menubar) self.about_opt.setObjectName("about_opt") StartPage_Url.setMenuBar(self.menubar) self.statusbar = QStatusBar(StartPage_Url) self.statusbar.setObjectName("statusbar") StartPage_Url.setStatusBar(self.statusbar) self.pings = QAction(StartPage_Url) self.pings.setObjectName("pings") self.menuAbout.addAction(self.pings) self.pings.triggered.connect(lambda: self.ping()) self.menubar.addAction(self.menuAbout.menuAction()) self.retranslateUi(StartPage_Url) QMetaObject.connectSlotsByName(StartPage_Url) def retranslateUi(self, StartPage_Url): _translate = QCoreApplication.translate StartPage_Url.setWindowTitle(_translate("StartPage_Url", "ELITELOADER")) self.btn_go.setText(_translate("StartPage_Url", "Go")) self.L_Heading.setText( _translate("StartPage_Url", "General purpose video downloader")) self.groupBox.setTitle( _translate("StartPage_Url", "Downloadable Items")) self.label.setText(_translate("StartPage_Url", "# Youtube videos")) self.label_2.setText(_translate("StartPage_Url", "# Facebook videos")) self.label_5.setText(_translate("StartPage_Url", "# Instagram videos")) self.label_3.setText( _translate("StartPage_Url", "# Mp4 with source url")) self.label_4.setText( _translate( "StartPage_Url", "*This app auto detects the url type and proceeds accordingly") ) self.menuAbout.setTitle( _translate("StartPage_Url", "Available streams")) self.about_opt.setTitle(_translate("StartPage_Url", "About")) self.pings.setText(_translate("StartPage_Url", "Ping Youtube Streams"))
class listAdminUI(QMainWindow): def __init__(self, parent=None): super(listAdminUI, self).__init__(parent) self.resize(900, 700) self.setupUi() def setupUi(self): self.setObjectName("MainWindow") self.centralwidget = QWidget(self) self.centralwidget.setObjectName("centralwidget") self.tableWidget = QTableWidget(self.centralwidget) self.tableWidget.setGeometry(QtCore.QRect(30, 50, 810, 520)) self.tableWidget.setRowCount(50) self.tableWidget.setColumnCount(7) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setHorizontalHeaderLabels(["Id Admin", "Id Role", "Nama Pengguna", "Kata Sandi", "Nama Lengkap", "Dibuat Oleh", "Dibuat Tanggal"]) self.tableWidget.setEditTriggers(QTreeView.NoEditTriggers) self.tableWidget.setStyleSheet("background-color:#ECEBE4") data_df = self.load_data() for data in data_df: self.tableWidget.setItem(data[0],data[1], data[2]) #self.tableWidget.setEditTriggers(QAbstractItemView.CurrentChanged) self.btnHapus = QPushButton(self.centralwidget) self.btnHapus.setGeometry(QtCore.QRect(28, 600, 90, 30)) self.btnHapus.setObjectName("btnHapus") self.setCentralWidget(self.centralwidget) self.btnHapus.clicked.connect(self.hapus) self.btnEdit = QPushButton(self.centralwidget) self.btnEdit.setGeometry(QtCore.QRect(650, 600, 90, 30)) self.btnEdit.setStyleSheet("background-color:#4DAE4E") self.btnEdit.setObjectName("btnEdit") self.setCentralWidget(self.centralwidget) self.btnEdit.clicked.connect(self.editData) self.btnKembali = QPushButton(self.centralwidget) self.btnKembali.setGeometry(QtCore.QRect(750, 600, 90, 30)) self.btnKembali.setStyleSheet("background-color:#3498DB") self.btnKembali.setObjectName("btnKembali") self.setCentralWidget(self.centralwidget) self.btnKembali.clicked.connect(self.kembali) self.statusbar = QStatusBar(self) self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) self.retranslateUi() QMetaObject.connectSlotsByName(self) def retranslateUi(self): _translate = QCoreApplication.translate self.setWindowTitle(_translate("MainWindow", "list Admin")) self.btnKembali.setText(_translate("MainWindow", "Kembali")) self.btnHapus.setText(_translate("MainWindow", "Hapus")) self.btnEdit.setText(_translate("MainWindow", "Ubah")) """ def _removerow(self): row = self.tableWidget.currentRow() '''query = "DELETE FROM WHERE = ?" cur.execute(query, (item,customerId,date,qty)) con.commit() ''' self.tableWidget.removeRow(row) print("Berhasil Hapus!") """ def load_data(self): model= mUser() data = model.getData("setup_admin", "ORDER BY id_admin") key_data = list(data.keys()) len_data = len(data[key_data[0]]) data_return = [] for row in range(len_data): for col in range(len(key_data)): value = QTableWidgetItem(str(data[key_data[col]][row])) data_return.append((row, col, value)) return data_return def editData(self,obj): if self.tableWidget.currentIndex().row() > -1: index=(self.tableWidget.selectionModel().currentIndex()) #print(index) self.value=index.sibling(index.row(),0).data() if(self.value == None): QMessageBox.question(self,'Message', "Pilih baris yang akan dihapus!", QMessageBox.Ok) else: dash = cListAdmin.cListAdmin() dash.editData(self) #print(value) else: QMessageBox.question(self,'Message', "Pilih baris yang akan dihapus!", QMessageBox.Ok) self.show() def hapus(self): if self.tableWidget.currentIndex().row() > -1: index=(self.tableWidget.selectionModel().currentIndex()) self.value=index.sibling(index.row(),0).data() if(self.value == None): QMessageBox.question(self,'Message', "Pilih baris yang akan dihapus!", QMessageBox.Ok) else: hps = QMessageBox.question(self,'Message', "Hapus Data?", QMessageBox.Yes | QMessageBox.No,QMessageBox.No) if(hps == QMessageBox.Yes): dash = cListAdmin.cListAdmin() dash.hapusData(self) #print(value) else: QMessageBox.question(self,'Message', "Pilih baris yang akan dihapus!", QMessageBox.Ok) self.show() def kembali(self): dash = cListAdmin.cListAdmin() dash.gotodash(self)
class Ui_MainWindow(object): def setupUi(self, MainWindow, url): MainWindow.setObjectName("MainWindow") MainWindow.resize(576, 117) MainWindow.setWindowFlags(MainWindow.windowFlags() | Qt.WindowStaysOnTopHint) MainWindow.setWindowIcon(QIcon(Icons["Download"])) self.MainWindow = MainWindow self.url = url self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.progressBar = QProgressBar(self.centralwidget, minimumWidth=400) self.progressBar.setGeometry(QRect(30, 50, 531, 31)) self.progressBar.setMinimumSize(QSize(531, 31)) self.progressBar.setMaximumSize(QSize(531, 31)) self.progressBar.setValue(0) self.progressBar.setObjectName("progressBar") self.label = QLabel(self.centralwidget) self.label.setGeometry(QRect(10, 20, 250, 16)) self.label.setObjectName("label") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setGeometry(QRect(0, 0, 576, 26)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) self.on_pushButton_clicked() # Download button event def on_pushButton_clicked(self): the_url = self.url the_filesize = requests.get(the_url, stream=True).headers['Content-Length'] self.the_filepath = os.getcwd() + "\\" + self.url.split(chr(47))[-1] the_fileobj = open(self.the_filepath, 'wb') #### Create a download thread self.downloadThread = downloadThread(the_url, the_filesize, the_fileobj, buffer=10240) self.downloadThread.download_proess_signal.connect( self.set_progressbar_value) self.downloadThread.start() def set_progressbar_value(self, value): self.progressBar.setValue(value) if value == 100: try: os.remove("\\".join(self.the_filepath.split("\\")[:-1]) + "\\chromedriver.exe") except FileNotFoundError: pass with zipfile.ZipFile(self.the_filepath, 'r') as zip_ref: zip_ref.extractall(os.getcwd() + "\\") self.MainWindow.close() os.remove(self.the_filepath) warnMessage( "Bilgi", QMessageBox.Information, "Gerekli dosyalar yüklendi, programı kullanabilirsiniz.") def retranslateUi(self, MainWindow): _translate = QCoreApplication.translate MainWindow.setWindowTitle( _translate("MainWindow", "Wp Auto Message Sender - Sürücü")) self.label.setText( _translate("MainWindow", "Gerekli sürücüler indiriliyor..."))
class AppWindow(QMainWindow): onRestart = pyqtSignal(name='onRestart') onSystemUIElementCreated = pyqtSignal(str, QWidget, name='onSystemUIElementCreated') onSystemUIElementRemoved = pyqtSignal(str, name='onSystemUIElementRemoved') switchTabRequest = pyqtSignal(str) def __init__(self, dwarf_args, flags=None): super(AppWindow, self).__init__(flags) self.dwarf_args = dwarf_args self.session_manager = SessionManager(self) self.session_manager.sessionCreated.connect(self.session_created) self.session_manager.sessionStopped.connect(self.session_stopped) self.session_manager.sessionClosed.connect(self.session_closed) self._tab_order = [ 'debug', 'modules', 'ranges', 'jvm-inspector', 'jvm-debugger' ] self._is_newer_dwarf = False self.q_settings = QSettings(utils.home_path() + "dwarf_window_pos.ini", QSettings.IniFormat) self.menu = self.menuBar() self.view_menu = None # dockwidgets self.watchpoints_dwidget = None self.breakpoint_dwiget = None self.bookmarks_dwiget = None self.registers_dock = None self.console_dock = None self.backtrace_dock = None self.threads_dock = None # panels self.asm_panel = None self.backtrace_panel = None self.bookmarks_panel = None self.console_panel = None self.context_panel = None self.debug_panel = None self.contexts_list_panel = None self.data_panel = None self.ftrace_panel = None self.breakpoints_panel = None self.objc_inspector_panel = None self.java_inspector_panel = None self.java_explorer_panel = None self.java_trace_panel = None self.modules_panel = None self.ranges_panel = None self.search_panel = None self.smali_panel = None self.watchpoints_panel = None self._ui_elems = [] self.setWindowTitle( 'Dwarf - A debugger for reverse engineers, crackers and security analyst' ) # load external assets _app = QApplication.instance() # themes self.prefs = Prefs() utils.set_theme(self.prefs.get('dwarf_ui_theme', 'dark'), self.prefs) # load font if os.path.exists(utils.resource_path('assets/Anton.ttf')): QFontDatabase.addApplicationFont( utils.resource_path('assets/Anton.ttf')) else: QFontDatabase.addApplicationFont(':/assets/Anton.ttf') if os.path.exists(utils.resource_path('assets/OpenSans-Regular.ttf')): QFontDatabase.addApplicationFont( utils.resource_path('assets/OpenSans-Regular.ttf')) else: QFontDatabase.addApplicationFont(':/assets/OpenSans-Regular.ttf') if os.path.exists(utils.resource_path('assets/OpenSans-Bold.ttf')): QFontDatabase.addApplicationFont( utils.resource_path('assets/OpenSans-Bold.ttf')) else: QFontDatabase.addApplicationFont(':/assets/OpenSans-Bold.ttf') font = QFont("OpenSans", 9, QFont.Normal) # TODO: add settingsdlg font_size = self.prefs.get('dwarf_ui_font_size', 12) font.setPixelSize(font_size) _app.setFont(font) # mainwindow statusbar self.progressbar = QProgressBar() self.progressbar.setRange(0, 0) self.progressbar.setVisible(False) self.progressbar.setFixedHeight(15) self.progressbar.setFixedWidth(100) self.progressbar.setTextVisible(False) self.progressbar.setValue(30) self.statusbar = QStatusBar(self) self.statusbar.setAutoFillBackground(False) self.statusbar.addPermanentWidget(self.progressbar) self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) self.main_tabs = QTabWidget(self) self.main_tabs.setMovable(False) self.main_tabs.setTabsClosable(True) self.main_tabs.setAutoFillBackground(True) self.main_tabs.tabCloseRequested.connect(self._on_close_tab) self.setCentralWidget(self.main_tabs) # pluginmanager self.plugin_manager = PluginManager(self) self.plugin_manager.reload_plugins() self.welcome_window = None if dwarf_args.any == '': self.welcome_window = WelcomeDialog(self) self.welcome_window.setModal(True) self.welcome_window.onIsNewerVersion.connect( self._enable_update_menu) self.welcome_window.onUpdateComplete.connect( self._on_dwarf_updated) self.welcome_window.setWindowTitle( 'Welcome to Dwarf - A debugger for reverse engineers, crackers and security analyst' ) self.welcome_window.onSessionSelected.connect(self._start_session) # wait for welcome screen self.hide() self.welcome_window.show() else: print('* Starting new Session') self._start_session(dwarf_args.target) def _initialize_ui_elements(self): # dockwidgets self.watchpoints_dwidget = None self.breakpoint_dwiget = None self.bookmarks_dwiget = None self.registers_dock = None self.console_dock = None self.backtrace_dock = None self.threads_dock = None # panels self.asm_panel = None self.backtrace_panel = None self.bookmarks_panel = None self.console_panel = None self.context_panel = None self.debug_panel = None self.contexts_list_panel = None self.data_panel = None self.ftrace_panel = None self.breakpoints_panel = None self.objc_inspector_panel = None self.java_inspector_panel = None self.java_explorer_panel = None self.java_trace_panel = None self.modules_panel = None self.ranges_panel = None self.search_panel = None self.smali_panel = None self.watchpoints_panel = None self._ui_elems = [] def _setup_main_menu(self): self.menu = self.menuBar() dwarf_menu = QMenu('Dwarf', self) theme = QMenu('Theme', dwarf_menu) theme.addAction('Black') theme.addAction('Dark') theme.addAction('Light') theme.triggered.connect(self._set_theme) dwarf_menu.addMenu(theme) dwarf_menu.addSeparator() if self._is_newer_dwarf: dwarf_menu.addAction('Update', self._update_dwarf) dwarf_menu.addAction('Close', self.close) self.menu.addMenu(dwarf_menu) session = self.session_manager.session if session is not None: session_menu = session.main_menu if isinstance(session_menu, list): for menu in session_menu: self.menu.addMenu(menu) else: self.menu.addMenu(session_menu) # plugins if self.plugin_manager.plugins: self.plugin_menu = QMenu('Plugins', self) for plugin in self.plugin_manager.plugins: plugin_instance = self.plugin_manager.plugins[plugin] plugin_sub_menu = self.plugin_menu.addMenu( plugin_instance.name) try: actions = plugin_instance.__get_top_menu_actions__() for action in actions: plugin_sub_menu.addAction(action) except: pass if not plugin_sub_menu.isEmpty(): plugin_sub_menu.addSeparator() about = plugin_sub_menu.addAction('About') about.triggered.connect( lambda x, item=plugin: self._show_plugin_about(item)) if not self.plugin_menu.isEmpty(): self.menu.addMenu(self.plugin_menu) self.view_menu = QMenu('View', self) self.panels_menu = QMenu('Panels', self.view_menu) self.panels_menu.addAction('Search', lambda: self.show_main_tab('search'), shortcut=QKeySequence(Qt.CTRL + Qt.Key_F3)) self.panels_menu.addAction('Modules', lambda: self.show_main_tab('modules')) self.panels_menu.addAction('Ranges', lambda: self.show_main_tab('ranges')) self.view_menu.addMenu(self.panels_menu) self.debug_view_menu = self.view_menu.addMenu('Debug') self.view_menu.addSeparator() self.view_menu.addAction('Hide all', self._hide_all_widgets, shortcut=QKeySequence(Qt.CTRL + Qt.Key_F1)) self.view_menu.addAction('Show all', self._show_all_widgets, shortcut=QKeySequence(Qt.CTRL + Qt.Key_F2)) self.view_menu.addSeparator() self.menu.addMenu(self.view_menu) if self.dwarf_args.debug_script: debug_menu = QMenu('Debug', self) debug_menu.addAction('Reload core', self._menu_reload_core) debug_menu.addAction('Debug dwarf js core', self._menu_debug_dwarf_js) self.menu.addMenu(debug_menu) # tools _tools = self.prefs.get('tools') if _tools: tools_menu = QMenu('Tools', self) for _tool in _tools: if _tool and _tool['name']: if _tool['name'] == 'sep': tools_menu.addSeparator() continue _cmd = _tool['cmd'] tools_menu.addAction(_tool['name']) if not tools_menu.isEmpty(): tools_menu.triggered.connect(self._execute_tool) self.menu.addMenu(tools_menu) about_menu = QMenu('About', self) about_menu.addAction('Dwarf on GitHub', self._menu_github) about_menu.addAction('Documention', self._menu_documentation) about_menu.addAction('Api', self._menu_api) about_menu.addAction('Slack', self._menu_slack) about_menu.addSeparator() about_menu.addAction('Info', self._show_about_dlg) self.menu.addMenu(about_menu) def _show_plugin_about(self, plugin): plugin = self.plugin_manager.plugins[plugin] if plugin: info = plugin.__get_plugin_info__() version = utils.safe_read_map(info, 'version', '') description = utils.safe_read_map(info, 'description', '') author = utils.safe_read_map(info, 'author', '') homepage = utils.safe_read_map(info, 'homepage', '') license_ = utils.safe_read_map(info, 'license', '') utils.show_message_box( 'Name: {0}\nVersion: {1}\nDescription: {2}\nAuthor: {3}\nHomepage: {4}\nLicense: {5}' .format(plugin.name, version, description, author, homepage, license_)) def _enable_update_menu(self): self._is_newer_dwarf = True def _update_dwarf(self): if self.welcome_window: self.welcome_window._update_dwarf() def _on_close_tab(self, index): tab_text = self.main_tabs.tabText(index) if tab_text: tab_text = tab_text.lower().replace(' ', '-') try: self._ui_elems.remove(tab_text) except ValueError: # recheck ValueError: list.remove(x): x not in list pass self.main_tabs.removeTab(index) self.onSystemUIElementRemoved.emit(tab_text) def _on_dwarf_updated(self): self.onRestart.emit() def _execute_tool(self, qaction): if qaction: _tools = self.prefs.get('tools') if _tools: for _tool in _tools: if _tool and _tool['name'] and _tool['name'] != 'sep': if qaction.text() == _tool['name']: try: import subprocess subprocess.Popen(_tool['cmd'], creationflags=subprocess. CREATE_NEW_CONSOLE) except: pass break def _set_theme(self, qaction): if qaction: utils.set_theme(qaction.text(), self.prefs) def _hide_all_widgets(self): self.watchpoints_dwidget.hide() self.breakpoint_dwiget.hide() self.bookmarks_dwiget.hide() self.registers_dock.hide() self.console_dock.hide() self.backtrace_dock.hide() self.threads_dock.hide() def _show_all_widgets(self): self.watchpoints_dwidget.show() self.breakpoint_dwiget.show() self.bookmarks_dwiget.show() self.registers_dock.show() self.console_dock.show() self.backtrace_dock.show() self.threads_dock.show() def _menu_reload_core(self): self.dwarf.script.exports.reload() def _menu_debug_dwarf_js(self): you_know_what_to_do = json.loads( self.dwarf.script.exports.debugdwarfjs()) return you_know_what_to_do def show_main_tab(self, name): name = name.lower() # elem doesnt exists? create it if name not in self._ui_elems: self._create_ui_elem(name) index = 0 name = name.join(name.split()).lower() if name == 'ranges': index = self.main_tabs.indexOf(self.ranges_panel) elif name == 'search': index = self.main_tabs.indexOf(self.search_panel) elif name == 'modules': index = self.main_tabs.indexOf(self.modules_panel) elif name == 'data': index = self.main_tabs.indexOf(self.data_panel) elif name == 'jvm-tracer': index = self.main_tabs.indexOf(self.java_trace_panel) elif name == 'jvm-inspector': index = self.main_tabs.indexOf(self.java_inspector_panel) elif name == 'jvm-debugger': index = self.main_tabs.indexOf(self.java_explorer_panel) elif name == 'objc-inspector': index = self.main_tabs.indexOf(self.objc_inspector_panel) elif name == 'smali': index = self.main_tabs.indexOf(self.smali_panel) self.main_tabs.setCurrentIndex(index) def jump_to_address(self, ptr, view=0, show_panel=True): if show_panel: self.show_main_tab('debug') self.debug_panel.jump_to_address(ptr, view=view) @pyqtSlot(name='mainMenuGitHub') def _menu_github(self): QDesktopServices.openUrl(QUrl('https://github.com/iGio90/Dwarf')) @pyqtSlot(name='mainMenuApi') def _menu_api(self): QDesktopServices.openUrl(QUrl('https://igio90.github.io/Dwarf/')) @pyqtSlot(name='mainMenuDocumentation') def _menu_documentation(self): QDesktopServices.openUrl(QUrl('http://www.giovanni-rocca.com/dwarf/')) @pyqtSlot(name='mainMenuSlack') def _menu_slack(self): QDesktopServices.openUrl( QUrl('https://join.slack.com/t/resecret/shared_invite' '/enQtMzc1NTg4MzE3NjA1LTlkNzYxNTIwYTc2ZTYyOWY1MT' 'Q1NzBiN2ZhYjQwYmY0ZmRhODQ0NDE3NmRmZjFiMmE1MDYwN' 'WJlNDVjZDcwNGE')) def _show_about_dlg(self): about_dlg = AboutDialog(self) about_dlg.show() def _create_ui_elem(self, elem): elem = elem.lower() if not isinstance(elem, str): return if elem not in self._ui_elems: self._ui_elems.append(elem) elem_wiget = None if elem == 'watchpoints': from dwarf_debugger.ui.session_widgets.watchpoints import WatchpointsWidget self.watchpoints_dwidget = QDockWidget('Watchpoints', self) self.watchpoints_panel = WatchpointsWidget(self) # dont respond to dblclick mem cant be shown # self.watchpoints_panel.onItemDoubleClicked.connect( # self._on_watchpoint_clicked) self.watchpoints_panel.onItemRemoved.connect( self._on_watchpoint_removeditem) self.watchpoints_panel.onItemAdded.connect( self._on_watchpoint_added) self.watchpoints_dwidget.setWidget(self.watchpoints_panel) self.watchpoints_dwidget.setObjectName('WatchpointsWidget') self.addDockWidget(Qt.LeftDockWidgetArea, self.watchpoints_dwidget) self.view_menu.addAction( self.watchpoints_dwidget.toggleViewAction()) elem_wiget = self.watchpoints_panel elif elem == 'breakpoints': from dwarf_debugger.ui.session_widgets.breakpoints import BreakpointsWidget self.breakpoint_dwiget = QDockWidget('breakpoint', self) self.breakpoints_panel = BreakpointsWidget(self) self.breakpoints_panel.onBreakpointRemoved.connect( self._on_breakpoint_removed) self.breakpoint_dwiget.setWidget(self.breakpoints_panel) self.breakpoint_dwiget.setObjectName('breakpointWidget') self.addDockWidget(Qt.LeftDockWidgetArea, self.breakpoint_dwiget) self.view_menu.addAction(self.breakpoint_dwiget.toggleViewAction()) elem_wiget = self.breakpoints_panel elif elem == 'bookmarks': from dwarf_debugger.ui.session_widgets.bookmarks import BookmarksWidget self.bookmarks_dwiget = QDockWidget('Boomarks', self) self.bookmarks_panel = BookmarksWidget(self) self.bookmarks_dwiget.setWidget(self.bookmarks_panel) self.bookmarks_dwiget.setObjectName('BookmarksWidget') self.addDockWidget(Qt.LeftDockWidgetArea, self.bookmarks_dwiget) self.view_menu.addAction(self.bookmarks_dwiget.toggleViewAction()) elem_wiget = self.bookmarks_panel elif elem == 'registers': from dwarf_debugger.ui.session_widgets.context import ContextWidget self.registers_dock = QDockWidget('Context', self) self.context_panel = ContextWidget(self) self.registers_dock.setWidget(self.context_panel) self.registers_dock.setObjectName('ContextWidget') self.addDockWidget(Qt.RightDockWidgetArea, self.registers_dock) self.view_menu.addAction(self.registers_dock.toggleViewAction()) elem_wiget = self.context_panel elif elem == 'debug': from dwarf_debugger.ui.panels.panel_debug import QDebugPanel self.debug_panel = QDebugPanel(self) self.main_tabs.addTab(self.debug_panel, 'Debug') elem_wiget = self.debug_panel elif elem == 'jvm-debugger': from dwarf_debugger.ui.panels.panel_java_explorer import JavaExplorerPanel self.java_explorer_panel = JavaExplorerPanel(self) self.main_tabs.addTab(self.java_explorer_panel, 'JVM debugger') self.main_tabs.tabBar().moveTab( self.main_tabs.indexOf(self.java_explorer_panel), 1) elem_wiget = self.java_explorer_panel elif elem == 'jvm-inspector': from dwarf_debugger.ui.panels.panel_java_inspector import JavaInspector self.java_inspector_panel = JavaInspector(self) self.main_tabs.addTab(self.java_inspector_panel, 'JVM inspector') elem_wiget = self.java_inspector_panel elif elem == 'objc-inspector': from dwarf_debugger.ui.panels.panel_objc_inspector import ObjCInspector self.objc_inspector_panel = ObjCInspector(self) self.main_tabs.addTab(self.objc_inspector_panel, 'ObjC inspector') elem_wiget = self.objc_inspector_panel elif elem == 'console': from dwarf_debugger.ui.session_widgets.console import ConsoleWidget self.console_dock = QDockWidget('Console', self) self.console_panel = ConsoleWidget(self) if self.dwarf_args.script and len( self.dwarf_args.script) > 0 and os.path.exists( self.dwarf_args.script): with open(self.dwarf_args.script, 'r') as f: self.console_panel.get_js_console( ).script_file = self.dwarf_args.script self.console_panel.get_js_console( ).function_content = f.read() self.dwarf.onLogToConsole.connect(self._log_js_output) self.dwarf.onLogEvent.connect(self._log_event) self.console_dock.setWidget(self.console_panel) self.console_dock.setObjectName('ConsoleWidget') self.addDockWidget(Qt.BottomDockWidgetArea, self.console_dock) self.view_menu.addAction(self.console_dock.toggleViewAction()) elem_wiget = self.console_panel elif elem == 'backtrace': from dwarf_debugger.ui.session_widgets.backtrace import BacktraceWidget self.backtrace_dock = QDockWidget('Backtrace', self) self.backtrace_panel = BacktraceWidget(self) self.backtrace_dock.setWidget(self.backtrace_panel) self.backtrace_dock.setObjectName('BacktraceWidget') self.backtrace_panel.onShowMemoryRequest.connect( self._on_showmemory_request) self.addDockWidget(Qt.RightDockWidgetArea, self.backtrace_dock) self.view_menu.addAction(self.backtrace_dock.toggleViewAction()) elem_wiget = self.backtrace_panel elif elem == 'threads': from dwarf_debugger.ui.session_widgets.threads import ThreadsWidget self.threads_dock = QDockWidget('Threads', self) self.contexts_list_panel = ThreadsWidget(self) self.dwarf.onThreadResumed.connect( self.contexts_list_panel.resume_tid) self.contexts_list_panel.onItemDoubleClicked.connect( self._manually_apply_context) self.threads_dock.setWidget(self.contexts_list_panel) self.threads_dock.setObjectName('ThreadPanel') self.addDockWidget(Qt.RightDockWidgetArea, self.threads_dock) self.view_menu.addAction(self.threads_dock.toggleViewAction()) elem_wiget = self.contexts_list_panel elif elem == 'modules': from dwarf_debugger.ui.panels.panel_modules import ModulesPanel self.modules_panel = ModulesPanel(self) self.modules_panel.onModuleSelected.connect( self._on_module_dblclicked) self.modules_panel.onModuleFuncSelected.connect( self._on_modulefunc_dblclicked) self.modules_panel.onAddBreakpoint.connect( self._on_addmodule_breakpoint) self.modules_panel.onDumpBinary.connect(self._on_dump_module) self.main_tabs.addTab(self.modules_panel, 'Modules') elem_wiget = self.modules_panel elif elem == 'ranges': from dwarf_debugger.ui.panels.panel_ranges import RangesPanel self.ranges_panel = RangesPanel(self) self.ranges_panel.onItemDoubleClicked.connect( self._range_dblclicked) self.ranges_panel.onDumpBinary.connect(self._on_dump_module) # connect to watchpointpanel func self.ranges_panel.onAddWatchpoint.connect( self.watchpoints_panel.do_addwatchpoint_dlg) self.main_tabs.addTab(self.ranges_panel, 'Ranges') elem_wiget = self.ranges_panel elif elem == 'search': from dwarf_debugger.ui.panels.panel_search import SearchPanel self.search_panel = SearchPanel(self) self.main_tabs.addTab(self.search_panel, 'Search') elem_wiget = self.search_panel elif elem == 'data': from dwarf_debugger.ui.panels.panel_data import DataPanel self.data_panel = DataPanel(self) self.main_tabs.addTab(self.data_panel, 'Data') elem_wiget = self.data_panel elif elem == 'jvm-tracer': from dwarf_debugger.ui.panels.panel_java_trace import JavaTracePanel self.java_trace_panel = JavaTracePanel(self) self.main_tabs.addTab(self.java_trace_panel, 'JVM tracer') elem_wiget = self.java_trace_panel elif elem == 'smali': from dwarf_debugger.ui.panels.panel_smali import SmaliPanel self.smali_panel = SmaliPanel() self.main_tabs.addTab(self.smali_panel, 'Smali') elem_wiget = self.smali_panel else: print('no handler for elem: ' + elem) if elem_wiget is not None: self.onSystemUIElementCreated.emit(elem, elem_wiget) # TODO: remove add @2x for item in self.findChildren(QDockWidget): if item: if 'darwin' in sys.platform: item.setStyleSheet( 'QDockWidget::title { padding-left:-30px; }') def set_status_text(self, txt): self.statusbar.showMessage(txt) # ************************************************************************ # **************************** Properties ******************************** # ************************************************************************ @property def disassembly(self): return self.asm_panel @property def backtrace(self): return self.backtrace_panel @property def console(self): return self.console_panel @property def context(self): return self.context_panel @property def threads(self): return self.contexts_list_panel @property def ftrace(self): return self.ftrace_panel @property def breakpoint(self): return self.breakpoints_panel @property def java_inspector(self): return self.java_inspector_panel @property def objc_inspector(self): return self.objc_inspector_panel @property def java_explorer(self): return self.java_explorer_panel @property def modules(self): return self.modules_panel @property def ranges(self): return self.ranges_panel @property def watchpoints(self): return self.watchpoints_panel @property def dwarf(self): if self.session_manager.session is not None: return self.session_manager.session.dwarf else: return None @property def ui_elements(self): return self._ui_elems # ************************************************************************ # **************************** Handlers ********************************** # ************************************************************************ # session handlers def _start_session(self, session_type, session_data=None): if self.welcome_window is not None: self.welcome_window.close() try: self.session_manager.create_session(session_type, session_data=session_data) except Exception as e: if self.welcome_window: utils.show_message_box(str(e)) def _restore_session(self, session_data): if 'session' in session_data: session_type = session_data['session'] self.dwarf_args.any = session_data['package'] self._start_session(session_type, session_data=session_data) def session_created(self): # session init done create ui for it session = self.session_manager.session self._setup_main_menu() for ui_elem in session.session_ui_sections: ui_elem = ui_elem.join(ui_elem.split()).lower() self._create_ui_elem(ui_elem) self.dwarf.onProcessAttached.connect(self._on_attached) self.dwarf.onProcessDetached.connect(self._on_detached) self.dwarf.onScriptLoaded.connect(self._on_script_loaded) self.dwarf.onSetRanges.connect(self._on_setranges) self.dwarf.onSetModules.connect(self._on_setmodules) self.dwarf.onAddNativeBreakpoint.connect(self._on_add_breakpoint) self.dwarf.onApplyContext.connect(self._apply_context) self.dwarf.onThreadResumed.connect(self.on_tid_resumed) self.dwarf.onHitModuleInitializationBreakpoint.connect( self._on_hit_module_initialization_breakpoint) self.dwarf.onSetData.connect(self._on_set_data) self.session_manager.start_session(self.dwarf_args) ui_state = self.q_settings.value('dwarf_ui_state') if ui_state: self.restoreGeometry(ui_state) window_state = self.q_settings.value('dwarf_ui_window', self.saveState()) if window_state: self.restoreState(window_state) self.showMaximized() def session_stopped(self): self.menu.clear() self.main_tabs.clear() # actually we need to kill this. needs a refactor if self.java_trace_panel is not None: self.java_trace_panel = None for elem in self._ui_elems: if elem == 'watchpoints': self.watchpoints_panel.clear_list() self.watchpoints_panel.close() self.watchpoints_panel = None self.removeDockWidget(self.watchpoints_dwidget) self.watchpoints_dwidget = None elif elem == 'breakpoints': self.breakpoints_panel.close() self.breakpoints_panel = None self.removeDockWidget(self.breakpoint_dwiget) self.breakpoint_dwiget = None elif elem == 'registers': self.context_panel.close() self.context_panel = None self.removeDockWidget(self.registers_dock) self.registers_dock = None elif elem == 'debug': self.debug_panel.close() self.debug_panel = None self.main_tabs.removeTab(0) # self.main_tabs elif elem == 'jvm-debugger': self.java_explorer_panel.close() self.java_explorer_panel = None self.removeDockWidget(self.watchpoints_dwidget) elif elem == 'console': self.console_panel.close() self.console_panel = None self.removeDockWidget(self.console_dock) self.console_dock = None elif elem == 'backtrace': self.backtrace_panel.close() self.backtrace_panel = None self.removeDockWidget(self.backtrace_dock) elif elem == 'threads': self.contexts_list_panel.close() self.contexts_list_panel = None self.removeDockWidget(self.threads_dock) self.threads_dock = None elif elem == 'bookmarks': self.bookmarks_panel.close() self.bookmarks_panel = None self.removeDockWidget(self.bookmarks_dwiget) self.bookmarks_dwiget = None self._initialize_ui_elements() def session_closed(self): self._initialize_ui_elements() self.hide() if self.welcome_window: self.welcome_window.exec() else: if self.dwarf_args.any != '': self.close() # ui handler def closeEvent(self, event): """ Window closed save stuff or whatever at exit detaches dwarf """ if self.session_manager.session: self.session_manager.session.stop() # save windowstuff self.q_settings.setValue('dwarf_ui_state', self.saveGeometry()) self.q_settings.setValue('dwarf_ui_window', self.saveState()) if self.dwarf: try: self.dwarf.detach() except: pass super().closeEvent(event) def _on_watchpoint_clicked(self, ptr): """ Address in Watchpoint/Breakpointpanel was clicked show Memory """ if '.' in ptr: # java_breakpoint file_path = ptr.replace('.', os.path.sep) else: self.jump_to_address(ptr) def _on_watchpoint_added(self, ptr): """ Watchpoint Entry was added """ try: # set highlight self.debug_panel.memory_panel.add_highlight( HighLight('watchpoint', ptr, self.dwarf.pointer_size)) except HighlightExistsError: pass def _on_watchpoint_removeditem(self, ptr): """ Watchpoint Entry was removed remove highlight too """ self.debug_panel.memory_panel.remove_highlight(ptr) def _on_module_dblclicked(self, data): """ Module in ModulePanel was doubleclicked """ addr, size = data addr = utils.parse_ptr(addr) self.jump_to_address(addr) def _on_modulefunc_dblclicked(self, ptr): """ Function in ModulePanel was doubleclicked """ ptr = utils.parse_ptr(ptr) self.jump_to_address(ptr) def _on_dump_module(self, data): """ DumpBinary MenuItem in ModulePanel was selected """ ptr, size = data ptr = utils.parse_ptr(ptr) size = int(size, 10) self.dwarf.dump_memory(ptr=ptr, length=size) def _range_dblclicked(self, ptr): """ Range in RangesPanel was doubleclicked """ ptr = utils.parse_ptr(ptr) self.jump_to_address(ptr) # dwarf handlers def _log_js_output(self, output): if self.console_panel is not None: time_prefix = True if len(output.split('\n')) > 1 or len(output.split('<br />')) > 1: time_prefix = False self.console_panel.get_js_console().log(output, time_prefix=time_prefix) def _log_event(self, output): if self.console_panel is not None: self.console_panel.get_events_console().log(output) def _on_setranges(self, ranges): """ Dwarf wants to set Ranges only breakpointed up to switch tab or create ui its connected in panel after creation """ if self.ranges_panel is None: self.show_main_tab('ranges') # forward only now to panel it connects after creation self.ranges_panel.set_ranges(ranges) else: self.show_main_tab('ranges') def _on_setmodules(self, modules): """ Dwarf wants to set Modules only breakpointed up to switch tab or create ui its connected in panel after creation """ if self.modules_panel is None: self._create_ui_elem('modules') self.modules_panel.set_modules(modules) else: self.show_main_tab('modules') def _manually_apply_context(self, context): """ perform additional operation if the context has been manually applied from the context list """ self._apply_context(context, manual=True) def _on_hit_module_initialization_breakpoint(self, data): if self.debug_panel.memory_panel.number_of_lines() == 0: data = data[1] module_base = int(data['moduleBase'], 16) self.jump_to_address(module_base) def _apply_context(self, context, manual=False): # update current context tid # this should be on top as any further api from js needs to be executed on that thread reason = context['reason'] is_initial_setup = reason == -1 if manual or (self.dwarf.context_tid and not is_initial_setup): self.dwarf.context_tid = context['tid'] if is_initial_setup: self.debug_panel.on_context_setup() if 'context' in context: if not manual: self.threads.add_context(context) is_java = context['is_java'] if is_java: if self.java_explorer_panel is None: self._create_ui_elem('jvm-debugger') self.context_panel.set_context(context['ptr'], 1, context['context']) self.java_explorer_panel.init() self.show_main_tab('jvm-debugger') else: self.context_panel.set_context(context['ptr'], 0, context['context']) if reason == 0: if 'pc' in context['context']: if self.debug_panel.disassembly_panel.number_of_lines( ) == 0 or manual: self.jump_to_address( context['context']['pc']['value'], view=1) elif reason == 3: # step # we make the frontend believe we are in the real step pc instead of the frida space context['context']['pc'] = context['ptr'] if 'rip' in context['context']: context['context']['rip'] = context['ptr'] self.jump_to_address(context['ptr'], view=1) if 'backtrace' in context: self.backtrace_panel.set_backtrace(context['backtrace']) def _on_add_breakpoint(self, breakpoint): try: # set highlight ptr = breakpoint.get_target() ptr = utils.parse_ptr(ptr) self.debug_panel.memory_panel.add_highlight( HighLight('breakpoint', ptr, self.dwarf.pointer_size)) except HighlightExistsError: pass def _on_breakpoint_removed(self, ptr): ptr = utils.parse_ptr(ptr) self.debug_panel.memory_panel.remove_highlight(ptr) def _on_addmodule_breakpoint(self, data): ptr, name = data self.dwarf.breakpoint_native(input_=ptr) def on_tid_resumed(self, tid): if self.dwarf: if self.dwarf.context_tid == tid: # clear backtrace if 'backtrace' in self._ui_elems: if self.backtrace_panel is not None: self.backtrace_panel.clear() # remove thread if 'threads' in self._ui_elems: if self.contexts_list_panel is not None: self.contexts_list_panel.resume_tid(tid) # clear registers if 'registers' in self._ui_elems: if self.context_panel is not None: self.context_panel.clear() # clear jvm explorer if 'jvm-debugger' in self._ui_elems: if self.java_explorer_panel is not None: self.java_explorer_panel.clear_panel() # invalidate dwarf context tid self.dwarf.context_tid = 0 def _on_set_data(self, data): if not isinstance(data, list): return if self.data_panel is None: self.show_main_tab('data') if self.data_panel is not None: self.data_panel.append_data(data[0], data[1], data[2]) def show_progress(self, text): self.progressbar.setVisible(True) self.set_status_text(text) def hide_progress(self): self.progressbar.setVisible(False) self.set_status_text('') def _on_attached(self, data): self.setWindowTitle('Dwarf - Attached to %s (%s)' % (data[1], data[0])) def _on_detached(self, data): reason = data[1] if reason == 'application-requested': if self.session_manager.session: self.session_manager.session.stop() return 0 if self.dwarf is not None: ret = QDialogDetached.show_dialog(self.dwarf, data[0], data[1], data[2]) if ret == 0: self.dwarf.restart_proc() elif ret == 1: self.session_manager.session.stop() return 0 def _on_script_loaded(self): # restore the loaded session if any self.session_manager.restore_session() def on_add_bookmark(self, ptr): """ provide ptr as int """ if self.bookmarks_panel is not None: self.bookmarks_panel._create_bookmark(ptr=hex(ptr)) def _on_showmemory_request(self, ptr): # its simple ptr show in memorypanel if isinstance(ptr, str): ptr = utils.parse_ptr(ptr) self.jump_to_address(ptr, 0) elif isinstance(ptr, list): # TODO: extend caller, ptr = ptr ptr = utils.parse_ptr(ptr) if caller == 'backtrace' or caller == 'bt': # jumpto in disasm self.jump_to_address(ptr, 1)
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setupUi() self.show() self.current_knee_step = 0 self.target_step = 5 self.current_order = 0 self.is_horizontal = False self.is_current_step_visible = True self.calibration_position = QPointF(0, 0) try: self.timer_thread = KneePosition.TimerThread() self.timer_thread.updateSignal.connect(self.control_params_with_knee) self.timer_thread.start() self.kneePosition = self.timer_thread.kneePosition self.calibration_position = QPointF(self.kneePosition.knee_pos_x_center, self.kneePosition.knee_pos_y_center) except serial.serialutil.SerialException as e: pass # self.statusbar.showMessage("膝操作が無効:シリアル通信が確保できていません。原因:" + str(e)) self.rectangles = [] self.rect_orders = [] self.setup_rect(steps) self.setup_experiment() def setupUi(self): self.setObjectName("self") self.resize(1280, 720) self.centralwidget = QWidget(self) self.centralwidget.setObjectName("centralwidget") self.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(self) self.menubar.setGeometry(QRect(0, 0, 889, 22)) self.menubar.setObjectName("menubar") self.setMenuBar(self.menubar) self.statusbar = QStatusBar(self) self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) start_experiment_action = QAction("計測開始", self) start_experiment_action.setShortcut(QKeySequence("Ctrl+E")) start_experiment_action.triggered.connect(self.start_experiment) save_records_action = QAction("計測結果を保存", self) save_records_action.setShortcut(QKeySequence("Ctrl+S")) save_records_action.triggered.connect(self.save_records) switch_current_step_visible_action = QAction("現在のステップを表示/非表示切り替え", self) switch_current_step_visible_action.setShortcut(QKeySequence("Ctrl+V")) switch_current_step_visible_action.triggered.connect(self.switch_current_step_visible) operation_menus = self.menubar.addMenu("experiments") operation_menus.addAction(start_experiment_action) operation_menus.addAction(save_records_action) # def switch_vertical_and_horizontal(self): # self.is_horizontal = not self.is_horizontal # self.setup_rect(steps) # self.centralwidget.update() # self.update() def setup_rect(self, num_of_rects: int): if self.is_horizontal: rect_width = 1080 / num_of_rects for i in range(num_of_rects): self.rectangles.append(QRect(100 + rect_width * i, 260, rect_width, 100)) else: rect_height = 620 / num_of_rects for i in range(num_of_rects): self.rectangles.append(QRect(540, 50 + rect_height * i, 100, rect_height)) def setup_experiment(self): # UIのsetup self.rect_orders = [] if steps == 5: for i in range(4): self.rect_orders += random.sample(range(steps), steps) elif steps == 10: for i in range(2): self.rect_orders += random.sample(range(steps), steps) elif steps == 15: self.rect_orders += random.sample(range(steps), steps) tmp_orders = random.sample(range(steps), steps) self.rect_orders += tmp_orders[0:5] elif steps == 20: self.rect_orders += random.sample(range(steps), steps) for i in range(steps): print(self.rectangles[i]) # 取得する指標 self.operation_times = np.empty((steps * 3), dtype=float) self.offsets = np.empty((steps * 3), dtype=int) self.current_position = QPointF(0, 0) # タイマー self.start_time = 0 self.previous_operated_time = 0 self.is_started_experiment = False self.frame_records = np.empty((0, 3), float) # 操作ごとの記録 self.operation_records = np.empty((0, 5), float) # フレーム(膝位置が更新される)ごとの記録 def start_experiment(self): self.start_time = time.time() self.is_started_experiment = True self.statusbar.showMessage("Experiment started p{}, {}, steps_{}, step_{}" .format(participant_No, ("horizontal" if self.is_horizontal else "vertical"), steps, ("visible" if self.is_current_step_visible else "invisible") ) ) def record_frame(self): if self.is_started_experiment: current_time = time.time() - self.start_time self.frame_records = np.append(self.frame_records, np.array( [[self.current_position.x(), self.current_position.y(), current_time]] ), axis=0) def record_operation(self): current_time = time.time() - self.start_time operation_times = current_time - self.previous_operated_time offsets = self.current_knee_step - self.rect_orders[self.current_order] self.operation_records = np.append(self.operation_records, np.array( [[self.current_position.x(), self.current_position.y(), operation_times, self.current_knee_step, self.rect_orders[self.current_order]]] ), axis=0) self.previous_operated_time = current_time self.statusbar.showMessage(str(current_time)) def save_records(self): date = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") if not self.is_started_experiment: file_path = "result_preliminary/p{}/{}/steps_{}/step_{}".format(participant_No, ("horizontal" if self.is_horizontal else "vertical"), steps, ("visible" if self.is_current_step_visible else "invisible") ) try: os.makedirs(file_path) except FileExistsError: pass np.savetxt(file_path + "test_frameRecords_{}.csv".format(date), self.frame_records, delimiter=',', fmt=['%.5f', '%.5f', '%.5f'], header='knee_pos_x, knee_pos_y, time', comments=' ') np.savetxt(file_path + "test_operationRecords_{}.csv".format(date), self.operation_records, delimiter=',', fmt=['%.5f', '%.5f', '%.5f', '%.0f', '%.0f'], header="knee_pos_x, knee_pos_y, time, selected_No, target_No, calibration x:{} y:{}" .format(self.kneePosition.knee_pos_x_center, self.kneePosition.knee_pos_y_center), comments=' ') self.statusbar.showMessage("Saved.") def switch_current_step_visible(self): if not self.is_started_experiment: self.is_current_step_visible = not self.is_current_step_visible def control_params_with_knee(self, x, y): self.current_position.setX(x) self.current_position.setY(y) self.record_frame() x, y = self.kneePosition.get_mapped_positions(x, y, 1, 359) if self.is_horizontal: self.current_knee_step = (int)(x / (360 / steps)) else: self.current_knee_step = steps - (int)(y / (360 / steps)) - 1 # status_str = "x: " + str(x) + "y: " + str(y) # self.statusbar.showMessage(status_str) self.update() def keyPressEvent(self, keyevent: QKeyEvent): if keyevent.key() == Qt.Key_Return: if self.is_started_experiment: self.record_operation() self.current_order = self.current_order + 1 if self.current_order >= 20: self.statusbar.showMessage("End. Save data with Cmd+S.") self.is_started_experiment = False self.current_order = 0 self.update() def paintEvent(self, event: QPaintEvent): painter = QPainter(self) for rect in self.rectangles: painter.drawRect(rect) # ターゲットの段階 painter.setBrush(Qt.green) painter.drawRect(self.rectangles[self.rect_orders[self.current_order % 20]]) # 現在の段階 if self.is_current_step_visible or not self.is_started_experiment: painter.setBrush(Qt.blue) painter.drawRect(self.rectangles[self.current_knee_step])
class EditorMainWindow(QMainWindow): def __init__(self): super().__init__() self.setupUi(self) self.retranslateUi(self) self.level = None path = get_default_path() if path is None: self.default_path = "" else: self.default_path = path self.dragging = False self.last_x = None self.last_y = None self.dragged_time = None self.deleting_item = False # Hack for preventing focusing on next item after deleting the previous one self.moving = False self.resetting = False self.entity_list_widget.currentItemChanged.connect(self.action_listwidget_change_selection) self.button_zoom_in.pressed.connect(self.zoom_in) self.button_zoom_out.pressed.connect(self.zoom_out) self.button_remove_entity.pressed.connect(self.remove_position) self.button_move_entity.pressed.connect(self.move_entity) self.button_clone_entity.pressed.connect(self.action_clone_entity) self.button_show_passengers.pressed.connect(self.action_passenger_window) self.button_edit_xml.pressed.connect(self.action_open_xml_editor) self.button_edit_base_xml.pressed.connect(self.action_open_basexml_editor) self.lineedit_angle.editingFinished.connect(self.action_lineedit_changeangle) self.bw_map_screen.mouse_clicked.connect(self.get_position) self.bw_map_screen.entity_clicked.connect(self.entity_position) self.bw_map_screen.mouse_dragged.connect(self.mouse_move) self.bw_map_screen.mouse_released.connect(self.mouse_release) self.bw_map_screen.mouse_wheel.connect(self.mouse_wheel_scroll_zoom) status = self.statusbar self.bw_map_screen.setMouseTracking(True) self.passenger_window = BWPassengerWindow() self.passenger_window.passengerlist.currentItemChanged.connect(self.passengerwindow_action_choose_entity) self.xmlobject_textbox = BWEntityXMLEditor() self.xmlobject_textbox.button_xml_savetext.pressed.connect(self.xmleditor_action_save_object_xml) self.xmlobject_textbox.triggered.connect(self.action_open_xml_editor_unlimited) self.basexmlobject_textbox = BWEntityXMLEditor(windowtype="XML Base Object") self.basexmlobject_textbox.button_xml_savetext.pressed.connect(self.xmleditor_action_save_base_object_xml) self.basexmlobject_textbox.triggered.connect(self.action_open_xml_editor_unlimited) self.types_visible = {} self.terrain_image = None status.showMessage("Ready") self.xml_windows = {} print("We are now ready!") def reset(self): self.resetting = True self.statusbar.clearMessage() self.dragged_time = None self.moving = False self.dragging = False self.last_x = None self.last_y = None self.dragged_time = None self.moving = False self.entity_list_widget.clearSelection() self.entity_list_widget.clear() self.bw_map_screen.reset() self.clear_visibility_toggles() for window in (self.passenger_window, self.xmlobject_textbox, self.basexmlobject_textbox): window.close() window.reset() for id in self.xml_windows: self.destroy_xml_editor(id) self.resetting = False print("reset done") def destroy_xml_editor(self, id): pass @catch_exception def open_xml_editor(self, objectid, offsetx=0, offsety=0): selected = objectid if self.level is not None and selected in self.level.obj_map: delete = [] for objid, window in self.xml_windows.items(): if not window.isVisible() and objid != selected: window.destroy() delete.append(objid) for objid in delete: del self.xml_windows[objid] if selected == self.basexmlobject_textbox.entity or selected == self.xmlobject_textbox.entity: pass # No need to make a new window elif selected in self.xml_windows and self.xml_windows[selected].isVisible(): self.xml_windows[selected].activateWindow() self.xml_windows[selected].update() else: xml_window = BWEntityXMLEditor() def xmleditor_save_object_unlimited(): self.statusbar.showMessage("Saving object changes...") try: xmlnode = xml_window.get_content() #assert self.bw_map_screen.current_entity == self.basexmlobject_textbox.entity assert xml_window.entity == xmlnode.get("id") # Disallow changing the id of the base object self.level.remove_object(xmlnode.get("id")) self.level.add_object(xmlnode) self.statusbar.showMessage("Saved base object {0} as {1}".format( xml_window.entity, self.level.obj_map[xmlnode.get("id")].name)) except: self.statusbar.showMessage("Saving object failed") traceback.print_exc() xml_window.button_xml_savetext.pressed.connect(xmleditor_save_object_unlimited) xml_window.triggered.connect(self.action_open_xml_editor_unlimited) obj = self.level.obj_map[selected] xml_window.set_title(obj.name) xml_window.set_content(obj._xml_node) #xml_window.move(QPoint(xml_editor_owner.pos().x()+20, xml_editor_owner.pos().y()+20)) xml_window.move(QPoint(offsetx, offsety)) xml_window.show() xml_window.update() self.xml_windows[selected] = xml_window @catch_exception def action_open_xml_editor_unlimited(self, xml_editor_owner): selected = xml_editor_owner.textbox_xml.textCursor().selectedText() self.open_xml_editor(selected, offsetx=xml_editor_owner.pos().x()+20, offsety=xml_editor_owner.pos().y()+20) @catch_exception def action_open_basexml_editor(self): """ if not self.basexmlobject_textbox.isVisible(): self.basexmlobject_textbox.destroy() self.basexmlobject_textbox = BWEntityXMLEditor(windowtype="XML Base Object") self.basexmlobject_textbox.button_xml_savetext.pressed.connect(self.xmleditor_action_save_base_object_xml) self.basexmlobject_textbox.triggered.connect(self.action_open_xml_editor_unlimited) self.basexmlobject_textbox.show() self.basexmlobject_textbox.activateWindow()""" if self.level is not None and self.bw_map_screen.current_entity is not None: obj = self.level.obj_map[self.bw_map_screen.current_entity] if not obj.has_attr("mBase"): pass else: baseobj = self.level.obj_map[obj.get_attr_value("mBase")] #self.basexmlobject_textbox.set_title(baseobj.id) self.open_xml_editor(baseobj.id) def xmleditor_action_save_base_object_xml(self): self.statusbar.showMessage("Saving base object changes...") try: xmlnode = self.basexmlobject_textbox.get_content() #assert self.bw_map_screen.current_entity == self.basexmlobject_textbox.entity assert self.basexmlobject_textbox.entity == xmlnode.get("id") # Disallow changing the id of the base object self.level.remove_object(xmlnode.get("id")) self.level.add_object(xmlnode) self.statusbar.showMessage("Saved base object {0} as {1}".format( self.basexmlobject_textbox.entity, self.level.obj_map[xmlnode.get("id")].name)) except: self.statusbar.showMessage("Saving base object failed") traceback.print_exc() def action_open_xml_editor(self): """ if not self.xmlobject_textbox.isVisible(): self.xmlobject_textbox.destroy() self.xmlobject_textbox = BWEntityXMLEditor() self.xmlobject_textbox.button_xml_savetext.pressed.connect(self.xmleditor_action_save_object_xml) self.xmlobject_textbox.triggered.connect(self.action_open_xml_editor_unlimited) self.xmlobject_textbox.show() self.xmlobject_textbox.activateWindow()""" if self.level is not None and self.bw_map_screen.current_entity is not None: entityobj = self.level.obj_map[self.bw_map_screen.current_entity] self.open_xml_editor(objectid=entityobj.id) update_mapscreen(self.bw_map_screen, self.level.obj_map[entityobj.id]) self.bw_map_screen.update() """self.xmlobject_textbox.set_title(entityobj.id) self.xmlobject_textbox.set_content(entityobj._xml_node) self.xmlobject_textbox.update()""" def xmleditor_action_save_object_xml(self): self.statusbar.showMessage("Saving object changes...") try: xmlnode = self.xmlobject_textbox.get_content() #assert self.bw_map_screen.current_entity == self.xmlobject_textbox.entity assert self.xmlobject_textbox.entity == xmlnode.get("id") or xmlnode.get("id") not in self.level.obj_map if self.passenger_window.isVisible(): self.passenger_window.close() if self.xmlobject_textbox.entity != xmlnode.get("id"): #obj = self.level.obj_map[xmlnode.get("id")] self.level.remove_object(self.xmlobject_textbox.entity) print("adding", xmlnode.get("id"), xmlnode.get("id") in self.level.obj_map ) self.level.add_object(xmlnode) pos = self.get_entity_item_pos(self.xmlobject_textbox.entity) item = self.entity_list_widget.takeItem(pos) self.entity_list_widget.removeItemWidget(item) self.add_item_sorted(xmlnode.get("id")) self.bw_map_screen.rename_entity(self.xmlobject_textbox.entity, xmlnode.get("id")) assert xmlnode.get("id") in self.level.obj_map self.xmlobject_textbox.entity = xmlnode.get("id") self.xmlobject_textbox.set_title(xmlnode.get("id")) else: self.level.remove_object(xmlnode.get("id")) self.level.add_object(xmlnode) update_mapscreen(self.bw_map_screen, self.level.obj_map[xmlnode.get("id")]) self.statusbar.showMessage("Saved object {0} as {1}".format( self.xmlobject_textbox.entity, self.level.obj_map[xmlnode.get("id")].name)) self.bw_map_screen.update() except: self.statusbar.showMessage("Saving object failed") traceback.print_exc() def action_clone_entity(self): entities = [] if self.bw_map_screen.current_entity is not None: entities.append(self.bw_map_screen.current_entity) elif len(self.bw_map_screen.selected_entities) > 0: entities.extend(self.bw_map_screen.selected_entities.keys()) if len(entities) > 0: dont_clone = {} for entity in entities: obj = self.level.obj_map[entity] if obj.has_attr("mPassenger"): passengers = obj.get_attr_elements("mPassenger") for passenger in passengers: if passenger != "0": dont_clone[passenger] = True select = [] for entity in entities: if entity in dont_clone: continue obj = self.level.obj_map[entity] xml_node = deepcopy(obj._xml_node) try: cloned_id = self.level.generate_unique_id(entity) xml_node.set("id", cloned_id) self.level.add_object(xml_node) bw_x, bw_y, angle = object_get_position(self.level, cloned_id) x, y = bw_coords_to_image_coords(bw_x, bw_y) self.add_item_sorted(cloned_id) self.bw_map_screen.add_entity(x, y, cloned_id, obj.type) clonedobj = self.level.obj_map[cloned_id] select.append(cloned_id) update_mapscreen(self.bw_map_screen, clonedobj) if clonedobj.has_attr("mPassenger"): orig_x = bw_x orig_y = bw_y passengers = clonedobj.get_attr_elements("mPassenger") passengers_added = [] for i, passenger in enumerate(passengers): if passenger != "0": obj = self.level.obj_map[passenger] xml_node = deepcopy(obj._xml_node) clonedpassenger_id = self.level.generate_unique_id(passenger) xml_node.set("id", clonedpassenger_id) #print("orig passenger: {0}, new passenger: {1}, alreadyexists: {2}".format( # passenger, clonedpassenger_id, clonedpassenger_id in self.level.obj_map #)) #print(type(passenger), type(clonedpassenger_id)) self.level.add_object(xml_node) #x, y = object_get_position(self.level, newid) x = orig_x + (i+1)*8 y = orig_y + (i+1)*8 #print(orig_x, orig_y, x, y) object_set_position(self.level, clonedpassenger_id, x, y) x, y = bw_coords_to_image_coords(x, y) self.add_item_sorted(clonedpassenger_id) self.bw_map_screen.add_entity(x, y, clonedpassenger_id, obj.type) update_mapscreen(self.bw_map_screen, self.level.obj_map[clonedpassenger_id]) passengers_added.append(passenger) clonedobj.set_attr_value("mPassenger", clonedpassenger_id, i) select.append(clonedpassenger_id) #print("passengers added:", passengers_added) self.bw_map_screen.selected_entities = {} if len(select) == 1: ent = select[0] self.set_entity_text(ent) self.bw_map_screen.choose_entity(ent) else: for ent in select: self.bw_map_screen.selected_entities[ent] = True self.set_entity_text_multiple(self.bw_map_screen.selected_entities) self.bw_map_screen.update() except: traceback.print_exc() def add_item_sorted(self, entity): max_count = self.entity_list_widget.count() entityobj = self.level.obj_map[entity] index = 0 entity_item = BWEntityEntry(entity, "{0}[{1}]".format(entity, entityobj.type)) # Similar to loading a level, we add the entity in a sorted way by # creating this string and comparing it for every item in the list. entity_string = get_type(entityobj.type)+entityobj.type+entityobj.id inserted = False for i in range(max_count): curritem = self.entity_list_widget.item(i) currobj = self.level.obj_map[curritem.xml_ref] currstring = get_type(currobj.type)+currobj.type+currobj.id # The list is already sorted, so if we find an item bigger than # the one we are inserting, we know the position we have to insert the item in. # String comparison should be alpabetically. if currstring > entity_string: self.entity_list_widget.insertItem(i, entity_item) inserted = True break # If we couldn't insert the item, i.e. there are no items at all # or all items are smaller than the item we add, we just add it at the end. if not inserted: self.entity_list_widget.addItem(entity_item) def get_entity_item_pos(self, entityid): for i in range(self.entity_list_widget.count()): item = self.entity_list_widget.item(i) if item.xml_ref == entityid: return i return None def action_passenger_window(self): #if self.passenger_window.isVisible() print("window is visible: ", self.passenger_window.isVisible()) #self.passenger_window.reset() if not self.passenger_window.isVisible(): self.passenger_window.destroy() self.passenger_window = BWPassengerWindow() self.passenger_window.passengerlist.currentItemChanged.connect(self.passengerwindow_action_choose_entity) self.passenger_window.show() self.passenger_window.activateWindow() if self.bw_map_screen.current_entity is not None: self.passenger_window.reset() entityobj = self.level.obj_map[self.bw_map_screen.current_entity] self.passenger_window.set_title(entityobj.id) if entityobj.has_attr("mPassenger"): for i, passenger in enumerate(entityobj.get_attr_elements("mPassenger")): if passenger in self.level.obj_map: passengerobj = self.level.obj_map[passenger] list_item_name = "{0}[{1}]".format(passenger, passengerobj.type) elif passenger == "0": list_item_name = "{0}<none>".format(passenger) else: list_item_name = "{0}<missing>".format(passenger) self.passenger_window.add_passenger(list_item_name, passenger) self.passenger_window.update() def passengerwindow_action_choose_entity(self, current, previous): try: if current is not None and current.xml_ref in self.level.obj_map: self.set_entity_text(current.xml_ref) self.bw_map_screen.choose_entity(current.xml_ref) elif current is not None: self.statusbar.showMessage("No such entity: {0}".format(current.xml_ref), 1000*2) except: traceback.print_exc() def move_entity(self): if not self.dragging: if not self.moving: self.moving = True currtext = self.button_move_entity.text() self.button_move_entity.setText("Stop [Move Entity]") else: self.moving = False currtext = "Move Entity" self.button_move_entity.setText(currtext) def button_load_level(self): try: print("ok", self.default_path) self.xmlPath = "" filepath, choosentype = QFileDialog.getOpenFileName( self, "Open File", self.default_path, BW_LEVEL+";;"+BW_COMPRESSED_LEVEL+";;All files (*)") print("doooone") if filepath: print("resetting") self.reset() print("done") print("chosen type:",choosentype) # Some BW levels are clear XML files, some are compressed with GZIP # We decide between the two either based on user choice or end of filepath if choosentype == BW_COMPRESSED_LEVEL or filepath.endswith(".gz"): print("OPENING AS COMPRESSED") file_open = gzip.open else: file_open = open with file_open(filepath, "rb") as f: try: self.level = BattWarsLevel(f) self.default_path = filepath set_default_path(filepath) self.setup_visibility_toggles() for obj_id, obj in sorted(self.level.obj_map.items(), key=lambda x: get_type(x[1].type)+x[1].type+x[1].id): #print("doing", obj_id) if get_position_attribute(obj) is None: continue #if not obj.has_attr("Mat"): # continue x, y, angle = object_get_position(self.level, obj_id) assert type(x) != str x, y = bw_coords_to_image_coords(x, y) item = BWEntityEntry(obj_id, "{0}[{1}]".format(obj_id, obj.type)) self.entity_list_widget.addItem(item) self.bw_map_screen.add_entity(x, y, obj_id, obj.type, update=False) #if obj.type == "cMapZone": update_mapscreen(self.bw_map_screen, obj) print("ok") self.bw_map_screen.update() path_parts = path.split(filepath) self.setWindowTitle("BW-MapEdit - {0}".format(path_parts[-1])) except Exception as error: print("error", error) traceback.print_exc() except Exception as er: print("errrorrr", er) traceback.print_exc() print("loaded") def button_save_level(self): if self.level is not None: filepath, choosentype = QFileDialog.getSaveFileName( self, "Save File", self.default_path, BW_LEVEL+";;"+BW_COMPRESSED_LEVEL+";;All files (*)") print(filepath, "saved") if filepath: # Simiar to load level if choosentype == BW_COMPRESSED_LEVEL or filepath.endswith(".gz"): file_open = gzip.open else: file_open = open try: with file_open(filepath, "wb") as f: self.level._tree.write(f) except Exception as error: print("COULDN'T SAVE:", error) traceback.print_exc() self.default_path = filepath else: pass # no level loaded, do nothing def entity_position(self, event, entity): try: # Make it possible to select objects in move mode, but don't make it too easy to lose # a selection. if not (self.moving and len(self.bw_map_screen.selected_entities) > 1): print("got entity:",entity, self.bw_map_screen.entities[entity][2]) print(entity_get_model(self.level, entity)) self.set_entity_text(entity) self.bw_map_screen.choose_entity(entity) pos = self.get_entity_item_pos(entity) print("searching:",pos) try: self.entity_list_widget.select_item(pos) except: traceback.print_exc() self.bw_map_screen.selected_entities = {} self.bw_map_screen.update() except: traceback.print_exc() def remove_position(self): #self.bw_map_screen.entities.pop() try: # Remove the entity from the map, the list widget and the level data self.deleting_item = True entities = [] if self.bw_map_screen.current_entity is not None: entities.append(self.bw_map_screen.current_entity) elif len(self.bw_map_screen.selected_entities) > 0: entities.extend(self.bw_map_screen.selected_entities.keys()) self.bw_map_screen.selected_entities = {} self.set_entity_text_multiple(self.bw_map_screen.selected_entities) if len(entities) > 0: for entity in entities: pos = self.get_entity_item_pos(entity) item = self.entity_list_widget.takeItem(pos) assert item.xml_ref == entity #self.entity_list_widget.clearSelection() self.entity_list_widget.clearFocus() self.entity_list_widget.removeItemWidget(item) self.level.remove_object(entity) self.bw_map_screen.remove_entity(entity) self.bw_map_screen.update() except: traceback.print_exc() raise #@catch_exception def get_position(self, event): self.dragging = True self.last_x = event.x() self.last_y = event.y() self.dragged_time = default_timer() mouse_x = event.x()/self.bw_map_screen.zoom_factor mouse_y = event.y()/self.bw_map_screen.zoom_factor if event.buttons() == QtCore.Qt.LeftButton: if not self.moving: self.bw_map_screen.set_selectionbox_start((event.x(), event.y())) else: if self.bw_map_screen.current_entity is not None: newx, newy = image_coords_to_bw_coords(mouse_x, mouse_y) object_set_position(self.level, self.bw_map_screen.current_entity, newx, newy) self.bw_map_screen.move_entity(self.bw_map_screen.current_entity, mouse_x, mouse_y) self.set_entity_text(self.bw_map_screen.current_entity) update_mapscreen(self.bw_map_screen, self.level.obj_map[self.bw_map_screen.current_entity]) elif len(self.bw_map_screen.selected_entities) > 0: for entity in self.bw_map_screen.selected_entities: first_entity = entity break #first_entity = self.bw_map_screen.selected_entities.keys()[0] x, y, entitytype, metadata = self.bw_map_screen.entities[first_entity] startx = endx = x starty = endy = y for entity in self.bw_map_screen.selected_entities: x, y, dontneed, dontneed = self.bw_map_screen.entities[entity] if x < startx: startx = x if x > endx: endx = x if y < starty: starty = y if y > endy: endy = y middle_x = (startx+endx) / 2 middle_y = (starty+endy) / 2 delta_x = mouse_x - middle_x delta_y = mouse_y - middle_y for entity in self.bw_map_screen.selected_entities: x, y, dontneed, dontneed = self.bw_map_screen.entities[entity] newx, newy = image_coords_to_bw_coords(x+delta_x, y+delta_y) object_set_position(self.level, entity, newx, newy) self.bw_map_screen.move_entity(entity, x+delta_x, y+delta_y) #self.set_entity_text(self.bw_map_screen.current_entity) update_mapscreen(self.bw_map_screen, self.level.obj_map[entity]) self.bw_map_screen.update() @catch_exception def mouse_move(self, event): x, y = image_coords_to_bw_coords(event.x()/self.bw_map_screen.zoom_factor, event.y()/self.bw_map_screen.zoom_factor) self.statusbar.showMessage("x: {0} y: {1}".format(round(x, 5), round(y, 5))) if self.dragging and default_timer() - self.dragged_time > 0.1: if event.buttons() == QtCore.Qt.RightButton: delta_x = (event.x()-self.last_x)/8 delta_y = (event.y()-self.last_y)/8 #print("hi",event.x(), event.y()) vertbar = self.scrollArea.verticalScrollBar() horizbar = self.scrollArea.horizontalScrollBar() vertbar.setSliderPosition(vertbar.value()-delta_y) horizbar.setSliderPosition(horizbar.value()-delta_x) elif event.buttons() == QtCore.Qt.LeftButton: self.bw_map_screen.set_selectionbox_end((event.x(), event.y())) if len(self.bw_map_screen.selected_entities) > 0 or self.bw_map_screen.current_entity is None: self.bw_map_screen.choose_entity(None) self.set_entity_text_multiple(self.bw_map_screen.selected_entities) self.bw_map_screen.update() def mouse_release(self, event): self.dragging = False if self.bw_map_screen.selectionbox_end is not None: self.bw_map_screen.clear_selection_box() self.bw_map_screen.update() def set_entity_text_multiple(self, entities): self.label_object_id.setText("{0} objects selected".format(len(entities))) MAX = 15 listentities = [self.level.obj_map[x].name for x in sorted(entities.keys())][0:MAX] listentities.sort() if len(entities) > MAX: listentities.append("... and {0} more".format(len(entities) - len(listentities))) self.label_position.setText("\n".join(listentities[:5])) self.label_model_name.setText("\n".join(listentities[5:10])) self.label_4.setText("\n".join(listentities[10:]))#15])) self.label_5.setText("")#("\n".join(listentities[12:16])) def set_entity_text(self, entityid): try: obj = self.level.obj_map[entityid] if obj.has_attr("mBase"): base = self.level.obj_map[obj.get_attr_value("mBase")] self.label_object_id.setText("{0}\n[{1}]\nBase: {2}\n[{3}]".format( entityid, obj.type, base.id, base.type)) else: self.label_object_id.setText("{0}\n[{1}]".format(entityid, obj.type)) self.label_model_name.setText("Model: {0}".format(entity_get_model(self.level, entityid))) x, y, angle = object_get_position(self.level, entityid) self.label_position.setText("x: {0}\ny: {1}".format(x, y)) self.lineedit_angle.setText(str(round(angle,2))) self.label_4.setText("Army: {0}".format(entity_get_army(self.level, entityid))) if not obj.has_attr("mPassenger"): self.label_5.setText("Icon Type: \n{0}".format(entity_get_icon_type(self.level, entityid))) else: passengers = 0 for passenger in obj.get_attr_elements("mPassenger"): if passenger != "0": passengers += 1 self.label_5.setText("Icon Type: \n{0}\n\nPassengers: {1}".format( entity_get_icon_type(self.level, entityid), passengers)) except: traceback.print_exc() def action_listwidget_change_selection(self, current, previous): #QtWidgets.QListWidgetItem. if not self.resetting and current is not None: print("ok") print("hi", current.text(), current.xml_ref) self.set_entity_text(current.xml_ref) self.bw_map_screen.choose_entity(current.xml_ref) posx, posy, typename, metadata = self.bw_map_screen.entities[current.xml_ref] zf = self.bw_map_screen.zoom_factor try: if not self.deleting_item: x_margin = min(100, 50*zf) y_margin = min(100, 50*zf) self.scrollArea.ensureVisible(posx*zf, posy*zf, xMargin=x_margin, yMargin=y_margin) else: self.deleting_item = False except: traceback.print_exc() def zoom_out(self, noslider=False): horizbar = self.scrollArea.horizontalScrollBar() vertbar = self.scrollArea.verticalScrollBar() print(horizbar.maximum(), vertbar.maximum()) if horizbar.maximum() > 0: widthratio = horizbar.value()/horizbar.maximum() else: widthratio = 0 if vertbar.maximum() > 0: heightratio = vertbar.value()/vertbar.maximum() else: heightratio = 0 #oldzf = self.bw_map_screen.zoom_factor / (0.1+1) #diff = oldzf - self.bw_map_screen.zoom_factor zf = self.bw_map_screen.zoom_factor self.bw_map_screen.zoom(calc_zoom_out_factor(zf))#diff) # if not noslider: horizbar.setSliderPosition(horizbar.maximum()*widthratio) vertbar.setSliderPosition(vertbar.maximum()*heightratio) self.bw_map_screen.update() self.statusbar.showMessage("Zoom: {0}x".format(self.bw_map_screen.zoom_factor)) def zoom_in(self, noslider=False): horizbar = self.scrollArea.horizontalScrollBar() vertbar = self.scrollArea.verticalScrollBar() if horizbar.maximum() > 0: widthratio = horizbar.value()/horizbar.maximum() else: widthratio = 0 if vertbar.maximum() > 0: heightratio = vertbar.value()/vertbar.maximum() else: heightratio = 0 zf = self.bw_map_screen.zoom_factor self.bw_map_screen.zoom(calc_zoom_in_factor(zf))#zf) # print("wedidit?") if not noslider: horizbar.setSliderPosition(horizbar.maximum()*widthratio) vertbar.setSliderPosition(vertbar.maximum()*heightratio) self.bw_map_screen.update() self.statusbar.showMessage("Zoom: {0}x".format(self.bw_map_screen.zoom_factor)) @catch_exception def mouse_wheel_scroll_zoom(self, wheel_event): print("scrolling", wheel_event) print("Scroll", wheel_event.x(), wheel_event.y(), wheel_event.angleDelta().y())#, wheel_event.delta()) wheel_delta = wheel_event.angleDelta().y() zf = self.bw_map_screen.zoom_factor norm_x = wheel_event.x()/zf norm_y = wheel_event.y()/zf if wheel_delta > 0: if zf <= 10: self.zoom_in(True) zf = self.bw_map_screen.zoom_factor xmargin = self.scrollArea.viewport().width()//2 - 200 ymargin = self.scrollArea.viewport().height()//2 - 200 self.scrollArea.ensureVisible(norm_x*zf, norm_y*zf, xmargin, ymargin) self.bw_map_screen.update() else: self.zoom_in() elif wheel_delta < 0: self.zoom_out() def action_lineedit_changeangle(self): if not self.resetting and self.bw_map_screen.current_entity is not None: print("ok") current = self.bw_map_screen.current_entity currx, curry, angle = object_get_position(self.level, current) newangle = self.lineedit_angle.text().strip() print(newangle, newangle.isdecimal()) try: angle = float(newangle) object_set_position(self.level, current, currx, curry, angle=angle) currentobj = self.level.obj_map[current] update_mapscreen(self.bw_map_screen, currentobj) self.bw_map_screen.update() except: traceback.print_exc() def button_terrain_load_action(self): try: print("ok", self.default_path) filepath, choosentype = QFileDialog.getOpenFileName( self, "Open File", self.default_path, "BW terrain files (*.out *out.gz);;All files (*)") print("doooone") if filepath: if filepath.endswith(".gz"): file_open = gzip.open else: file_open = open with file_open(filepath, "rb") as f: try: terrain = BWArchiveBase(f) if self.level is not None: waterheight = get_water_height(self.level) else: waterheight = None image, light_image = parse_terrain_to_image(terrain, waterheight) self.bw_map_screen.set_terrain(image, light_image) except: traceback.print_exc() except: traceback.print_exc() def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(820, 760) MainWindow.setMinimumSize(QSize(720, 560)) MainWindow.setWindowTitle("BW-MapEdit") #MainWindow.setWindowTitle("Nep-Nep") self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") MainWindow.setCentralWidget(self.centralwidget) self.horizontalLayout = QHBoxLayout(self.centralwidget) self.horizontalLayout.setObjectName("horizontalLayout") self.scrollArea = QScrollArea(self.centralwidget) self.scrollArea.setWidgetResizable(True) self.bw_map_screen = BWMapViewer(self.centralwidget) self.scrollArea.setWidget(self.bw_map_screen) self.horizontalLayout.addWidget(self.scrollArea) #self.horizontalLayout.addWidget(self.bw_map_screen) self.entity_list_widget = BWEntityListWidget(self.centralwidget) self.entity_list_widget.setMaximumSize(QSize(300, 16777215)) self.entity_list_widget.setObjectName("entity_list_widget") self.horizontalLayout.addWidget(self.entity_list_widget) spacerItem = QSpacerItem(10, 20, QSizePolicy.Minimum, QSizePolicy.Expanding) self.horizontalLayout.addItem(spacerItem) self.vertLayoutWidget = QWidget(self.centralwidget) self.vertLayoutWidget.setMaximumSize(QSize(250, 1200)) self.verticalLayout = QVBoxLayout(self.vertLayoutWidget) self.verticalLayout.setObjectName("verticalLayout") #self.verticalLayout. self.button_clone_entity = QPushButton(self.centralwidget) self.button_clone_entity.setObjectName("button_clone_entity") self.verticalLayout.addWidget(self.button_clone_entity) self.button_remove_entity = QPushButton(self.centralwidget) self.button_remove_entity.setObjectName("button_remove_entity") self.verticalLayout.addWidget(self.button_remove_entity) self.button_move_entity = QPushButton(self.centralwidget) self.button_move_entity.setObjectName("button_move_entity") self.verticalLayout.addWidget(self.button_move_entity) self.button_show_passengers = QPushButton(self.centralwidget) self.button_show_passengers.setObjectName("button_move_entity") self.verticalLayout.addWidget(self.button_show_passengers) self.gridLayout = QGridLayout() self.gridLayout.setObjectName("gridLayout") self.button_zoom_in = QPushButton(self.centralwidget) self.button_zoom_in.setObjectName("button_zoom_in") self.gridLayout.addWidget(self.button_zoom_in, 0, 0, 0, 1) self.button_zoom_out = QPushButton(self.centralwidget) self.button_zoom_out.setObjectName("button_zoom_out") self.gridLayout.addWidget(self.button_zoom_out, 0, 1, 0, 1) self.button_edit_xml = QPushButton(self.centralwidget) self.button_edit_xml.setObjectName("button_edit_xml") self.button_edit_base_xml = QPushButton(self.centralwidget) self.button_edit_base_xml.setObjectName("button_edit_base_xml") self.verticalLayout.addLayout(self.gridLayout) self.verticalLayout.addWidget(self.button_edit_xml) self.verticalLayout.addWidget(self.button_edit_base_xml) spacerItem1 = QSpacerItem(10, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.verticalLayout.addItem(spacerItem1) self.verticalLayout_2 = QVBoxLayout() self.verticalLayout_2.setObjectName("verticalLayout_2") self.lineedit_angle = QLineEdit(self.centralwidget) self.lineedit_angle.setObjectName("lineedit_angle") self.lineedit_angle.setPlaceholderText("Angle") self.label_object_id = QLabel(self.centralwidget) self.label_object_id.setObjectName("label_object_id") #TextSelectableByCursor self.label_position = QLabel(self.centralwidget) self.label_position.setObjectName("label_position") self.label_model_name = QLabel(self.centralwidget) self.label_model_name.setObjectName("label_model_name") self.label_4 = QLabel(self.centralwidget) self.label_4.setObjectName("label_4") self.label_5 = QLabel(self.centralwidget) self.label_5.setObjectName("label_5") for label in (self.label_object_id, self.label_position, self.label_model_name, self.label_4, self.label_5): label.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) self.verticalLayout_2.addWidget(self.lineedit_angle) self.verticalLayout_2.addWidget(self.label_object_id) self.verticalLayout_2.addWidget(self.label_position) self.verticalLayout_2.addWidget(self.label_model_name) self.verticalLayout_2.addWidget(self.label_4) self.verticalLayout_2.addWidget(self.label_5) self.verticalLayout.addLayout(self.verticalLayout_2) self.horizontalLayout.addWidget(self.vertLayoutWidget) self.menubar = QMenuBar(MainWindow) self.menubar.setGeometry(QRect(0, 0, 820, 29)) self.menubar.setObjectName("menubar") self.file_menu = QMenu(self.menubar) self.file_menu.setObjectName("menuLoad") self.file_load_action = QAction("Load", self) self.file_load_action.triggered.connect(self.button_load_level) self.file_menu.addAction(self.file_load_action) self.file_save_action = QAction("Save", self) self.file_save_action.triggered.connect(self.button_save_level) self.file_menu.addAction(self.file_save_action) self.visibility_menu = MenuDontClose(self.menubar)#QMenu(self.menubar) self.visibility_menu.setObjectName("visibility") #self.visibility_menu.addAction(self.toggle_action) self.visibility_actions = [] self.terrain_menu = QMenu(self.menubar) self.terrain_menu.setObjectName("terrain") self.terrain_load_action = QAction("Load Terrain", self) self.terrain_load_action.triggered.connect(self.button_terrain_load_action) self.terrain_menu.addAction(self.terrain_load_action) self.terrain_display_actions = [] self.setup_terrain_display_toggles() #self.menuLoad_2 = QMenu(self.menubar) #self.menuLoad_2.setObjectName("menuLoad_2") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.menubar.addAction(self.file_menu.menuAction()) #self.menubar.addAction(self.menuLoad_2.menuAction()) self.menubar.addAction(self.visibility_menu.menuAction()) self.menubar.addAction(self.terrain_menu.menuAction()) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) def make_terrain_toggle(self, show_mode): def terraintoggle(toggled): print("I am", show_mode, "and I was pressed") if toggled is True: for action, toggle, mode in self.terrain_display_actions: if mode != show_mode: action.setChecked(False) self.bw_map_screen.set_show_terrain_mode(show_mode) elif toggled is False: self.bw_map_screen.set_show_terrain_mode(SHOW_TERRAIN_NO_TERRAIN) else: print("This shouldn't be possible", toggled, type(toggled)) self.bw_map_screen.update() return terraintoggle def setup_terrain_display_toggles(self): for mode, name in ((SHOW_TERRAIN_REGULAR, "Show Heightmap"), (SHOW_TERRAIN_LIGHT, "Show Lightmap")): toggle = self.make_terrain_toggle(mode) toggle_action = QAction(name, self) toggle_action.setCheckable(True) if mode == SHOW_TERRAIN_REGULAR: toggle_action.setChecked(True) else: toggle_action.setChecked(False) toggle_action.triggered.connect(toggle) self.terrain_menu.addAction(toggle_action) self.terrain_display_actions.append((toggle_action, toggle, mode)) def clear_terrain_toggles(self): try: for action, func, mode in self.terrain_display_actions: self.terrain_menu.removeAction(action) self.terrain_display_actions = [] except: traceback.print_exc() def make_toggle_function(self, objtype): def toggle(toggled): print("i was pressed") my_type = copy(objtype) self.types_visible[my_type] = toggled self.bw_map_screen.set_visibility(self.types_visible) self.bw_map_screen.update() return toggle def setup_visibility_toggles(self): for objtype in sorted(self.level.objtypes_with_positions): toggle = self.make_toggle_function(objtype) toggle_action = QAction(copy(objtype), self) toggle_action.setCheckable(True) toggle_action.setChecked(True) toggle_action.triggered.connect(toggle) self.types_visible[objtype] = True self.visibility_menu.addAction(toggle_action) self.visibility_actions.append((toggle_action, toggle)) toggle_all = QAction("Toggle All", self) toggle_all.triggered.connect(self.toggle_visiblity_all) self.visibility_menu.addAction(toggle_all) self.visibility_actions.append((toggle_all, self.toggle_visiblity_all)) def toggle_visiblity_all(self): for action, func in self.visibility_actions: if action.isCheckable(): objtype = action.text() toggle = self.types_visible[objtype] self.types_visible[objtype] = not toggle action.setChecked(not toggle) self.bw_map_screen.set_visibility(self.types_visible) self.bw_map_screen.update() def clear_visibility_toggles(self): try: for action, func in self.visibility_actions: self.visibility_menu.removeAction(action) self.visibility_actions = [] self.types_visible = {} except: traceback.print_exc() def retranslateUi(self, MainWindow): _translate = QCoreApplication.translate self.button_clone_entity.setText(_translate("MainWindow", "Clone Entity")) self.button_remove_entity.setText(_translate("MainWindow", "Delete Entity")) self.button_move_entity.setText(_translate("MainWindow", "Move Entity")) self.button_zoom_in.setText(_translate("MainWindow", "Zoom In")) self.button_zoom_out.setText(_translate("MainWindow", "Zoom Out")) self.button_show_passengers.setText(_translate("MainWindow", "Show Passengers")) self.button_edit_xml.setText("Edit Object XML") self.button_edit_base_xml.setText("Edit Base Object XML") self.label_model_name.setText(_translate("MainWindow", "TextLabel1")) self.label_object_id.setText(_translate("MainWindow", "TextLabel2")) self.label_position.setText(_translate("MainWindow", "TextLabel3")) self.label_4.setText(_translate("MainWindow", "TextLabel4")) self.label_5.setText(_translate("MainWindow", "TextLabel5")) self.file_menu.setTitle(_translate("MainWindow", "File")) self.visibility_menu.setTitle(_translate("MainWindow", "Visibility")) self.terrain_menu.setTitle("Terrain")
class DeckEditorMainWindow(QMainWindow): def __init__(self): super().__init__() self.setup_ui() self.stringfile = None self.reset_in_process = False path = get_default_path() if path is None: self.default_path = "" else: self.default_path = path self.deck_list.currentItemChanged.connect(self.action_listwidget_change_item) self.button_set_deck.pressed.connect(self.action_button_set_deck) self.deck_data = None def reset(self): self.reset_in_process = True self.deck_list.clearSelection() self.deck_list.clear() self.reset_in_process = False def action_button_set_deck(self): print("I was pressed") current = self.deck_list.currentItem() self.statusbar.clearMessage() if current is not None and self.deck_data is not None: try: leader, rank = self.lineedit_leader.text(), self.lineedit_leader_rank.text() deck_data = [] if rank.isnumeric(): rank = int(rank) else: self.statusbar.showMessage("Rank is not numeric") return if leader.isnumeric(): leaderdata = (int(leader) & 0xFFF) | ((rank & 0xF) << 12) else: match = match_partly(leader) if isinstance(match, tuple) and match[0] is None: self.statusbar.showMessage("No matching card found: '{0}'".format(leader)) return elif isinstance(match, tuple): index, card = match leaderdata = (int(index) & 0xFFF) | ((rank & 0xF) << 12) else: if len(match) > 5: self.statusbar.showMessage("Too many matches found ({0} matches)".format(len(match))) else: self.statusbar.showMessage("More than 1 match found: {0}".format( ", ".join("{0} ({1})".format(x[1], x[0]) for x in match))) return deck_data.append(leaderdata) cards = [] for i in range(40): textedit, indexlabel, cardname = self.card_slots[i][0:3] card = textedit.text() if card.isnumeric(): card = int(card) & 0xFFF deck_data.append(card) else: match = match_partly(card) if isinstance(match, tuple) and match[0] is None: self.statusbar.showMessage("No matching card found: '{0}'".format(card)) return elif isinstance(match, tuple): index, card = match deck_data.append(index) else: if len(match) > 5: self.statusbar.showMessage("Too many matches found ({0} matches)".format(len(match))) else: self.statusbar.showMessage("More than 1 match found: {0}".format( ", ".join("{0} ({1})".format(x[1], x[0]) for x in match))) return if current.is_starter: current.setText("[Starter] {0:>7} [rank:{1:>2}] {2}".format(leaderdata&0xFFF, rank, get_name(leaderdata & 0xFFF))) else: current.setText("[CPU] {0:>7} [rank:{1:>2}] {2}".format(leaderdata&0xFFF, rank, get_name(leaderdata & 0xFFF))) self.leader_label.setText(get_name(leaderdata & 0xFFF)) self.lineedit_leader.setText(str(leaderdata & 0xFFF)) print(len(deck_data)) for i in range(40): card = deck_data[1+i] textedit, indexlabel, cardname = self.card_slots[i][0:3] textedit.setText(str(card)) cardname.setText(get_name(card)) print(type(self.deck_data)) struct.pack_into("H"*41, self.deck_data, current.number*41*2, *deck_data) except: traceback.print_exc() def action_listwidget_change_item(self, current, previous): try: if current is not None: print(current, current.number, current.deck_offset) leader = struct.unpack_from("H", self.deck_data, current.number*41*2)[0] rank = leader >> 12 leader_card = leader & 0xFFF self.lineedit_leader.setText(str(leader_card)) self.lineedit_leader_rank.setText(str(rank)) self.leader_label.setText(get_name(leader_card)) for i in range(40): card = struct.unpack_from("H", self.deck_data, current.number*41*2 + 2 + i*2)[0] & 0xFFF textedit, indexlabel, cardname = self.card_slots[i][0:3] textedit.setText(str(card)) cardname.setText(get_name(card)) except: traceback.print_exc() raise def button_load_decks(self): try: print("ok", self.default_path) self.xmlPath = "" filepath, choosentype = QFileDialog.getOpenFileName( self, "Open File", self.default_path, "PS2 iso (*.iso);;All files (*)") print("doooone") if filepath: print("resetting") self.reset() print("done") with open(filepath, "rb") as f: try: f.seek(STARTER_DECK_OFFSET) self.deck_data = bytearray(f.read(17*41*2)) # 17 starter decks, each 41 bytes f.seek(CPU_DECK_OFFSET) self.deck_data += f.read(24*41*2) # 24 CPU decks self.default_path = filepath for i in range(17): leader_byte1, leader_byte2 = struct.unpack_from("BB", self.deck_data, i*41*2) rank = leader_byte2 >> 4 leader = ((leader_byte2 & 0x0F) << 8) + leader_byte1 deck = YugiohDeckEntry(starter=True, number=i, offset=STARTER_DECK_OFFSET+i*41*2) cardname = get_name(leader) deck.setText("[Starter] {0:>7} [rank:{1:>2}] {2}".format(leader, rank, cardname)) self.deck_list.addItem(deck) for i in range(17, 17+24): leader_byte1, leader_byte2 = struct.unpack_from("BB", self.deck_data, i*41*2) rank = leader_byte2 >> 4 leader = ((leader_byte2 & 0x0F) << 8) + leader_byte1 deck = YugiohDeckEntry(starter=False, number=i, offset=CPU_DECK_OFFSET +i*41*2 ) cardname = get_name(leader) deck.setText("[CPU] {0:>7} [rank:{1:>1}] {2}".format(leader, rank,cardname)) self.deck_list.addItem(deck) print("loaded decks") except Exception as error: print("error", error) except Exception as er: print("errrorrr", error) traceback.print_exc() print("loaded") def button_save_decks(self): if self.deck_data is not None: filepath, choosentype = QFileDialog.getSaveFileName( self, "Save File", self.default_path, "PS2 iso (*.iso);;All files (*)") print(filepath, "saved") if filepath: with open(filepath, "r+b") as f: f.seek(STARTER_DECK_OFFSET) f.write(self.deck_data[0:17*41*2]) f.seek(CPU_DECK_OFFSET) f.write(self.deck_data[17*41*2:17*41*2+24*41*2]) self.default_path = filepath set_default_path(filepath) else: pass # no level loaded, do nothing def setup_ui(self): self.setObjectName("MainWindow") self.resize(820, 760) self.setMinimumSize(QSize(720, 560)) self.setWindowTitle("Yugioh Duelist of Roses - Deck Edit") self.centralwidget = QWidget(self) self.centralwidget.setObjectName("centralwidget") self.setCentralWidget(self.centralwidget) self.horizontalLayout = QHBoxLayout(self.centralwidget) self.horizontalLayout.setObjectName("horizontalLayout") self.deck_list = QListWidget(self.centralwidget) self.horizontalLayout.addWidget(self.deck_list) self.vertLayoutWidget = QWidget(self.centralwidget) self.verticalLayout = QVBoxLayout(self.vertLayoutWidget) self.button_set_deck = QPushButton(self.centralwidget) self.button_set_deck.setText("Set Deck") self.leader_layoutwidget = QWidget(self.centralwidget) self.leader_layout = QHBoxLayout(self.leader_layoutwidget) self.leader_layoutwidget.setLayout(self.leader_layout) self.lineedit_leader = QLineEdit(self.centralwidget) self.leader_label = QLabel(self.centralwidget) self.leader_layout.addWidget(self.lineedit_leader) self.leader_layout.addWidget(self.leader_label) self.lineedit_leader_rank = QLineEdit(self.centralwidget) for widget in (self.button_set_deck, self.leader_layoutwidget, self.lineedit_leader_rank): self.verticalLayout.addWidget(widget) self.cards_scroll = QScrollArea(self.centralwidget) self.cards_scroll.setWidgetResizable(True) self.card_slots = [] self.cards_verticalWidget = QWidget(self.centralwidget) self.cards_vertical = QVBoxLayout(self.centralwidget) self.cards_verticalWidget.setLayout(self.cards_vertical) self.cards_scroll.setWidget(self.cards_verticalWidget) for i in range(40): layoutwidget = QWidget(self.centralwidget) layout = QHBoxLayout(layoutwidget) layoutwidget.setLayout(layout) index_text = QLabel(self.centralwidget) index_text.setText("{0:>2}".format(i)) textedit = QLineEdit(self.centralwidget) textedit.setMinimumSize(20, 20) textedit.setMaximumSize(100, 5000) card_name_text = QLabel(self.centralwidget) card_name_text.setText("---") card_name_text.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) layout.addWidget(index_text) layout.addWidget(textedit) layout.addWidget(card_name_text) self.card_slots.append((textedit, index_text, card_name_text, layout, layoutwidget)) self.cards_vertical.addWidget(layoutwidget) self.verticalLayout.addWidget(self.cards_scroll) self.horizontalLayout.addWidget(self.vertLayoutWidget) self.menubar = self.menuBar() self.file_menu = self.menubar.addMenu("File") self.file_menu.setObjectName("menuLoad") self.file_load_action = QAction("Load", self) self.file_load_action.triggered.connect(self.button_load_decks) self.file_menu.addAction(self.file_load_action) self.file_save_action = QAction("Save", self) self.file_save_action.triggered.connect(self.button_save_decks) self.file_menu.addAction(self.file_save_action) self.statusbar = QStatusBar(self) self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) print("done")