def testKeyEvent(self): widget = QLineEdit() key = Qt.Key_A eventFilter = KeyEventFilter(widget, QEvent.KeyPress, key) widget.installEventFilter(eventFilter) QTest.keyClick(widget, key) self.assert_(eventFilter.processed)
def __init__(self, parent=None): super(BlockingClient, self).__init__(parent) self.thread = FortuneThread() self.currentFortune = '' hostLabel = QLabel("&Server name:") portLabel = QLabel("S&erver port:") for ipAddress in QNetworkInterface.allAddresses(): if ipAddress != QHostAddress.LocalHost and ipAddress.toIPv4Address() != 0: break else: ipAddress = QHostAddress(QHostAddress.LocalHost) ipAddress = ipAddress.toString() self.hostLineEdit = QLineEdit(ipAddress) self.portLineEdit = QLineEdit() self.portLineEdit.setValidator(QIntValidator(1, 65535, self)) hostLabel.setBuddy(self.hostLineEdit) portLabel.setBuddy(self.portLineEdit) self.statusLabel = QLabel( "This example requires that you run the Fortune Server example as well.") self.statusLabel.setWordWrap(True) self.getFortuneButton = QPushButton("Get Fortune") self.getFortuneButton.setDefault(True) self.getFortuneButton.setEnabled(False) quitButton = QPushButton("Quit") buttonBox = QDialogButtonBox() buttonBox.addButton(self.getFortuneButton, QDialogButtonBox.ActionRole) buttonBox.addButton(quitButton, QDialogButtonBox.RejectRole) self.getFortuneButton.clicked.connect(self.requestNewFortune) quitButton.clicked.connect(self.close) self.hostLineEdit.textChanged.connect(self.enableGetFortuneButton) self.portLineEdit.textChanged.connect(self.enableGetFortuneButton) self.thread.newFortune.connect(self.showFortune) self.thread.error.connect(self.displayError) mainLayout = QGridLayout() mainLayout.addWidget(hostLabel, 0, 0) mainLayout.addWidget(self.hostLineEdit, 0, 1) mainLayout.addWidget(portLabel, 1, 0) mainLayout.addWidget(self.portLineEdit, 1, 1) mainLayout.addWidget(self.statusLabel, 2, 0, 1, 2) mainLayout.addWidget(buttonBox, 3, 0, 1, 2) self.setLayout(mainLayout) self.setWindowTitle("Blocking Fortune Client") self.portLineEdit.setFocus()
def __init__(self, parent=None): super(AddDialogWidget, self).__init__(parent) nameLabel = QLabel("Name") addressLabel = QLabel("Address") buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.nameText = QLineEdit() self.addressText = QTextEdit() grid = QGridLayout() grid.setColumnStretch(1, 2) grid.addWidget(nameLabel, 0, 0) grid.addWidget(self.nameText, 0, 1) grid.addWidget(addressLabel, 1, 0, Qt.AlignLeft | Qt.AlignTop) grid.addWidget(self.addressText, 1, 1, Qt.AlignLeft) layout = QVBoxLayout() layout.addLayout(grid) layout.addWidget(buttonBox) self.setLayout(layout) self.setWindowTitle("Add a Contact") buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject)
def __init__(self, parent=None): super(ColorEdit, self).__init__(parent) self.color = QColor('#FF00FF') self.edit = QLineEdit() self.edit.setText('FF00FF') self.edit.setMaximumWidth(70) self.edit.textEdited.connect(self.editChanged) self.edit.returnPressed.connect(self.editChanged) self.box = QPushButton() self.box.setFlat(True) self.box.setFixedSize(18, 18) self.box.setStyleSheet('background-color: #FF00FF; border: 1px solid black;') self.box.setCursor(Qt.PointingHandCursor) self.box.clicked.connect(self.boxClicked) hlayout = QHBoxLayout() hlayout.setContentsMargins(0, 0, 0, 0) hlayout.setSpacing(0) hlayout.addWidget(QLabel('#')) hlayout.addWidget(self.edit) hlayout.addSpacing(5) hlayout.addWidget(self.box) hlayout.addStretch() self.setLayout(hlayout)
def __init__(self): super(FindToolBar, self).__init__() self._line_edit = QLineEdit() self._line_edit.setClearButtonEnabled(True) self._line_edit.setPlaceholderText("Find...") self._line_edit.setMaximumWidth(300) self._line_edit.returnPressed.connect(self._find_next) self.addWidget(self._line_edit) self._previous_button = QToolButton() self._previous_button.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/up-32.png')) self._previous_button.clicked.connect(self._find_previous) self.addWidget(self._previous_button) self._next_button = QToolButton() self._next_button.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/down-32.png')) self._next_button.clicked.connect(self._find_next) self.addWidget(self._next_button) self._case_sensitive_checkbox = QCheckBox('Case Sensitive') self.addWidget(self._case_sensitive_checkbox) self._hideButton = QToolButton() self._hideButton.setShortcut(QKeySequence(Qt.Key_Escape)) self._hideButton.setIcon(QIcon(':/qt-project.org/styles/macstyle/images/closedock-16.png')) self._hideButton.clicked.connect(self.hide) self.addWidget(self._hideButton)
def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle('PySide2 WebEngineWidgets Example') self.toolBar = QToolBar() self.addToolBar(self.toolBar) self.backButton = QPushButton() self.backButton.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/left-32.png')) self.backButton.clicked.connect(self.back) self.toolBar.addWidget(self.backButton) self.forwardButton = QPushButton() self.forwardButton.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/right-32.png')) self.forwardButton.clicked.connect(self.forward) self.toolBar.addWidget(self.forwardButton) self.addressLineEdit = QLineEdit() self.addressLineEdit.returnPressed.connect(self.load) self.toolBar.addWidget(self.addressLineEdit) self.webEngineView = QWebEngineView() self.setCentralWidget(self.webEngineView) initialUrl = 'http://qt.io' self.addressLineEdit.setText(initialUrl) self.webEngineView.load(QUrl(initialUrl)) self.webEngineView.page().titleChanged.connect(self.setWindowTitle) self.webEngineView.page().urlChanged.connect(self.urlChanged)
class FindToolBar(QToolBar): find = QtCore.Signal(str, QWebEnginePage.FindFlags) def __init__(self): super(FindToolBar, self).__init__() self._line_edit = QLineEdit() self._line_edit.setClearButtonEnabled(True) self._line_edit.setPlaceholderText("Find...") self._line_edit.setMaximumWidth(300) self._line_edit.returnPressed.connect(self._find_next) self.addWidget(self._line_edit) self._previous_button = QToolButton() self._previous_button.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/up-32.png')) self._previous_button.clicked.connect(self._find_previous) self.addWidget(self._previous_button) self._next_button = QToolButton() self._next_button.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/down-32.png')) self._next_button.clicked.connect(self._find_next) self.addWidget(self._next_button) self._case_sensitive_checkbox = QCheckBox('Case Sensitive') self.addWidget(self._case_sensitive_checkbox) self._hideButton = QToolButton() self._hideButton.setShortcut(QKeySequence(Qt.Key_Escape)) self._hideButton.setIcon(QIcon(':/qt-project.org/styles/macstyle/images/closedock-16.png')) self._hideButton.clicked.connect(self.hide) self.addWidget(self._hideButton) def focus_find(self): self._line_edit.setFocus() def _emit_find(self, backward): needle = self._line_edit.text().strip() if needle: flags = QWebEnginePage.FindFlags() if self._case_sensitive_checkbox.isChecked(): flags |= QWebEnginePage.FindCaseSensitively if backward: flags |= QWebEnginePage.FindBackward self.find.emit(needle, flags) def _find_next(self): self._emit_find(False) def _find_previous(self): self._emit_find(True)
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle('PySide2 WebEngineWidgets Example') self.toolBar = QToolBar() self.addToolBar(self.toolBar) self.backButton = QPushButton() self.backButton.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/left-32.png')) self.backButton.clicked.connect(self.back) self.toolBar.addWidget(self.backButton) self.forwardButton = QPushButton() self.forwardButton.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/right-32.png')) self.forwardButton.clicked.connect(self.forward) self.toolBar.addWidget(self.forwardButton) self.addressLineEdit = QLineEdit() self.addressLineEdit.returnPressed.connect(self.load) self.toolBar.addWidget(self.addressLineEdit) self.webEngineView = QWebEngineView() self.setCentralWidget(self.webEngineView) initialUrl = 'http://qt.io' self.addressLineEdit.setText(initialUrl) self.webEngineView.load(QUrl(initialUrl)) self.webEngineView.page().titleChanged.connect(self.setWindowTitle) self.webEngineView.page().urlChanged.connect(self.urlChanged) def load(self): url = QUrl.fromUserInput(self.addressLineEdit.text()) if url.isValid(): self.webEngineView.load(url) def back(self): self.webEngineView.page().triggerAction(QWebEnginePage.Back) def forward(self): self.webEngineView.page().triggerAction(QWebEnginePage.Forward) def urlChanged(self, url): self.addressLineEdit.setText(url.toString())
class ClusterDialog(QDialog): editClusterName = None def __init__(self, lifeline, defaultName, parent = None): super(ClusterDialog, self).__init__(parent) self.lifeline = lifeline layout = QVBoxLayout(self) message = QLabel('Enter group name') layout.addWidget(message) self.editClusterName = QLineEdit(defaultName) self.editClusterName.setFixedHeight(30) self.editClusterName.setFixedWidth(400) self.editClusterName.textChanged.connect(self.validateCluster) layout.addWidget(self.editClusterName) self.validation_msg = QLabel(' ') layout.addWidget(self.validation_msg) buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, QtCore.Qt.Horizontal, self) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) layout.addWidget(buttons) self.validateCluster() def validateCluster(self): cnt = 0 for l in self.lifeline: if self.editClusterName.text() in l.getClassName() and not l.getFlagCluster() and not l.getClusterLifeline(): cnt += 1 available_flag = True for l in self.lifeline: if self.editClusterName.text() in l.getClassName() and l.getFlagCluster(): available_flag = False break if available_flag: self.validation_msg.setText("group name includes %d life-lines" % (cnt)) else: self.validation_msg.setText("group name is not available") def getClusterText(self): return self.editClusterName.text() @staticmethod def getClusterName(lifelines, defaultName, parent = None): dialog = ClusterDialog(lifelines,defaultName,parent) result = dialog.exec_() return (result, dialog.getClusterText())
def __init__(self, parent = None): super(Form, self).__init__(parent) self.setWindowTitle('My Form') self.edit = QLineEdit('Write your name here...') self.button = QPushButton('Show Greetings') layout = QVBoxLayout() layout.addWidget(self.edit) layout.addWidget(self.button) self.setLayout(layout) self.button.clicked.connect(self.greetings)
class ColorEdit(QWidget): def __init__(self, parent=None): super(ColorEdit, self).__init__(parent) self.color = QColor('#FF00FF') self.edit = QLineEdit() self.edit.setText('FF00FF') self.edit.setMaximumWidth(70) self.edit.textEdited.connect(self.editChanged) self.edit.returnPressed.connect(self.editChanged) self.box = QPushButton() self.box.setFlat(True) self.box.setFixedSize(18, 18) self.box.setStyleSheet('background-color: #FF00FF; border: 1px solid black;') self.box.setCursor(Qt.PointingHandCursor) self.box.clicked.connect(self.boxClicked) hlayout = QHBoxLayout() hlayout.setContentsMargins(0, 0, 0, 0) hlayout.setSpacing(0) hlayout.addWidget(QLabel('#')) hlayout.addWidget(self.edit) hlayout.addSpacing(5) hlayout.addWidget(self.box) hlayout.addStretch() self.setLayout(hlayout) def editChanged(self): self.setColorText(self.edit.text()) def boxClicked(self): dialog = QColorDialog() if dialog.exec_(): self.setColorText(dialog.selectedColor().name()) def setColorText(self, text): text = str(text).upper().replace('#', '') color = QColor('#' + text) if not color.isValid(): return self.box.setStyleSheet('background-color: #' + text + '; border: 1px solid black;') self.edit.setText(text) self.color = color return True def getColor(self): return self.color
def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle('PySide2 tabbed browser Example') self._tab_widget = BrowserTabWidget(create_main_window_with_browser) self._tab_widget.enabled_changed.connect(self._enabled_changed) self._tab_widget.download_requested.connect(self._download_requested) self.setCentralWidget(self._tab_widget) self.connect(self._tab_widget, QtCore.SIGNAL("url_changed(QUrl)"), self.url_changed) self._bookmark_dock = QDockWidget() self._bookmark_dock.setWindowTitle('Bookmarks') self._bookmark_widget = BookmarkWidget() self._bookmark_widget.open_bookmark.connect(self.load_url) self._bookmark_widget.open_bookmark_in_new_tab.connect(self.load_url_in_new_tab) self._bookmark_dock.setWidget(self._bookmark_widget) self.addDockWidget(Qt.LeftDockWidgetArea, self._bookmark_dock) self._find_tool_bar = None self._actions = {} self._create_menu() self._tool_bar = QToolBar() self.addToolBar(self._tool_bar) for action in self._actions.values(): if not action.icon().isNull(): self._tool_bar.addAction(action) self._addres_line_edit = QLineEdit() self._addres_line_edit.setClearButtonEnabled(True) self._addres_line_edit.returnPressed.connect(self.load) self._tool_bar.addWidget(self._addres_line_edit) self._zoom_label = QLabel() self.statusBar().addPermanentWidget(self._zoom_label) self._update_zoom_label() self._bookmarksToolBar = QToolBar() self.addToolBar(Qt.TopToolBarArea, self._bookmarksToolBar) self.insertToolBarBreak(self._bookmarksToolBar) self._bookmark_widget.changed.connect(self._update_bookmarks) self._update_bookmarks()
class Form(QDialog): def __init__(self, parent = None): super(Form, self).__init__(parent) self.setWindowTitle('My Form') self.edit = QLineEdit('Write your name here...') self.button = QPushButton('Show Greetings') layout = QVBoxLayout() layout.addWidget(self.edit) layout.addWidget(self.button) self.setLayout(layout) self.button.clicked.connect(self.greetings) @Slot() def greetings(self): print('hellow {}'.format(self.edit.text()))
class AddDialogWidget(QDialog): """ A dialog to add a new address to the addressbook. """ def __init__(self, parent=None): super(AddDialogWidget, self).__init__(parent) nameLabel = QLabel("Name") addressLabel = QLabel("Address") buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.nameText = QLineEdit() self.addressText = QTextEdit() grid = QGridLayout() grid.setColumnStretch(1, 2) grid.addWidget(nameLabel, 0, 0) grid.addWidget(self.nameText, 0, 1) grid.addWidget(addressLabel, 1, 0, Qt.AlignLeft | Qt.AlignTop) grid.addWidget(self.addressText, 1, 1, Qt.AlignLeft) layout = QVBoxLayout() layout.addLayout(grid) layout.addWidget(buttonBox) self.setLayout(layout) self.setWindowTitle("Add a Contact") buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) # These properties make using this dialog a little cleaner. It's much # nicer to type "addDialog.address" to retrieve the address as compared # to "addDialog.addressText.toPlainText()" @property def name(self): return self.nameText.text() @property def address(self): return self.addressText.toPlainText()
def __init__(self, lifeline, defaultName, parent = None): super(ClusterDialog, self).__init__(parent) self.lifeline = lifeline layout = QVBoxLayout(self) message = QLabel('Enter group name') layout.addWidget(message) self.editClusterName = QLineEdit(defaultName) self.editClusterName.setFixedHeight(30) self.editClusterName.setFixedWidth(400) self.editClusterName.textChanged.connect(self.validateCluster) layout.addWidget(self.editClusterName) self.validation_msg = QLabel(' ') layout.addWidget(self.validation_msg) buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, QtCore.Qt.Horizontal, self) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) layout.addWidget(buttons) self.validateCluster()
class BlockingClient(QWidget): def __init__(self, parent=None): super(BlockingClient, self).__init__(parent) self.thread = FortuneThread() self.currentFortune = '' hostLabel = QLabel("&Server name:") portLabel = QLabel("S&erver port:") for ipAddress in QNetworkInterface.allAddresses(): if ipAddress != QHostAddress.LocalHost and ipAddress.toIPv4Address() != 0: break else: ipAddress = QHostAddress(QHostAddress.LocalHost) ipAddress = ipAddress.toString() self.hostLineEdit = QLineEdit(ipAddress) self.portLineEdit = QLineEdit() self.portLineEdit.setValidator(QIntValidator(1, 65535, self)) hostLabel.setBuddy(self.hostLineEdit) portLabel.setBuddy(self.portLineEdit) self.statusLabel = QLabel( "This example requires that you run the Fortune Server example as well.") self.statusLabel.setWordWrap(True) self.getFortuneButton = QPushButton("Get Fortune") self.getFortuneButton.setDefault(True) self.getFortuneButton.setEnabled(False) quitButton = QPushButton("Quit") buttonBox = QDialogButtonBox() buttonBox.addButton(self.getFortuneButton, QDialogButtonBox.ActionRole) buttonBox.addButton(quitButton, QDialogButtonBox.RejectRole) self.getFortuneButton.clicked.connect(self.requestNewFortune) quitButton.clicked.connect(self.close) self.hostLineEdit.textChanged.connect(self.enableGetFortuneButton) self.portLineEdit.textChanged.connect(self.enableGetFortuneButton) self.thread.newFortune.connect(self.showFortune) self.thread.error.connect(self.displayError) mainLayout = QGridLayout() mainLayout.addWidget(hostLabel, 0, 0) mainLayout.addWidget(self.hostLineEdit, 0, 1) mainLayout.addWidget(portLabel, 1, 0) mainLayout.addWidget(self.portLineEdit, 1, 1) mainLayout.addWidget(self.statusLabel, 2, 0, 1, 2) mainLayout.addWidget(buttonBox, 3, 0, 1, 2) self.setLayout(mainLayout) self.setWindowTitle("Blocking Fortune Client") self.portLineEdit.setFocus() def requestNewFortune(self): self.getFortuneButton.setEnabled(False) self.thread.requestNewFortune(self.hostLineEdit.text(), int(self.portLineEdit.text())) def showFortune(self, nextFortune): if nextFortune == self.currentFortune: self.requestNewFortune() return self.currentFortune = nextFortune self.statusLabel.setText(self.currentFortune) self.getFortuneButton.setEnabled(True) def displayError(self, socketError, message): if socketError == QAbstractSocket.HostNotFoundError: QMessageBox.information(self, "Blocking Fortune Client", "The host was not found. Please check the host and port " "settings.") elif socketError == QAbstractSocket.ConnectionRefusedError: QMessageBox.information(self, "Blocking Fortune Client", "The connection was refused by the peer. Make sure the " "fortune server is running, and check that the host name " "and port settings are correct.") else: QMessageBox.information(self, "Blocking Fortune Client", "The following error occurred: %s." % message) self.getFortuneButton.setEnabled(True) def enableGetFortuneButton(self): self.getFortuneButton.setEnabled(self.hostLineEdit.text() != '' and self.portLineEdit.text() != '')
class AuthorStatsPlots(PBDialog): """Class that constructs a window to show the results of `authorStats` """ def __init__(self, figs, title=None, parent=None): """Constructor. Parameters: figs: the list of figures title (optional): the window title parent (default None): the parent object, which should have a property `lastAuthorStats` """ super(AuthorStatsPlots, self).__init__(parent) self.figs = figs self.canvas = None if title is not None: self.setWindowTitle(title) layout = QGridLayout(self) layout.setSpacing(1) self.setLayout(layout) self.updatePlots() nlines = int(len(figs) / 2) self.layout().addWidget(PBLabel(igstr.linesMoreInfo), nlines + 1, 0) try: hIndex = "%d" % self.parent().lastAuthorStats["h"] except (TypeError, AttributeError): hIndex = igstr.hIndexE self.hIndex = PBLabel(igstr.hIndexV % hIndex) largerFont = QFont("Times", 15, QFont.Bold) self.hIndex.setFont(largerFont) self.layout().addWidget(self.hIndex, nlines + 1, 1) self.textBox = QLineEdit("") self.textBox.setReadOnly(True) self.layout().addWidget(self.textBox, nlines + 2, 0, 1, 2) self.saveButton = QPushButton(igstr.save, self) self.saveButton.clicked.connect(self.saveAction) self.layout().addWidget(self.saveButton, nlines + 3, 0) self.clButton = QPushButton(igstr.close, self) self.clButton.clicked.connect(self.onClose) self.clButton.setAutoDefault(True) self.layout().addWidget(self.clButton, nlines + 3, 1) def onClose(self): """Close dialog""" QDialog.close(self) def saveAction(self): """Save the plot into a file, after asking the directory where to save them """ savePath = askDirName(self, igstr.whereSavePlots) if savePath != "": try: self.parent().lastAuthorStats["figs"] = pBStats.plotStats( author=True, save=True, path=savePath) except AttributeError: pBGUILogger.warning("", exc_info=True) else: infoMessage(igstr.plotsSaved) self.saveButton.setDisabled(True) def onPress(self, event): """Print the plot coordinates where a click was performed. To be connected through `mpl_connect`. Used for testing. Parameter: a `matplotlib.backend_bases.Event` """ print(event.xdata, event.ydata) def pickEvent(self, event): """Save into `self.textBox` the coordinates of the clicked object (`Line2D` or `Rectangle`) in the plot. Parameter: a `matplotlib.backend_bases.Event` """ ob = event.artist ix = -1 for i, f in enumerate(self.figs): if f == ob.figure: ix = i if isinstance(ob, Rectangle): self.textBox.setText( igstr.xInYearIs % (figTitles[ix], int(ob.get_x()), int(ob.get_height()))) elif isinstance(ob, Line2D): xdata = ob.get_xdata() ydata = ob.get_ydata() ind = event.ind if ix == 4: formatString = igstr.xInDateIsF else: formatString = igstr.xInDateIsD self.textBox.setText(formatString % ( figTitles[ix], np.take(xdata, ind)[0].strftime(igstr.datefmt), np.take(ydata, ind)[0], )) def updatePlots(self): """Reset the dialog window removing all the previous items and create new canvas for the figures. """ i = 0 while True: item = self.layout().takeAt(i) if item is None: break del item if hasattr(self, "canvas"): del self.canvas self.canvas = [] for fig in self.figs: if fig is not None: self.canvas.append(FigureCanvas(fig)) self.layout().addWidget(self.canvas[-1], int(i / 2), i % 2) self.canvas[-1].mpl_connect("pick_event", self.pickEvent) self.canvas[-1].draw() i += 1
class MessagePropertyEditor(QWidget, PropertyWidget): def __init__(self, target_property_name): QWidget.__init__(self) PropertyWidget.__init__(self, target_property_name) layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) self.key_editor = QLineEdit() self.value_editor = QLineEdit() layout.addWidget(self.key_editor) layout.addWidget(self.value_editor) self.setLayout(layout) self.key_editor.textChanged.connect(self._on_key_edit) self.value_editor.editingFinished.connect(self._on_value_edit) def _on_key_edit(self, text): if self.target: target_prop = self.target[self.target_property_name] target_prop.update_key(text) self.value_editor.setText(target_prop.value) def _on_value_edit(self): if self.target: target_prop = self.target[self.target_property_name] target_prop.value = self.value_editor.text() def _on_target_changed(self): if self.target: target_prop = self.target[self.target_property_name] self.key_editor.setText(target_prop.key) self.value_editor.setText(target_prop.value) else: self.key_editor.setText("") self.value_editor.setText("")
class MainWindow(QMainWindow): """Provides the parent window that includes the BookmarkWidget, BrowserTabWidget, and a DownloadWidget, to offer the complete web browsing experience.""" def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle('PySide2 tabbed browser Example') self._tab_widget = BrowserTabWidget(create_main_window_with_browser) self._tab_widget.enabled_changed.connect(self._enabled_changed) self._tab_widget.download_requested.connect(self._download_requested) self.setCentralWidget(self._tab_widget) self.connect(self._tab_widget, QtCore.SIGNAL("url_changed(QUrl)"), self.url_changed) self._bookmark_dock = QDockWidget() self._bookmark_dock.setWindowTitle('Bookmarks') self._bookmark_widget = BookmarkWidget() self._bookmark_widget.open_bookmark.connect(self.load_url) self._bookmark_widget.open_bookmark_in_new_tab.connect( self.load_url_in_new_tab) self._bookmark_dock.setWidget(self._bookmark_widget) self.addDockWidget(Qt.LeftDockWidgetArea, self._bookmark_dock) self._find_tool_bar = None self._actions = {} self._create_menu() self._tool_bar = QToolBar() self.addToolBar(self._tool_bar) for action in self._actions.values(): if not action.icon().isNull(): self._tool_bar.addAction(action) self._addres_line_edit = QLineEdit() self._addres_line_edit.setClearButtonEnabled(True) self._addres_line_edit.returnPressed.connect(self.load) self._tool_bar.addWidget(self._addres_line_edit) self._zoom_label = QLabel() self.statusBar().addPermanentWidget(self._zoom_label) self._update_zoom_label() self._bookmarksToolBar = QToolBar() self.addToolBar(Qt.TopToolBarArea, self._bookmarksToolBar) self.insertToolBarBreak(self._bookmarksToolBar) self._bookmark_widget.changed.connect(self._update_bookmarks) self._update_bookmarks() def _update_bookmarks(self): self._bookmark_widget.populate_tool_bar(self._bookmarksToolBar) self._bookmark_widget.populate_other(self._bookmark_menu, 3) def _create_menu(self): file_menu = self.menuBar().addMenu("&File") exit_action = QAction(QIcon.fromTheme("application-exit"), "E&xit", self, shortcut="Ctrl+Q", triggered=qApp.quit) file_menu.addAction(exit_action) navigation_menu = self.menuBar().addMenu("&Navigation") style_icons = ':/qt-project.org/styles/commonstyle/images/' back_action = QAction(QIcon.fromTheme( "go-previous", QIcon(style_icons + 'left-32.png')), "Back", self, shortcut=QKeySequence(QKeySequence.Back), triggered=self._tab_widget.back) self._actions[QWebEnginePage.Back] = back_action back_action.setEnabled(False) navigation_menu.addAction(back_action) forward_action = QAction(QIcon.fromTheme( "go-next", QIcon(style_icons + 'right-32.png')), "Forward", self, shortcut=QKeySequence(QKeySequence.Forward), triggered=self._tab_widget.forward) forward_action.setEnabled(False) self._actions[QWebEnginePage.Forward] = forward_action navigation_menu.addAction(forward_action) reload_action = QAction(QIcon(style_icons + 'refresh-32.png'), "Reload", self, shortcut=QKeySequence(QKeySequence.Refresh), triggered=self._tab_widget.reload) self._actions[QWebEnginePage.Reload] = reload_action reload_action.setEnabled(False) navigation_menu.addAction(reload_action) navigation_menu.addSeparator() new_tab_action = QAction("New Tab", self, shortcut='Ctrl+T', triggered=self.add_browser_tab) navigation_menu.addAction(new_tab_action) close_tab_action = QAction("Close Current Tab", self, shortcut="Ctrl+W", triggered=self._close_current_tab) navigation_menu.addAction(close_tab_action) navigation_menu.addSeparator() history_action = QAction("History...", self, triggered=self._tab_widget.show_history) navigation_menu.addAction(history_action) edit_menu = self.menuBar().addMenu("&Edit") find_action = QAction("Find", self, shortcut=QKeySequence(QKeySequence.Find), triggered=self._show_find) edit_menu.addAction(find_action) edit_menu.addSeparator() undo_action = QAction("Undo", self, shortcut=QKeySequence(QKeySequence.Undo), triggered=self._tab_widget.undo) self._actions[QWebEnginePage.Undo] = undo_action undo_action.setEnabled(False) edit_menu.addAction(undo_action) redo_action = QAction("Redo", self, shortcut=QKeySequence(QKeySequence.Redo), triggered=self._tab_widget.redo) self._actions[QWebEnginePage.Redo] = redo_action redo_action.setEnabled(False) edit_menu.addAction(redo_action) edit_menu.addSeparator() cut_action = QAction("Cut", self, shortcut=QKeySequence(QKeySequence.Cut), triggered=self._tab_widget.cut) self._actions[QWebEnginePage.Cut] = cut_action cut_action.setEnabled(False) edit_menu.addAction(cut_action) copy_action = QAction("Copy", self, shortcut=QKeySequence(QKeySequence.Copy), triggered=self._tab_widget.copy) self._actions[QWebEnginePage.Copy] = copy_action copy_action.setEnabled(False) edit_menu.addAction(copy_action) paste_action = QAction("Paste", self, shortcut=QKeySequence(QKeySequence.Paste), triggered=self._tab_widget.paste) self._actions[QWebEnginePage.Paste] = paste_action paste_action.setEnabled(False) edit_menu.addAction(paste_action) edit_menu.addSeparator() select_all_action = QAction("Select All", self, shortcut=QKeySequence( QKeySequence.SelectAll), triggered=self._tab_widget.select_all) self._actions[QWebEnginePage.SelectAll] = select_all_action select_all_action.setEnabled(False) edit_menu.addAction(select_all_action) self._bookmark_menu = self.menuBar().addMenu("&Bookmarks") add_bookmark_action = QAction("&Add Bookmark", self, triggered=self._add_bookmark) self._bookmark_menu.addAction(add_bookmark_action) add_tool_bar_bookmark_action = QAction( "&Add Bookmark to Tool Bar", self, triggered=self._add_tool_bar_bookmark) self._bookmark_menu.addAction(add_tool_bar_bookmark_action) self._bookmark_menu.addSeparator() tools_menu = self.menuBar().addMenu("&Tools") download_action = QAction( "Open Downloads", self, triggered=DownloadWidget.open_download_directory) tools_menu.addAction(download_action) window_menu = self.menuBar().addMenu("&Window") window_menu.addAction(self._bookmark_dock.toggleViewAction()) window_menu.addSeparator() zoom_in_action = QAction(QIcon.fromTheme("zoom-in"), "Zoom In", self, shortcut=QKeySequence(QKeySequence.ZoomIn), triggered=self._zoom_in) window_menu.addAction(zoom_in_action) zoom_out_action = QAction(QIcon.fromTheme("zoom-out"), "Zoom Out", self, shortcut=QKeySequence(QKeySequence.ZoomOut), triggered=self._zoom_out) window_menu.addAction(zoom_out_action) reset_zoom_action = QAction(QIcon.fromTheme("zoom-original"), "Reset Zoom", self, shortcut="Ctrl+0", triggered=self._reset_zoom) window_menu.addAction(reset_zoom_action) about_menu = self.menuBar().addMenu("&About") about_action = QAction("About Qt", self, shortcut=QKeySequence( QKeySequence.HelpContents), triggered=qApp.aboutQt) about_menu.addAction(about_action) def add_browser_tab(self): return self._tab_widget.add_browser_tab() def _close_current_tab(self): if self._tab_widget.count() > 1: self._tab_widget.close_current_tab() else: self.close() def close_event(self, event): main_windows.remove(self) event.accept() def load(self): url_string = self._addres_line_edit.text().strip() if url_string: self.load_url_string(url_string) def load_url_string(self, url_s): url = QUrl.fromUserInput(url_s) if (url.isValid()): self.load_url(url) def load_url(self, url): self._tab_widget.load(url) def load_url_in_new_tab(self, url): self.add_browser_tab().load(url) def url_changed(self, url): self._addres_line_edit.setText(url.toString()) def _enabled_changed(self, web_action, enabled): action = self._actions[web_action] if action: action.setEnabled(enabled) def _add_bookmark(self): index = self._tab_widget.currentIndex() if index >= 0: url = self._tab_widget.url() title = self._tab_widget.tabText(index) icon = self._tab_widget.tabIcon(index) self._bookmark_widget.add_bookmark(url, title, icon) def _add_tool_bar_bookmark(self): index = self._tab_widget.currentIndex() if index >= 0: url = self._tab_widget.url() title = self._tab_widget.tabText(index) icon = self._tab_widget.tabIcon(index) self._bookmark_widget.add_tool_bar_bookmark(url, title, icon) def _zoom_in(self): new_zoom = self._tab_widget.zoom_factor() * 1.5 if (new_zoom <= WebEngineView.maximum_zoom_factor()): self._tab_widget.set_zoom_factor(new_zoom) self._update_zoom_label() def _zoom_out(self): new_zoom = self._tab_widget.zoom_factor() / 1.5 if (new_zoom >= WebEngineView.minimum_zoom_factor()): self._tab_widget.set_zoom_factor(new_zoom) self._update_zoom_label() def _reset_zoom(self): self._tab_widget.set_zoom_factor(1) self._update_zoom_label() def _update_zoom_label(self): percent = int(self._tab_widget.zoom_factor() * 100) self._zoom_label.setText("{}%".format(percent)) def _download_requested(self, item): # Remove old downloads before opening a new one for old_download in self.statusBar().children(): if type(old_download).__name__ == 'download_widget' and \ old_download.state() != QWebEngineDownloadItem.DownloadInProgress: self.statusBar().removeWidget(old_download) del old_download item.accept() download_widget = download_widget(item) download_widget.removeRequested.connect( self._remove_download_requested, Qt.QueuedConnection) self.statusBar().addWidget(download_widget) def _remove_download_requested(self): download_widget = self.sender() self.statusBar().removeWidget(download_widget) del download_widget def _show_find(self): if self._find_tool_bar is None: self._find_tool_bar = FindToolBar() self._find_tool_bar.find.connect(self._tab_widget.find) self.addToolBar(Qt.BottomToolBarArea, self._find_tool_bar) else: self._find_tool_bar.show() self._find_tool_bar.focus_find() def write_bookmarks(self): self._bookmark_widget.write_bookmarks()
class SubtitleInfoDialog(QDialog): def __init__(self, subtitles_name, subtitles_delay, subtitles_language, subtitles_track_name, subtitles_set_default, subtitles_set_forced, subtitles_default_value_delay, subtitles_default_value_language, subtitles_default_value_track_name, subtitles_default_value_set_default, subtitles_default_value_set_forced, subtitle_set_default_disabled=False, subtitle_set_forced_disabled=False, disable_edit=False, parent=None): super().__init__(parent) self.window_title = "Subtitle Info" self.state = "no" self.subtitles_count = len(subtitles_delay) self.messageIcon = QLabel() self.subtitle_tab_comboBox = InfoCellDialogTabComboBox( hint="Subtitles Groups") for i in range(self.subtitles_count): self.subtitle_tab_comboBox.addItem("Subtitle #" + str(i + 1)) self.subtitle_tab_comboBox.setCurrentIndex(0) self.subtitle_tab_comboBox.currentIndexChanged.connect( self.update_current_subtitle_index) self.current_subtitle_index = 0 self.disable_edit = disable_edit self.current_subtitle_name = subtitles_name self.current_subtitle_language = subtitles_language self.current_subtitle_delay = subtitles_delay self.current_subtitle_track_name = subtitles_track_name self.current_subtitle_set_default = subtitles_set_default self.current_subtitle_set_forced = subtitles_set_forced self.default_subtitle_language = subtitles_default_value_language self.default_subtitle_delay = subtitles_default_value_delay self.default_subtitle_track_name = subtitles_default_value_track_name self.default_subtitle_set_default = subtitles_default_value_set_default self.default_subtitle_set_forced = subtitles_default_value_set_forced self.subtitle_set_default_disabled = subtitle_set_default_disabled self.subtitle_set_forced_disabled = subtitle_set_forced_disabled self.subtitle_name_label = QLabel("Subtitle Name:") self.subtitle_name_value = QLabel( str(self.current_subtitle_name[self.current_subtitle_index])) width_to_be_fixed = 0 for i in range(len(self.current_subtitle_name)): width_to_be_fixed = max( width_to_be_fixed, self.subtitle_name_value.fontMetrics().boundingRect( self.current_subtitle_name[i]).width()) self.subtitle_name_value.setFixedWidth(width_to_be_fixed + 10) self.subtitle_delay_label = QLabel("Subtitle Delay:") self.subtitle_delay_spin = QDoubleSpinBox() self.setup_subtitle_delay_spin() self.subtitle_language_label = QLabel("Subtitle Language:") self.subtitle_language_comboBox = QComboBox() self.setup_subtitle_language_comboBox() self.subtitle_track_name_label = QLabel("Subtitle Track Name:") self.subtitle_track_name_lineEdit = QLineEdit() self.setup_subtitle_track_name_lineEdit() self.subtitle_set_forced_label = QLabel("Subtitle Forced State:") self.subtitle_set_forced_checkBox = QCheckBox() self.setup_subtitle_set_forced_checkBox() self.subtitle_set_default_label = QLabel("Subtitle Default State:") self.subtitle_set_default_checkBox = QCheckBox() self.setup_subtitle_set_default_checkBox() self.yes_button = QPushButton("OK") self.no_button = QPushButton("Cancel") self.reset_button = QPushButton("Reset To Default") self.buttons_layout = QHBoxLayout() self.subtitle_delay_layout = QHBoxLayout() self.subtitle_language_layout = QHBoxLayout() self.subtitle_track_name_layout = QHBoxLayout() self.subtitle_set_default_layout = QHBoxLayout() self.subtitle_set_forced_layout = QHBoxLayout() self.buttons_layout.addWidget(QLabel(""), stretch=3) self.buttons_layout.addWidget(self.reset_button, stretch=2) self.buttons_layout.addWidget(self.yes_button, stretch=2) self.buttons_layout.addWidget(self.no_button, stretch=2) self.buttons_layout.addWidget(QLabel(""), stretch=3) self.subtitle_setting_layout = QGridLayout() self.subtitle_editable_setting_layout = QFormLayout() self.subtitle_editable_setting_layout.addRow(self.subtitle_name_label, self.subtitle_name_value) self.subtitle_editable_setting_layout.addRow( self.subtitle_track_name_label, self.subtitle_track_name_lineEdit) self.subtitle_editable_setting_layout.addRow( self.subtitle_language_label, self.subtitle_language_comboBox) self.subtitle_editable_setting_layout.addRow(self.subtitle_delay_label, self.subtitle_delay_spin) self.subtitle_editable_setting_layout.addRow( self.subtitle_set_default_label, self.subtitle_set_default_checkBox) self.subtitle_editable_setting_layout.addRow( self.subtitle_set_forced_label, self.subtitle_set_forced_checkBox) self.subtitle_setting_layout.addWidget(self.subtitle_tab_comboBox, 0, 0) self.subtitle_setting_layout.addLayout( self.subtitle_editable_setting_layout, 1, 0, 5, 2) self.subtitle_setting_layout.addWidget(self.messageIcon, 1, 3, 5, -1) self.main_layout = QGridLayout() self.main_layout.addLayout(self.subtitle_setting_layout, 0, 0, 2, 3) self.main_layout.addLayout(self.buttons_layout, 2, 0, 1, -1) self.main_layout.setContentsMargins(20, 20, 20, 20) self.setLayout(self.main_layout) self.setup_ui() self.signal_connect() def setup_ui(self): self.disable_question_mark_window() self.messageIcon.setPixmap( QtGui.QPixmap(GlobalFiles.SubtitleIconPath).scaledToHeight(100)) self.set_dialog_values() self.set_default_buttons() if self.subtitle_set_default_disabled: self.subtitle_set_default_disable() if self.subtitle_set_forced_disabled: self.subtitle_set_forced_disable() if self.disable_edit: self.subtitle_track_name_lineEdit.setEnabled(False) self.subtitle_language_comboBox.setEnabled(False) self.subtitle_delay_spin.setEnabled(False) self.subtitle_set_default_checkBox.setEnabled(False) self.subtitle_set_forced_checkBox.setEnabled(False) self.reset_button.setEnabled(False) self.setup_tool_tip_hint_subtitle_set_default() self.setup_tool_tip_hint_subtitle_set_forced() def signal_connect(self): self.subtitle_track_name_lineEdit.textEdited.connect( self.update_current_subtitle_track_name) self.subtitle_delay_spin.editingFinished.connect( self.update_current_subtitle_delay) self.subtitle_language_comboBox.currentTextChanged.connect( self.update_current_subtitle_language) self.subtitle_set_default_checkBox.stateChanged.connect( self.update_current_subtitle_set_default) self.subtitle_set_forced_checkBox.stateChanged.connect( self.update_current_subtitle_set_forced) self.yes_button.clicked.connect(self.click_yes) self.no_button.clicked.connect(self.click_no) self.reset_button.clicked.connect(self.reset_subtitle_setting) def click_yes(self): self.state = "yes" self.close() def click_no(self): self.state = "no" self.close() def set_dialog_values(self): self.setWindowTitle(self.window_title) self.setWindowIcon(GlobalFiles.InfoSettingIcon) def disable_question_mark_window(self): self.setWindowFlag(Qt.WindowContextHelpButtonHint, on=False) def increase_message_font_size(self, value): message_font = self.message.font() message_font.setPointSize(self.message.fontInfo().pointSize() + value) self.message.setFont(message_font) def set_default_buttons(self): self.yes_button.setDefault(True) self.yes_button.setFocus() def showEvent(self, a0: QtGui.QShowEvent) -> None: super().showEvent(a0) self.setFixedSize(self.size()) def setup_subtitle_track_name_lineEdit(self): self.subtitle_track_name_lineEdit.setClearButtonEnabled(True) self.subtitle_track_name_lineEdit.setText( self.current_subtitle_track_name[self.current_subtitle_index]) def setup_subtitle_language_comboBox(self): self.subtitle_language_comboBox.addItems(AllSubtitlesLanguages) self.subtitle_language_comboBox.setCurrentIndex( AllSubtitlesLanguages.index( self.current_subtitle_language[self.current_subtitle_index])) self.subtitle_language_comboBox.setMaxVisibleItems(8) self.subtitle_language_comboBox.setStyleSheet( "QComboBox { combobox-popup: 0; }") def setup_subtitle_delay_spin(self): # self.subtitle_delay_spin.setMaximumWidth(screen_size.width() // 16) self.subtitle_delay_spin.setDecimals(3) self.subtitle_delay_spin.setMinimum(-9999.0) self.subtitle_delay_spin.setMaximum(9999.0) self.subtitle_delay_spin.setSingleStep(0.5) self.subtitle_delay_spin.setValue( float(self.current_subtitle_delay[self.current_subtitle_index])) def setup_subtitle_set_default_checkBox(self): self.subtitle_set_default_checkBox.setText("Set Default") self.subtitle_set_default_checkBox.setChecked( bool(self.current_subtitle_set_default[ self.current_subtitle_index])) def setup_subtitle_set_forced_checkBox(self): self.subtitle_set_forced_checkBox.setText("Set Forced") self.subtitle_set_forced_checkBox.setChecked( bool( self.current_subtitle_set_forced[self.current_subtitle_index])) def update_current_subtitle_track_name(self): self.current_subtitle_track_name[self.current_subtitle_index] = str( self.subtitle_track_name_lineEdit.text()) def update_current_subtitle_delay(self): self.current_subtitle_delay[self.current_subtitle_index] = round( self.subtitle_delay_spin.value(), 5) def update_current_subtitle_language(self): self.current_subtitle_language[self.current_subtitle_index] = str( self.subtitle_language_comboBox.currentText()) def update_current_subtitle_set_default(self): new_state = self.subtitle_set_default_checkBox.checkState( ) == Qt.Checked self.current_subtitle_set_default[ self.current_subtitle_index] = new_state if new_state: for i in range(len(self.current_subtitle_set_default)): if i != self.current_subtitle_index: self.current_subtitle_set_default[i] = False def update_current_subtitle_set_forced(self): new_state = self.subtitle_set_forced_checkBox.checkState( ) == Qt.Checked self.current_subtitle_set_forced[ self.current_subtitle_index] = new_state if new_state: for i in range(len(self.current_subtitle_set_forced)): if i != self.current_subtitle_index: self.current_subtitle_set_forced[i] = False def reset_subtitle_setting(self): self.current_subtitle_language[ self.current_subtitle_index] = self.default_subtitle_language[ self.current_subtitle_index] self.current_subtitle_delay[ self.current_subtitle_index] = self.default_subtitle_delay[ self.current_subtitle_index] self.current_subtitle_track_name[ self.current_subtitle_index] = self.default_subtitle_track_name[ self.current_subtitle_index] self.current_subtitle_set_default[ self.current_subtitle_index] = self.default_subtitle_set_default[ self.current_subtitle_index] self.current_subtitle_set_forced[ self.current_subtitle_index] = self.default_subtitle_set_forced[ self.current_subtitle_index] self.subtitle_language_comboBox.setCurrentIndex( AllSubtitlesLanguages.index( self.current_subtitle_language[self.current_subtitle_index])) self.subtitle_delay_spin.setValue( float(self.current_subtitle_delay[self.current_subtitle_index])) self.subtitle_track_name_lineEdit.setText( self.current_subtitle_track_name[self.current_subtitle_index]) self.subtitle_set_default_checkBox.setChecked( bool(self.current_subtitle_set_default[ self.current_subtitle_index])) self.subtitle_set_forced_checkBox.setChecked( bool( self.current_subtitle_set_forced[self.current_subtitle_index])) def subtitle_set_default_disable(self): self.subtitle_set_default_checkBox.setDisabled(True) def subtitle_set_forced_disable(self): self.subtitle_set_forced_checkBox.setDisabled(True) def setup_tool_tip_hint_subtitle_set_default(self): if self.subtitle_set_default_checkBox.isEnabled(): self.subtitle_set_default_checkBox.setToolTip( "<nobr>set this subtitle to be the default subtitle track " "when play") self.subtitle_set_default_checkBox.setToolTipDuration(12000) else: self.subtitle_set_default_checkBox.setToolTip( "<nobr>set this subtitle to be the default subtitle track when play<br><b>Disabled</b> because " "option " "<b>make this subtitle default</b> is enabled on mux setting tab " ) self.subtitle_set_default_checkBox.setToolTipDuration(12000) def setup_tool_tip_hint_subtitle_set_forced(self): if self.subtitle_set_forced_checkBox.isEnabled(): self.subtitle_set_forced_checkBox.setToolTip( "<nobr>set this subtitle to be the forced subtitle track when " "play") self.subtitle_set_forced_checkBox.setToolTipDuration(12000) else: self.subtitle_set_forced_checkBox.setToolTip( "<nobr>set this subtitle to be the forced subtitle track when play<br><b>Disabled</b> because " "option " "<b>make this subtitle default and forced</b> is enabled on mux setting tab " ) self.subtitle_set_forced_checkBox.setToolTipDuration(12000) def update_current_subtitle_index(self, new_index): self.current_subtitle_index = new_index self.subtitle_delay_spin.setValue( float(self.current_subtitle_delay[self.current_subtitle_index])) self.subtitle_set_default_checkBox.setChecked( bool(self.current_subtitle_set_default[ self.current_subtitle_index])) self.subtitle_set_forced_checkBox.setChecked( bool( self.current_subtitle_set_forced[self.current_subtitle_index])) self.subtitle_language_comboBox.setCurrentIndex( AllSubtitlesLanguages.index( self.current_subtitle_language[self.current_subtitle_index])) self.subtitle_track_name_lineEdit.setText( self.current_subtitle_track_name[self.current_subtitle_index]) self.subtitle_name_value.setText( str(self.current_subtitle_name[self.current_subtitle_index])) def execute(self): self.exec_()
class Translate(QMainWindow): def __init__(self): super(Translate, self).__init__() self.resize(640, 480) self.setMinimumSize(640, 480) self.setMaximumSize(640, 480) self.setWindowTitle('Translate') self.setWindowIcon(QIcon('arti.PNG')) self.setFont(QFont('Roboto', 12)) palette = QPalette() palette.setColor(palette.Window, QColor('#000000')) palette.setColor(palette.WindowText, QColor('#FFFFFF')) palette.setColor(palette.Button, QColor("#00FF00")) palette.setColor(palette.ButtonText, QColor("#000000")) self.setPalette(palette) self.menubar = QMenuBar(self) self.menubar.setGeometry(0, 0, 682, 21) self.menubar.setFont(QFont('Roboto', 10)) self.date_menu = QMenu(self.menubar) self.date_menu.setTitle(str(datetime.now().strftime('%d-%m-%Y'))) self.setMenuBar(self.menubar) self.menubar.addAction(self.date_menu.menuAction()) self.label = QLabel(self) self.label.setGeometry(QRect(0, 40, 631, 91)) self.label.setAlignment(Qt.AlignCenter) self.label.setText( 'Welcome to Translate \n Tip: The language for text you enter below is always English.' ) self.to_translate = QLineEdit(self) self.to_translate.setGeometry(QRect(10, 180, 611, 41)) self.to_translate.setPlaceholderText('Initial Text:') self.label_2 = QLabel(self) self.label_2.setGeometry(QRect(10, 270, 151, 31)) self.label_2.setText('Select Language -->') self.translate_button = QPushButton(self) self.translate_button.setGeometry(QRect(400, 260, 191, 51)) self.translate_button.setCursor(QCursor(Qt.PointingHandCursor)) self.translate_button.setText('Let\'s Translate!!') self.translate_button.clicked.connect(lambda: self.button_press()) self.translated_text = QLabel(self) self.translated_text.setGeometry(QRect(20, 350, 601, 71)) self.translated_text.setAlignment(Qt.AlignCenter) self.translated_text.setWordWrap(True) self.language = QComboBox(self) self.language.addItem("None") self.language.addItem("Afrikaans") # 1 self.language.addItem("Albanian") # 2 self.language.addItem("Amharic") # 3 self.language.addItem("Arabic") # 4 self.language.addItem("Armenian") # 5 self.language.addItem("Azerbaijani") # 6 self.language.addItem("Basque") # 7 self.language.addItem("Belarusian") # 8 self.language.addItem("Bengali") # 9 self.language.addItem("Bosnian") # 10 self.language.addItem("Bulgarian") # 11 self.language.addItem("Catalan") # 12 self.language.addItem("Cebuano") # 13 self.language.addItem("Chinese (Simplified)") # 14 self.language.addItem("Chinese (Traditional)") # 15 self.language.addItem("Corsican") # 16 self.language.addItem("Croatian") # 17 self.language.addItem("Czech") # 18 self.language.addItem("Danish") # 19 self.language.addItem("Dutch") # 20 self.language.addItem("English") # 21 self.language.addItem("Esperanto") # 22 self.language.addItem("Estonian") # 23 self.language.addItem("Finnish") # 24 self.language.addItem("French") # 25 self.language.addItem("Frisian") # 26 self.language.addItem("Galician") # 27 self.language.addItem("Georgian") # 28 self.language.addItem("German") # 29 self.language.addItem("Greek") # 30 self.language.addItem("Gujarati") # 31 self.language.addItem("Haitian Creole") # 32 self.language.addItem("Hausa") # 33 self.language.addItem("Hawaiian") # 34 self.language.addItem("Hebrew") # 35 self.language.addItem("Hindi") # 36 self.language.addItem("Hmong") # 37 self.language.addItem("Hungarian") # 38 self.language.addItem("Icelandic") # 39 self.language.addItem("Igbo") # 40 self.language.addItem("Indonesian") # 41 self.language.addItem("Irish") # 42 self.language.addItem("Italian") # 43 self.language.addItem("Japanese") # 44 self.language.addItem("Javanese") # 45 self.language.addItem("Kannada") # 46 self.language.addItem("Kazakh") # 47 self.language.addItem("Khmer") # 48 self.language.addItem("Kinyarwanda") # 49 self.language.addItem("Korean") # 50 self.language.addItem("Kurdish") # 51 self.language.addItem("Kyrgyz") # 52 self.language.addItem("Lao") # 53 self.language.addItem("Latin") # 54 self.language.addItem("Latvian") # 55 self.language.addItem("Lithuanian") # 56 self.language.addItem("Luxembourgish") # 57 self.language.addItem("Macedonian") # 58 self.language.addItem("Malagasy") # 59 self.language.addItem("Malay") # 60 self.language.addItem("Malayalam") # 61 self.language.addItem("Maltese") # 62 self.language.addItem("Maori") # 63 self.language.addItem("Marathi") # 64 self.language.addItem("Mongolian") # 65 self.language.addItem("Mayanmar (Burmese)") # 66 self.language.addItem("Nepali") # 67 self.language.addItem("Norwegian") # 68 self.language.addItem("Nyanja (Chichewa)") # 69 self.language.addItem("Odia (Oriya)") # 70 self.language.addItem("Pashto") # 71 self.language.addItem("Persian") # 72 self.language.addItem("Polish") # 73 self.language.addItem("Portugese (Portugal, Brazil)") # 74 self.language.addItem("Punjabi") # 75 self.language.addItem("Romanian") # 76 self.language.addItem("Russian") # 77 self.language.addItem("Samoan") # 78 self.language.addItem("Scots Gaelic") # 79 self.language.addItem("Serbian") # 80 self.language.addItem("Sesotho") # 81 self.language.addItem("Shona") # 82 self.language.addItem("Sindhi") # 83 self.language.addItem("Sinhala (Sinhalese)") # 84 self.language.addItem("Slovak") # 85 self.language.addItem("Slovenian") # 86 self.language.addItem("Somali") # 87 self.language.addItem("Spanish") # 88 self.language.addItem("Sundanese") # 89 self.language.addItem("Swahili") # 90 self.language.addItem("Swedish") # 91 self.language.addItem("Tagalong (Filipino)") # 92 self.language.addItem("Tajik") # 93 self.language.addItem("Tamil") # 94 self.language.addItem("Tatar") # 95 self.language.addItem("Telugu") # 96 self.language.addItem("Thai") # 97 self.language.addItem("Turkish") # 98 self.language.addItem("Turkmen") # 99 self.language.addItem("Ukrainian") # 100 self.language.addItem("Urdu") # 101 self.language.addItem("Uyghur") # 102 self.language.addItem("Uzbek") # 103 self.language.addItem("Vietnamese") # 104 self.language.addItem("Welsh") # 105 self.language.addItem("Xhosa") # 106 self.language.addItem("Yiddish") # 107 self.language.addItem("Yoruba") # 108 self.language.addItem("Zulu") # 109 self.language.setGeometry(QRect(180, 270, 171, 31)) QMetaObject.connectSlotsByName(self) def translate(self, final_lang): self.translated_text.setText( str(self.translator.translate(to=str(final_lang)))) def button_press(self): self.query = self.to_translate.text() self.translator = TextBlob(self.query) self.to_translate.clear() if self.language.currentIndex() == 0: self.translated_text.setText('Please choose a Language First.') try: if self.language.currentIndex() == 1: self.translate('af') elif self.language.currentIndex() == 2: self.translate('sq') elif self.language.currentIndex() == 3: self.translate('am') elif self.language.currentIndex() == 4: self.translate('ar') elif self.language.currentIndex() == 5: self.translate('hy') elif self.language.currentIndex() == 6: self.translate('az') elif self.language.currentIndex() == 7: self.translate('eu') elif self.language.currentIndex() == 8: self.translate('be') elif self.language.currentIndex() == 9: self.translate('bn') elif self.language.currentIndex() == 10: self.translate('bs') elif self.language.currentIndex() == 11: self.translate('bg') elif self.language.currentIndex() == 12: self.translate('ca') elif self.language.currentIndex() == 13: self.translate('ceb') elif self.language.currentIndex() == 14: try: self.translate('zh-CN') except: self.translate('zh') elif self.language.currentIndex() == 15: self.translate('zh-TW') elif self.language.currentIndex() == 16: self.translate('co') elif self.language.currentIndex() == 17: self.translate('hr') elif self.language.currentIndex() == 18: self.translate('cs') elif self.language.currentIndex() == 19: self.translate('da') elif self.language.currentIndex() == 20: self.translate('nl') elif self.language.currentIndex() == 21: self.translate('en') elif self.language.currentIndex() == 22: self.translate('eo') elif self.language.currentIndex() == 23: self.translate('et') elif self.language.currentIndex() == 24: self.translate('fi') elif self.language.currentIndex() == 25: self.translate('fr') elif self.language.currentIndex() == 26: self.translate('fy') elif self.language.currentIndex() == 27: self.translate('gl') elif self.language.currentIndex() == 28: self.translate('ka') elif self.language.currentIndex() == 29: self.translate('de') elif self.language.currentIndex() == 30: self.translate('el') elif self.language.currentIndex() == 31: self.translate('gu') elif self.language.currentIndex() == 32: self.translate('ht') elif self.language.currentIndex() == 33: self.translate('ha') elif self.language.currentIndex() == 34: self.translate('haw') elif self.language.currentIndex() == 35: try: self.translate('he') except: self.translate('iw') elif self.language.currentIndex() == 36: self.translate('hi') elif self.language.currentIndex() == 37: self.translate('hmn') elif self.language.currentIndex() == 38: self.translate('hu') elif self.language.currentIndex() == 39: self.translate('is') elif self.language.currentIndex() == 40: self.translate('ig') elif self.language.currentIndex() == 41: self.translate('id') elif self.language.currentIndex() == 42: self.translate('ga') elif self.language.currentIndex() == 43: self.translate('it') elif self.language.currentIndex() == 44: self.translate('ja') elif self.language.currentIndex() == 45: self.translate('jv') elif self.language.currentIndex() == 46: self.translate('kn') elif self.language.currentIndex() == 47: self.translate('kk') elif self.language.currentIndex() == 48: self.translate('km') elif self.language.currentIndex() == 49: self.translate('rw') elif self.language.currentIndex() == 50: self.translate('ko') elif self.language.currentIndex() == 51: self.translate('ku') elif self.language.currentIndex() == 52: self.translate('ky') elif self.language.currentIndex() == 53: self.translate('lo') elif self.language.currentIndex() == 54: self.translate('la') elif self.language.currentIndex() == 55: self.translate('lv') elif self.language.currentIndex() == 56: self.translate('lt') elif self.language.currentIndex() == 57: self.translate('lb') elif self.language.currentIndex() == 58: self.translate('mk') elif self.language.currentIndex() == 59: self.translate('mg') elif self.language.currentIndex() == 60: self.translate('ms') elif self.language.currentIndex() == 61: self.translate('ml') elif self.language.currentIndex() == 62: self.translate('mt') elif self.language.currentIndex() == 63: self.translate('mi') elif self.language.currentIndex() == 64: self.translate('mr') elif self.language.currentIndex() == 65: self.translate('mn') elif self.language.currentIndex() == 66: self.translate('my') elif self.language.currentIndex() == 67: self.translate('ne') elif self.language.currentIndex() == 68: self.translate('no') elif self.language.currentIndex() == 69: self.translate('ny') elif self.language.currentIndex() == 70: self.translate('or') elif self.language.currentIndex() == 71: self.translate('ps') elif self.language.currentIndex() == 72: self.translate('fa') elif self.language.currentIndex() == 73: self.translate('pl') elif self.language.currentIndex() == 74: self.translate('pt') elif self.language.currentIndex() == 75: self.translate('pa') elif self.language.currentIndex() == 76: self.translate('ro') elif self.language.currentIndex() == 77: self.translate('ru') elif self.language.currentIndex() == 78: self.translate('sm') elif self.language.currentIndex() == 79: self.translate('gd') elif self.language.currentIndex() == 80: self.translate('sr') elif self.language.currentIndex() == 81: self.translate('st') elif self.language.currentIndex() == 82: self.translate('sn') elif self.language.currentIndex() == 83: self.translate('sd') elif self.language.currentIndex() == 84: self.translate('si') elif self.language.currentIndex() == 85: self.translate('sk') elif self.language.currentIndex() == 86: self.translate('sl') elif self.language.currentIndex() == 87: self.translate('so') elif self.language.currentIndex() == 88: self.translate('es') elif self.language.currentIndex() == 89: self.translate('su') elif self.language.currentIndex() == 90: self.translate('sw') elif self.language.currentIndex() == 91: self.translate('sv') elif self.language.currentIndex() == 92: self.translate('tl') elif self.language.currentIndex() == 93: self.translate('tg') elif self.language.currentIndex() == 94: self.translate('ta') elif self.language.currentIndex() == 95: self.translate('tt') elif self.language.currentIndex() == 96: self.translate('te') elif self.language.currentIndex() == 97: self.translate('th') elif self.language.currentIndex() == 98: self.translate('tr') elif self.language.currentIndex() == 99: self.translate('tk') elif self.language.currentIndex() == 100: self.translate('uk') elif self.language.currentIndex() == 101: self.translate('ur') elif self.language.currentIndex() == 102: self.translate('ug') elif self.language.currentIndex() == 103: self.translate('uz') elif self.language.currentIndex() == 104: self.translate('vi') elif self.language.currentIndex() == 105: self.translate('cy') elif self.language.currentIndex() == 106: self.translate('xh') elif self.language.currentIndex() == 107: self.translate('yi') elif self.language.currentIndex() == 108: self.translate('yo') elif self.language.currentIndex() == 109: self.translate('zu') except: self.translated_text.setText( "An error occurred. Either the initial and final language is same or try " "again. \n" "Tip2: You cannot translate numbers; only words. ðŸ˜ðŸ˜")
class Register(QDialog): """ Klasa służąca do utworzenia nowego użytkownika z najniższymi uprawnieniami. """ def __init__(self): super(Register, self).__init__() self.url_register = 'account/register' layout = QFormLayout() btn_box = QDialogButtonBox() lbl_name = QLabel('Imię:') lbl_subname = QLabel('Nazwisko:') lbl_email = QLabel('Email:') lbl_pass2 = QLabel('Wpisz hasło:') lbl_pass3 = QLabel('Wpisz hasło ponownie:') self.edit_name = QLineEdit() self.edit_surname = QLineEdit() self.edit_email = QLineEdit() self.edit_pass2 = QLineEdit() self.edit_pass3 = QLineEdit() self.edit_pass2.setEchoMode(QLineEdit.Password) self.edit_pass3.setEchoMode(QLineEdit.Password) v_spacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.regex = QRegExp('^(\w|\.|\_|\-)+[@](\w|\_|\-|\.)+[.]\w{2,3}$') self.validator = QRegExpValidator(self.regex) self.edit_email.setValidator(self.validator) self.setWindowTitle('Rejestracja') self.setWindowIcon(QtGui.QIcon('resources/library_icon.png')) self.setMinimumWidth(640) self.setMinimumHeight(400) btn_box.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Save) layout.addRow(lbl_name, self.edit_name) layout.addRow(lbl_subname, self.edit_surname) layout.addRow(lbl_email, self.edit_email) layout.addRow(lbl_pass2, self.edit_pass2) layout.addRow(lbl_pass3, self.edit_pass3) layout.setItem(6, QFormLayout.LabelRole, v_spacer) layout.setWidget(7, QFormLayout.FieldRole, btn_box) self.setLayout(layout) btn_box.rejected.connect(self.reject) btn_box.accepted.connect(self.register_user) def register_user(self): """ Rejestruje nowego użytkownika z zerowymi uprawnieniami (jedynie rezerwowanie książek i przeglądanie własnych, wypożyczonych książek). """ jsons = { "name": self.edit_name.text(), "surname": self.edit_surname.text(), "email": self.edit_email.text(), "password": self.edit_pass2.text(), "confirmPassword": self.edit_pass3.text(), "roleId": 1 } if jsons.get('password') != jsons.get('confirmPassword'): QMessageBox.warning(self, "Błędne hasła", "Hasła nie są takie same.") return if jsons.get('password') == '': QMessageBox.warning(self, "Błąd", "Hasła nie mogą być puste.") return if len(self.edit_pass2.text()) < 6: QMessageBox.warning(self, "Błąd", "Hasło jest za krótkie.") return if jsons.get('email') == '': QMessageBox.warning(self, "Błąd", "Email nie może być pusty.") self.edit_new_email.setFocus() return que = queue.Queue() x = threading.Thread(target=post_request, args=("".join([URL, self.url_register]), jsons, None, que)) x.start() x.join() response = que.get() if response == 'ConnectionError': QMessageBox.critical( self, "Błąd", 'Błąd połączenia z internetem! Sprawdź połączenie.') return print(response) if response.status_code == 200: QMessageBox.information( self, "Rejestracja", 'Pomyślnie zarejestrowano nowego użytkownika.') self.accept()
class ItemRow: def __init__(self, parent: QWidget, parent_layout: QVBoxLayout, resource_database: ResourceDatabase, item: ResourceRequirement, rows: List["ItemRow"] ): self.parent = parent self.resource_database = resource_database self._rows = rows rows.append(self) self.layout = QHBoxLayout() self.layout.setObjectName(f"Box layout for {item.resource.long_name}") parent_layout.addLayout(self.layout) self.resource_type_combo = _create_resource_type_combo(item.resource.resource_type, parent) self.resource_type_combo.setMinimumWidth(75) self.resource_type_combo.setMaximumWidth(75) self.resource_name_combo = _create_resource_name_combo(self.resource_database, item.resource.resource_type, item.resource, self.parent) self.negate_combo = QComboBox(parent) self.negate_combo.addItem("≥", False) self.negate_combo.addItem("<", True) self.negate_combo.setCurrentIndex(int(item.negate)) self.negate_combo.setMinimumWidth(40) self.negate_combo.setMaximumWidth(40) self.amount_edit = QLineEdit(parent) self.amount_edit.setValidator(QIntValidator(1, 10000)) self.amount_edit.setText(str(item.amount)) self.amount_edit.setMinimumWidth(45) self.amount_edit.setMaximumWidth(45) self.remove_button = QPushButton(parent) self.remove_button.setText("X") self.remove_button.setMaximumWidth(20) self.layout.addWidget(self.resource_type_combo) self.layout.addWidget(self.resource_name_combo) self.layout.addWidget(self.negate_combo) self.layout.addWidget(self.amount_edit) self.layout.addWidget(self.remove_button) self.resource_type_combo.currentIndexChanged.connect(self._update_type) self.remove_button.clicked.connect(self._delete_row) def _update_type(self): old_combo = self.resource_name_combo self.resource_name_combo = _create_resource_name_combo(self.resource_database, self.resource_type_combo.currentData(), None, self.parent) self.layout.replaceWidget(old_combo, self.resource_name_combo) old_combo.deleteLater() def _delete_row(self): self.resource_type_combo.deleteLater() self.resource_name_combo.deleteLater() self.negate_combo.deleteLater() self.amount_edit.deleteLater() self.remove_button.deleteLater() self.layout.deleteLater() self._rows.remove(self) @property def current_individual(self) -> ResourceRequirement: return ResourceRequirement( self.resource_name_combo.currentData(), int(self.amount_edit.text()), self.negate_combo.currentData() )
def __init__(self, parent=None): QWidget.__init__(self) self.parent = parent self.parent.addWidget(self) self.auto_login, self.auto_pwd, self.auto_email, self.auto_time = data.get_autofill( ) self.gridLayout = QGridLayout(self) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setSpacing(0) self.gridLayout.setColumnStretch(0, 3) self.gridLayout.setColumnStretch(1, 7) self.pushButton_auto = QPushButton(self) self.pushButton_auto.setText("Autofill") self.pushButton_auto.setStyleSheet(styles.btn_allegro_ops_auto) self.pushButton_auto.setCheckable(True) self.pushButton_auto.setChecked(True) self.pushButton_auto.clicked.connect(lambda: self.on_auto()) self.gridLayout.addWidget(self.pushButton_auto, 0, 0, 1, 1) self.pushButton_help = QPushButton(self) self.pushButton_help.setText("Help") self.pushButton_help.setStyleSheet(styles.btn_allegro_ops_auto) self.pushButton_help.setCheckable(True) self.pushButton_help.setChecked(False) self.pushButton_help.clicked.connect(lambda: self.on_help()) self.gridLayout.addWidget(self.pushButton_help, 1, 0, 1, 1) self.spacer_btn_d = QSpacerItem(40, 20, QSizePolicy.Expanding) self.gridLayout.addItem(self.spacer_btn_d, 2, 0, 1, 1) self.stackedWidget = QStackedWidget(self) self.stackedWidget.setStyleSheet( """QStackedWidget{background-color: #fff;}""") self.gridLayout.addWidget(self.stackedWidget, 0, 1, 3, 1) self.widget_auto = QWidget(self.stackedWidget) self.widget_auto.setStyleSheet("""QWidget{background-color: #fff;}""") self.stackedWidget.addWidget(self.widget_auto) self.widget_help = QWidget(self.stackedWidget) self.widget_help.setStyleSheet("""QWidget{background-color: #fff;}""") self.stackedWidget.addWidget(self.widget_help) self.gridLayout_help = QVBoxLayout(self.widget_help) self.gridLayout_help.setContentsMargins(50, 50, 50, 50) self.gridLayout_help.setSpacing(50) self.label_help = QLabel(self.widget_help) self.label_help.setStyleSheet(styles.label_lineEdit) self.label_help.setWordWrap(True) self.label_help.setText(styles.help_text) self.gridLayout_help.addWidget(self.label_help) self.spacer_help = QSpacerItem(40, 20, QSizePolicy.Expanding) self.gridLayout_help.addItem(self.spacer_help) self.gridLayout_auto = QGridLayout(self.widget_auto) self.gridLayout_auto.setContentsMargins(0, 0, 0, 0) self.gridLayout_auto.setSpacing(20) self.gridLayout_auto.setColumnStretch(0, 1) self.gridLayout_auto.setColumnStretch(1, 1) self.gridLayout_auto.setColumnStretch(2, 1) self.gridLayout_auto.setColumnStretch(3, 1) self.gridLayout_auto.setRowStretch(0, 3) self.gridLayout_auto.setRowStretch(1, 1) self.gridLayout_auto.setRowStretch(2, 1) self.gridLayout_auto.setRowStretch(3, 1) self.gridLayout_auto.setRowStretch(4, 1) self.gridLayout_auto.setRowStretch(5, 1) self.gridLayout_auto.setRowStretch(6, 3) self.lineEdit_login = QLineEdit(self.widget_auto) self.lineEdit_login.setMinimumSize(QSize(0, 60)) self.lineEdit_login.setSizeIncrement(QSize(40, 40)) self.lineEdit_login.setStyleSheet(styles.lineEdit_opt) self.gridLayout_auto.addWidget(self.lineEdit_login, 1, 2, 1, 1) self.lineEdit_login.setPlaceholderText( "login or email of your account") self.lineEdit_login.setText(self.auto_login) self.lineEdit_password = QLineEdit(self.widget_auto) self.lineEdit_password.setMinimumSize(QSize(20, 60)) self.lineEdit_password.setStyleSheet(styles.lineEdit_opt) self.lineEdit_password.setEchoMode(QLineEdit.Password) self.lineEdit_password.setReadOnly(False) self.gridLayout_auto.addWidget(self.lineEdit_password, 2, 2, 1, 1) self.lineEdit_password.setPlaceholderText("password of your account") self.lineEdit_password.setText(self.auto_pwd) self.lineEdit_email = QLineEdit(self.widget_auto) self.lineEdit_email.setMinimumSize(QSize(0, 60)) self.lineEdit_email.setStyleSheet(styles.lineEdit_opt) self.lineEdit_email.setFrame(True) self.lineEdit_email.setEchoMode(QLineEdit.Normal) self.gridLayout_auto.addWidget(self.lineEdit_email, 3, 2, 1, 1) self.lineEdit_email.setPlaceholderText( "email to which the notification will be sent") self.lineEdit_email.setText(self.auto_email) self.lineEdit_time = QLineEdit(self.widget_auto) self.lineEdit_time.setMinimumSize(QSize(0, 60)) self.lineEdit_time.setStyleSheet(styles.lineEdit) self.gridLayout_auto.addWidget(self.lineEdit_time, 4, 2, 1, 1) self.lineEdit_time.setPlaceholderText("interval between refreshes") self.lineEdit_time.setText(str(self.auto_time)) self.label_login = QLabel("Allegro login", self) self.label_login.setStyleSheet(styles.label_lineEdit) self.gridLayout_auto.addWidget(self.label_login, 1, 1, 1, 1) self.label_password = QLabel("Allegro password", self) self.label_password.setStyleSheet(styles.label_lineEdit) self.gridLayout_auto.addWidget(self.label_password, 2, 1, 1, 1) self.label_email = QLabel("Email to notificate", self) self.label_email.setStyleSheet(styles.label_lineEdit) self.gridLayout_auto.addWidget(self.label_email, 3, 1, 1, 1) self.label_time = QLabel("Refresh time[s]", self) self.label_time.setStyleSheet(styles.label_lineEdit) self.gridLayout_auto.addWidget(self.label_time, 4, 1, 1, 1) self.pushButton_set = QPushButton("Set", self.widget_auto) self.pushButton_set.clicked.connect(lambda: self.on_set()) self.pushButton_set.setMinimumSize(QSize(0, 40)) self.pushButton_set.setStyleSheet(styles.btn_dark) self.gridLayout_auto.addWidget(self.pushButton_set, 5, 2, 1, 1) self.spacer_auto_l = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout_auto.addItem(self.spacer_auto_l, 1, 1, 1, 1) self.spacer_auto_r = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout_auto.addItem(self.spacer_auto_r, 1, 3, 1, 1) self.spacer_auto_t = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout_auto.addItem(self.spacer_auto_t, 0, 0, 1, 1) self.spacer_auto_b = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout_auto.addItem(self.spacer_auto_b, 6, 0, 1, 1)
def __init__(self, name, link, is_done, price, xpath, time, is_monitoring, parent=None, shared_dict=None): QFrame.__init__(self, parent) self.shared_dict = shared_dict self.setMinimumSize(QSize(0, 300)) self.setStyleSheet("""QFrame{border-bottom: 0.5px solid #aaa;}""") self.setFrameShape(QFrame.StyledPanel) self.setFrameShadow(QFrame.Raised) self.horizontalLayout = QHBoxLayout(self) # create description frame and layout self.frame_description = QFrame(self) self.frame_description.setMinimumSize(QSize(440, 16777215)) self.frame_description.setStyleSheet("""QFrame{border: none;}""") self.frame_description.setFrameShape(QFrame.StyledPanel) self.frame_description.setFrameShadow(QFrame.Raised) self.gridLayout_description = QGridLayout(self.frame_description) self.horizontalLayout.addWidget(self.frame_description) self.gridLayout_description.setColumnStretch(0, 1) self.gridLayout_description.setColumnStretch(1, 2) self.gridLayout_description.setColumnStretch(2, 3) self.gridLayout_description.setColumnStretch(3, 1) self.gridLayout_description.setColumnStretch(4, 6) # fill description layout self.label_name = QLabel(name, self.frame_description) self.label_name.setStyleSheet(styles.label_allegro_monitored_name) self.label_name.setTextFormat(Qt.MarkdownText) self.label_name.setAlignment(Qt.AlignJustify | Qt.AlignVCenter) self.label_name.setWordWrap(False) self.gridLayout_description.addWidget(self.label_name, 0, 0, 1, 5) url_link = "<a href=\"" + link + "\" style = \" color: #838836; text-decoration: none; font-family:corbel; title=\"Go to monitored page\"\">check product</a>" self.label_monitored_link = QLabel(url_link, self.frame_description) self.label_monitored_link.setStyleSheet( styles.label_allegro_monitored_link) self.gridLayout_description.addWidget(self.label_monitored_link, 1, 1, 2, 2) self.label_monitored_link.setOpenExternalLinks(True) self.label_stat = QLabel(self.frame_description) self.label_stat.setStyleSheet(styles.label_allegro_monitored_stat) self.gridLayout_description.addWidget(self.label_stat, 1, 4, 1, 1) self.label_is_on = QLabel(self.frame_description) self.label_is_on.setStyleSheet(styles.label_allegro_monitored_stat) self.gridLayout_description.addWidget(self.label_is_on, 5, 0, 1, 2) self.label_new_time = QLabel( "Actual refresh time[s]: " + str(time) + " s", self.frame_description) self.label_new_time.setStyleSheet(styles.label_allegro_monitored_stat) self.gridLayout_description.addWidget(self.label_new_time, 4, 0, 1, 3) self.lineEdit_new_time = QLineEdit(self.frame_description) self.lineEdit_new_time.setMinimumSize(QSize(0, 33)) self.lineEdit_new_time.setStyleSheet(styles.lineEdit) self.gridLayout_description.addWidget(self.lineEdit_new_time, 4, 3, 1, 2) self.lineEdit_new_time.setPlaceholderText("Set new interval") self.label_new_price = QLabel("Actual price: " + str(price), self) self.label_new_price.setStyleSheet(styles.label_allegro_monitored_stat) self.gridLayout_description.addWidget(self.label_new_price, 3, 0, 1, 3) self.lineEdit_new_price = QLineEdit(self) self.lineEdit_new_price.setMinimumSize(QSize(0, 35)) self.lineEdit_new_price.setStyleSheet(styles.lineEdit) self.gridLayout_description.addWidget(self.lineEdit_new_price, 3, 3, 1, 2) self.lineEdit_new_price.setPlaceholderText("Set new price") self.label_img_link = QLabel(self.frame_description) self.label_img_link.setMaximumSize(QSize(20, 20)) self.label_img_link.setStyleSheet("""QLabel{border: none;}""") self.label_img_link.setPixmap( QPixmap(os.path.join(path, "img/link.png"))) self.label_img_link.setScaledContents(True) self.gridLayout_description.addWidget(self.label_img_link, 1, 0, 2, 1) self.label_img_stat = QLabel("done", self.frame_description) if is_done: self.label_stat.setText("done") self.label_img_stat.setPixmap( QPixmap(os.path.join(path, "img/check.png"))) else: self.label_stat.setText("in progress") self.label_img_stat.setPixmap( QPixmap(os.path.join(path, "img/loading.png"))) self.label_img_stat.setMaximumSize(QSize(20, 20)) self.label_img_stat.setStyleSheet("""QLabel{border: none;}""") self.label_img_stat.setScaledContents(True) self.gridLayout_description.addWidget(self.label_img_stat, 1, 3, 1, 1) self.label_img_monitor = QLabel("done", self.frame_description) if is_monitoring: monitor_text = "I am just monitoring" self.label_img_monitor.setPixmap( QPixmap(os.path.join(path, "img/monitoring.png"))) else: monitor_text = "I am going to buy" self.label_img_monitor.setPixmap( QPixmap(os.path.join(path, "img/buy.png"))) self.label_is_monitoring = QLabel(monitor_text, self) self.label_is_monitoring.setStyleSheet( styles.label_allegro_monitored_stat) self.gridLayout_description.addWidget(self.label_is_monitoring, 2, 4, 1, 1) self.label_img_monitor.setMaximumSize(QSize(20, 20)) self.label_img_monitor.setStyleSheet("""QLabel{border: none;}""") self.label_img_monitor.setScaledContents(True) self.gridLayout_description.addWidget(self.label_img_monitor, 2, 3, 1, 1) # create spacer and delete btn self.spacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout.addItem(self.spacer) self.pushButton_delete = QPushButton(self) # self.pushButton_delete.clicked.connect( lambda: self.deleteLater()) self.pushButton_delete.clicked.connect(lambda: self.on_delete(link)) icon = QIcon() icon.addFile(os.path.join(path, "img/delete.png"), QSize(), QIcon.Selected, QIcon.Off) # icon.Active.addFile(os.path.join(path, "img/icon.png"), QSize(), QIcon.Selected, QIcon.Off) self.pushButton_delete.setIcon(icon) self.pushButton_delete.setIconSize(QSize(50, 50)) self.pushButton_delete.setStyleSheet("""QPushButton{border:none; }""") self.pushButton_delete.setCursor(QCursor(Qt.PointingHandCursor)) # self.pushButton_delete.ico self.horizontalLayout.addWidget(self.pushButton_delete) self.is_on = data.get_switch_state(link) self.pushButton_switch = QPushButton(self) self.pushButton_switch.clicked.connect(lambda: self.on_switch(link)) self.icon_on = QIcon() self.icon_off = QIcon() self.icon_on.addFile(os.path.join(path, "img/switch_on.png"), QSize(), QIcon.Selected, QIcon.On) self.icon_off.addFile(os.path.join(path, "img/switch_off.png"), QSize(), QIcon.Selected, QIcon.Off) if self.is_on: self.label_is_on.setText("Disable") self.pushButton_switch.setIcon(self.icon_on) else: self.label_is_on.setText("Enable") self.pushButton_switch.setIcon(self.icon_off) self.pushButton_switch.setIconSize(QSize(100, 40)) self.pushButton_switch.setStyleSheet("""QPushButton{border:none; }""") self.pushButton_switch.setCursor(QCursor(Qt.PointingHandCursor)) self.gridLayout_description.addWidget(self.pushButton_switch, 5, 2, 1, 1) self.pushButton_save_changes = QPushButton("Save", self) self.pushButton_save_changes.clicked.connect( lambda: self.on_save_changes(link)) self.pushButton_save_changes.setIconSize(QSize(100, 20)) self.pushButton_save_changes.setStyleSheet(styles.btn_dark) self.pushButton_save_changes.setCursor(QCursor(Qt.PointingHandCursor)) self.gridLayout_description.addWidget(self.pushButton_save_changes, 5, 3, 1, 2)
def __init__(self, parent=None, shared_dict=None): QWidget.__init__(self, parent) parent.addWidget(self) self.shared_dict = shared_dict self.gridLayout = QGridLayout(self) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setRowStretch(0, 1) self.gridLayout.setRowStretch(1, 1) self.gridLayout.setRowStretch(2, 1) self.gridLayout.setRowStretch(3, 1) self.gridLayout.setRowStretch(4, 1) self.gridLayout.setRowStretch(5, 1) self.gridLayout.setRowStretch(6, 1) self.gridLayout.setRowStretch(7, 1) self.gridLayout.setRowStretch(8, 1) self.gridLayout.setRowStretch(9, 1) self.gridLayout.setRowStretch(10, 1) self.gridLayout.setRowStretch(11, 1) self.gridLayout.setRowStretch(12, 1) self.gridLayout.setRowStretch(13, 1) self.gridLayout.setRowStretch(14, 2) self.gridLayout.setRowStretch(15, 1) self.gridLayout.setColumnStretch(0, 5) self.gridLayout.setColumnStretch(1, 5) self.gridLayout.setColumnStretch(2, 1) self.gridLayout.setColumnStretch(3, 2) self.gridLayout.setColumnStretch(4, 1) self.gridLayout.setColumnStretch(5, 2) self.gridLayout.setColumnStretch(6, 1) self.gridLayout.setColumnStretch(7, 2) self.gridLayout.setColumnStretch(8, 3) self.gridLayout.setColumnStretch(9, 5) # create lineEdits self.lineEdit_login = QLineEdit(self) self.lineEdit_login.setMinimumSize(QSize(0, 60)) self.lineEdit_login.setSizeIncrement(QSize(40, 40)) self.lineEdit_login.setStyleSheet(styles.lineEdit) self.lineEdit_login.setMaxLength(32767) self.gridLayout.addWidget(self.lineEdit_login, 4, 1, 1, 3) self.lineEdit_login.setPlaceholderText( "login or email of your account") self.lineEdit_password = QLineEdit(self) self.lineEdit_password.setMinimumSize(QSize(20, 60)) self.lineEdit_password.setStyleSheet(styles.lineEdit) self.lineEdit_password.setEchoMode(QLineEdit.Password) self.lineEdit_password.setReadOnly(False) self.gridLayout.addWidget(self.lineEdit_password, 7, 1, 1, 3) self.lineEdit_password.setPlaceholderText("password of your account") self.lineEdit_email = QLineEdit(self) self.lineEdit_email.setMinimumSize(QSize(0, 60)) self.lineEdit_email.setStyleSheet(styles.lineEdit) self.lineEdit_email.setFrame(True) self.lineEdit_email.setEchoMode(QLineEdit.Normal) self.gridLayout.addWidget(self.lineEdit_email, 7, 5, 1, 4) self.lineEdit_email.setPlaceholderText( "email to which the notification will be sent") self.lineEdit_link = QLineEdit(self) self.lineEdit_link.setMinimumSize(QSize(0, 60)) self.lineEdit_link.setStyleSheet(styles.lineEdit) self.gridLayout.addWidget(self.lineEdit_link, 10, 1, 1, 8) self.lineEdit_link.setPlaceholderText( "link to the page that you want to monitor") self.lineEdit_price = QLineEdit(self) self.lineEdit_price.setMinimumSize(QSize(0, 60)) self.lineEdit_price.setStyleSheet(styles.lineEdit) self.gridLayout.addWidget(self.lineEdit_price, 13, 1, 1, 1) self.lineEdit_price.setPlaceholderText( "Price below which to notificate") self.lineEdit_xpath = QLineEdit(self) self.lineEdit_xpath.setMinimumSize(QSize(0, 60)) self.lineEdit_xpath.setStyleSheet(styles.lineEdit) self.gridLayout.addWidget(self.lineEdit_xpath, 13, 3, 1, 3) self.lineEdit_xpath.setPlaceholderText( "XPATH of element with the price") self.lineEdit_time = QLineEdit(self) self.lineEdit_time.setMinimumSize(QSize(0, 60)) self.lineEdit_time.setStyleSheet(styles.lineEdit) self.gridLayout.addWidget(self.lineEdit_time, 13, 7, 1, 2) self.lineEdit_time.setPlaceholderText("interval between refreshes") # Create Labels self.label_title = QLabel("Add new monitoring object", self) self.label_title.setStyleSheet(styles.label_title) self.label_title.setAlignment(Qt.AlignCenter) self.gridLayout.addWidget(self.label_title, 0, 1, 1, 8) self.label_info = QLabel("", self) self.label_info.setStyleSheet(styles.label_info_wrong) self.label_info.setAlignment(Qt.AlignCenter) self.gridLayout.addWidget(self.label_info, 1, 1, 1, 8) self.label_login = QLabel("Allegro login", self) self.label_login.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_login, 3, 1, 1, 3) self.label_password = QLabel("Allegro password", self) self.label_password.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_password, 6, 1, 1, 3) self.label_email = QLabel("Email to notificate", self) self.label_email.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_email, 6, 5, 1, 4) self.label_link = QLabel("Product link", self) self.label_link.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_link, 9, 1, 1, 8) self.label_price = QLabel("Price", self) self.label_price.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_price, 12, 1, 1, 1) self.label_xpath = QLabel("Monitored element", self) self.label_xpath.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_xpath, 12, 3, 1, 3) self.label_time = QLabel("Refresh time[s]", self) self.label_time.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_time, 12, 7, 1, 2) self.pushButton_search = QPushButton(self) self.pushButton_search.clicked.connect( lambda: webbrowser.open('https://allegro.pl/')) icon = QIcon() icon.addFile(os.path.join(path, "img/search.png"), QSize(), QIcon.Selected, QIcon.Off) self.pushButton_search.setIcon(icon) self.pushButton_search.setIconSize(QSize(100, 100)) self.pushButton_search.setStyleSheet("""QPushButton{border:none;}""") self.pushButton_search.setCursor(QCursor(Qt.PointingHandCursor)) self.gridLayout.addWidget(self.pushButton_search, 3, 7, 3, 1) # Create spacers self.spacer_search_l = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout.addItem(self.spacer_search_l, 5, 5, 1, 2) self.spacer_search_r = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout.addItem(self.spacer_search_r, 5, 8, 1, 1) self.spacer_search_t = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.gridLayout.addItem(self.spacer_search_t, 2, 1, 1, 8) self.spacer_search_b = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.gridLayout.addItem(self.spacer_search_b, 5, 1, 1, 8) self.spacer_email_l = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout.addItem(self.spacer_email_l, 7, 4, 1, 1) self.spacer_link_l = QSpacerItem(40, 20, QSizePolicy.MinimumExpanding, QSizePolicy.Minimum) self.gridLayout.addItem(self.spacer_link_l, 13, 0, 1, 1) self.spacer_link_r = QSpacerItem(40, 20, QSizePolicy.MinimumExpanding, QSizePolicy.Minimum) self.gridLayout.addItem(self.spacer_link_r, 13, 9, 1, 1) self.spacer_link_t = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.gridLayout.addItem(self.spacer_link_t, 8, 1, 1, 8) self.spacer_link_b = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.gridLayout.addItem(self.spacer_link_b, 11, 1, 1, 8) self.spacer_price_b = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.gridLayout.addItem(self.spacer_price_b, 14, 1, 1, 7) # create frame bottom self.frame_bottom = QFrame(self) self.frame_bottom.setStyleSheet( """QFrame{background-color: #fff; padding: 10px;}""") self.frame_bottom.setFrameShape(QFrame.StyledPanel) self.frame_bottom.setFrameShadow(QFrame.Raised) self.gridLayout.addWidget(self.frame_bottom, 15, 0, 1, 10) self.horizontalLayout_frame_bottom = QHBoxLayout(self.frame_bottom) self.spacer_frame_bottom_l = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_frame_bottom.addItem(self.spacer_frame_bottom_l) self.pushButton_bn = QPushButton("Buy when price drops", self.frame_bottom) self.pushButton_bn.setMinimumSize(QSize(0, 40)) self.pushButton_bn.setStyleSheet(styles.btn_light) self.horizontalLayout_frame_bottom.addWidget(self.pushButton_bn) self.pushButton_bn.setShortcut("Return") self.spacer_frame_bottom_c = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_frame_bottom.addItem(self.spacer_frame_bottom_c) self.pushButton_monitor = QPushButton("Monitor", self.frame_bottom) self.pushButton_monitor.clicked.connect( lambda: self.new_link_handler(True)) self.pushButton_monitor.setMinimumSize(QSize(0, 40)) self.pushButton_monitor.setStyleSheet(styles.btn_dark) self.horizontalLayout_frame_bottom.addWidget(self.pushButton_monitor) self.spacer_frame_bottom_r = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_frame_bottom.addItem(self.spacer_frame_bottom_r) self.horizontalLayout_frame_bottom.setStretch(0, 1) self.horizontalLayout_frame_bottom.setStretch(1, 1) self.horizontalLayout_frame_bottom.setStretch(2, 2) self.horizontalLayout_frame_bottom.setStretch(3, 1) self.horizontalLayout_frame_bottom.setStretch(4, 1) self.timer = QTimer(self) auto_login, auto_pwd, auto_email, auto_time = data.get_autofill() self.lineEdit_login.setText(auto_login) self.lineEdit_password.setText(auto_pwd) self.lineEdit_email.setText(auto_email) self.lineEdit_time.setText(str(auto_time))
class PageAllegroAdd(QWidget): def __init__(self, parent=None, shared_dict=None): QWidget.__init__(self, parent) parent.addWidget(self) self.shared_dict = shared_dict self.gridLayout = QGridLayout(self) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setRowStretch(0, 1) self.gridLayout.setRowStretch(1, 1) self.gridLayout.setRowStretch(2, 1) self.gridLayout.setRowStretch(3, 1) self.gridLayout.setRowStretch(4, 1) self.gridLayout.setRowStretch(5, 1) self.gridLayout.setRowStretch(6, 1) self.gridLayout.setRowStretch(7, 1) self.gridLayout.setRowStretch(8, 1) self.gridLayout.setRowStretch(9, 1) self.gridLayout.setRowStretch(10, 1) self.gridLayout.setRowStretch(11, 1) self.gridLayout.setRowStretch(12, 1) self.gridLayout.setRowStretch(13, 1) self.gridLayout.setRowStretch(14, 2) self.gridLayout.setRowStretch(15, 1) self.gridLayout.setColumnStretch(0, 5) self.gridLayout.setColumnStretch(1, 5) self.gridLayout.setColumnStretch(2, 1) self.gridLayout.setColumnStretch(3, 2) self.gridLayout.setColumnStretch(4, 1) self.gridLayout.setColumnStretch(5, 2) self.gridLayout.setColumnStretch(6, 1) self.gridLayout.setColumnStretch(7, 2) self.gridLayout.setColumnStretch(8, 3) self.gridLayout.setColumnStretch(9, 5) # create lineEdits self.lineEdit_login = QLineEdit(self) self.lineEdit_login.setMinimumSize(QSize(0, 60)) self.lineEdit_login.setSizeIncrement(QSize(40, 40)) self.lineEdit_login.setStyleSheet(styles.lineEdit) self.lineEdit_login.setMaxLength(32767) self.gridLayout.addWidget(self.lineEdit_login, 4, 1, 1, 3) self.lineEdit_login.setPlaceholderText( "login or email of your account") self.lineEdit_password = QLineEdit(self) self.lineEdit_password.setMinimumSize(QSize(20, 60)) self.lineEdit_password.setStyleSheet(styles.lineEdit) self.lineEdit_password.setEchoMode(QLineEdit.Password) self.lineEdit_password.setReadOnly(False) self.gridLayout.addWidget(self.lineEdit_password, 7, 1, 1, 3) self.lineEdit_password.setPlaceholderText("password of your account") self.lineEdit_email = QLineEdit(self) self.lineEdit_email.setMinimumSize(QSize(0, 60)) self.lineEdit_email.setStyleSheet(styles.lineEdit) self.lineEdit_email.setFrame(True) self.lineEdit_email.setEchoMode(QLineEdit.Normal) self.gridLayout.addWidget(self.lineEdit_email, 7, 5, 1, 4) self.lineEdit_email.setPlaceholderText( "email to which the notification will be sent") self.lineEdit_link = QLineEdit(self) self.lineEdit_link.setMinimumSize(QSize(0, 60)) self.lineEdit_link.setStyleSheet(styles.lineEdit) self.gridLayout.addWidget(self.lineEdit_link, 10, 1, 1, 8) self.lineEdit_link.setPlaceholderText( "link to the page that you want to monitor") self.lineEdit_price = QLineEdit(self) self.lineEdit_price.setMinimumSize(QSize(0, 60)) self.lineEdit_price.setStyleSheet(styles.lineEdit) self.gridLayout.addWidget(self.lineEdit_price, 13, 1, 1, 1) self.lineEdit_price.setPlaceholderText( "Price below which to notificate") self.lineEdit_xpath = QLineEdit(self) self.lineEdit_xpath.setMinimumSize(QSize(0, 60)) self.lineEdit_xpath.setStyleSheet(styles.lineEdit) self.gridLayout.addWidget(self.lineEdit_xpath, 13, 3, 1, 3) self.lineEdit_xpath.setPlaceholderText( "XPATH of element with the price") self.lineEdit_time = QLineEdit(self) self.lineEdit_time.setMinimumSize(QSize(0, 60)) self.lineEdit_time.setStyleSheet(styles.lineEdit) self.gridLayout.addWidget(self.lineEdit_time, 13, 7, 1, 2) self.lineEdit_time.setPlaceholderText("interval between refreshes") # Create Labels self.label_title = QLabel("Add new monitoring object", self) self.label_title.setStyleSheet(styles.label_title) self.label_title.setAlignment(Qt.AlignCenter) self.gridLayout.addWidget(self.label_title, 0, 1, 1, 8) self.label_info = QLabel("", self) self.label_info.setStyleSheet(styles.label_info_wrong) self.label_info.setAlignment(Qt.AlignCenter) self.gridLayout.addWidget(self.label_info, 1, 1, 1, 8) self.label_login = QLabel("Allegro login", self) self.label_login.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_login, 3, 1, 1, 3) self.label_password = QLabel("Allegro password", self) self.label_password.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_password, 6, 1, 1, 3) self.label_email = QLabel("Email to notificate", self) self.label_email.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_email, 6, 5, 1, 4) self.label_link = QLabel("Product link", self) self.label_link.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_link, 9, 1, 1, 8) self.label_price = QLabel("Price", self) self.label_price.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_price, 12, 1, 1, 1) self.label_xpath = QLabel("Monitored element", self) self.label_xpath.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_xpath, 12, 3, 1, 3) self.label_time = QLabel("Refresh time[s]", self) self.label_time.setStyleSheet(styles.label_lineEdit) self.gridLayout.addWidget(self.label_time, 12, 7, 1, 2) self.pushButton_search = QPushButton(self) self.pushButton_search.clicked.connect( lambda: webbrowser.open('https://allegro.pl/')) icon = QIcon() icon.addFile(os.path.join(path, "img/search.png"), QSize(), QIcon.Selected, QIcon.Off) self.pushButton_search.setIcon(icon) self.pushButton_search.setIconSize(QSize(100, 100)) self.pushButton_search.setStyleSheet("""QPushButton{border:none;}""") self.pushButton_search.setCursor(QCursor(Qt.PointingHandCursor)) self.gridLayout.addWidget(self.pushButton_search, 3, 7, 3, 1) # Create spacers self.spacer_search_l = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout.addItem(self.spacer_search_l, 5, 5, 1, 2) self.spacer_search_r = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout.addItem(self.spacer_search_r, 5, 8, 1, 1) self.spacer_search_t = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.gridLayout.addItem(self.spacer_search_t, 2, 1, 1, 8) self.spacer_search_b = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.gridLayout.addItem(self.spacer_search_b, 5, 1, 1, 8) self.spacer_email_l = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout.addItem(self.spacer_email_l, 7, 4, 1, 1) self.spacer_link_l = QSpacerItem(40, 20, QSizePolicy.MinimumExpanding, QSizePolicy.Minimum) self.gridLayout.addItem(self.spacer_link_l, 13, 0, 1, 1) self.spacer_link_r = QSpacerItem(40, 20, QSizePolicy.MinimumExpanding, QSizePolicy.Minimum) self.gridLayout.addItem(self.spacer_link_r, 13, 9, 1, 1) self.spacer_link_t = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.gridLayout.addItem(self.spacer_link_t, 8, 1, 1, 8) self.spacer_link_b = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.gridLayout.addItem(self.spacer_link_b, 11, 1, 1, 8) self.spacer_price_b = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.gridLayout.addItem(self.spacer_price_b, 14, 1, 1, 7) # create frame bottom self.frame_bottom = QFrame(self) self.frame_bottom.setStyleSheet( """QFrame{background-color: #fff; padding: 10px;}""") self.frame_bottom.setFrameShape(QFrame.StyledPanel) self.frame_bottom.setFrameShadow(QFrame.Raised) self.gridLayout.addWidget(self.frame_bottom, 15, 0, 1, 10) self.horizontalLayout_frame_bottom = QHBoxLayout(self.frame_bottom) self.spacer_frame_bottom_l = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_frame_bottom.addItem(self.spacer_frame_bottom_l) self.pushButton_bn = QPushButton("Buy when price drops", self.frame_bottom) self.pushButton_bn.setMinimumSize(QSize(0, 40)) self.pushButton_bn.setStyleSheet(styles.btn_light) self.horizontalLayout_frame_bottom.addWidget(self.pushButton_bn) self.pushButton_bn.setShortcut("Return") self.spacer_frame_bottom_c = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_frame_bottom.addItem(self.spacer_frame_bottom_c) self.pushButton_monitor = QPushButton("Monitor", self.frame_bottom) self.pushButton_monitor.clicked.connect( lambda: self.new_link_handler(True)) self.pushButton_monitor.setMinimumSize(QSize(0, 40)) self.pushButton_monitor.setStyleSheet(styles.btn_dark) self.horizontalLayout_frame_bottom.addWidget(self.pushButton_monitor) self.spacer_frame_bottom_r = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_frame_bottom.addItem(self.spacer_frame_bottom_r) self.horizontalLayout_frame_bottom.setStretch(0, 1) self.horizontalLayout_frame_bottom.setStretch(1, 1) self.horizontalLayout_frame_bottom.setStretch(2, 2) self.horizontalLayout_frame_bottom.setStretch(3, 1) self.horizontalLayout_frame_bottom.setStretch(4, 1) self.timer = QTimer(self) auto_login, auto_pwd, auto_email, auto_time = data.get_autofill() self.lineEdit_login.setText(auto_login) self.lineEdit_password.setText(auto_pwd) self.lineEdit_email.setText(auto_email) self.lineEdit_time.setText(str(auto_time)) def new_link_handler(self, is_monitoring): # check if fields were filled properly no_warnings = True is_email = False link = "" login = "" email = "" password = "" xpath = "" price = 0 time = 60 if self.lineEdit_email.text() == "": self.lineEdit_email.setStyleSheet(styles.lineEdit_warning) no_warnings = False else: self.lineEdit_email.setStyleSheet(styles.lineEdit) email = self.lineEdit_email.text() for symbol in email: if symbol == '@': is_email = True if not is_email: self.lineEdit_email.setStyleSheet(styles.lineEdit_warning) no_warnings = False if self.lineEdit_login.text() == "": self.lineEdit_login.setStyleSheet(styles.lineEdit_warning) no_warnings = False else: self.lineEdit_login.setStyleSheet(styles.lineEdit) login = self.lineEdit_login.text() if self.lineEdit_link.text() == "": self.lineEdit_link.setStyleSheet(styles.lineEdit_warning) no_warnings = False else: self.lineEdit_link.setStyleSheet(styles.lineEdit) link = self.lineEdit_link.text() if self.lineEdit_password.text() == "": self.lineEdit_password.setStyleSheet(styles.lineEdit_warning) no_warnings = False else: self.lineEdit_password.setStyleSheet(styles.lineEdit) password = self.lineEdit_password.text() if self.lineEdit_price.text() == "": self.lineEdit_price.setStyleSheet(styles.lineEdit_warning) no_warnings = False else: self.lineEdit_price.setStyleSheet(styles.lineEdit) price = float(self.lineEdit_price.text()) if self.lineEdit_xpath.text() == "": self.lineEdit_xpath.setStyleSheet(styles.lineEdit_warning) no_warnings = False else: self.lineEdit_xpath.setStyleSheet(styles.lineEdit) xpath = self.lineEdit_xpath.text() if self.lineEdit_time.text() == "": self.lineEdit_time.setStyleSheet(styles.lineEdit_warning) no_warnings = False else: self.lineEdit_time.setStyleSheet(styles.lineEdit) time = int(self.lineEdit_time.text()) if no_warnings: self.lineEdit_login.clear() self.lineEdit_password.clear() self.lineEdit_email.clear() self.lineEdit_link.clear() self.lineEdit_price.clear() self.lineEdit_xpath.clear() self.lineEdit_time.clear() try: data.add_monitored_elements(login, email, password, link, price, xpath, time, is_monitoring) self.shared_dict['isTerminatedP2'] = True except InvalidArgumentException: self.set_info_text("Warning. Wrong link submitted", True) except KeyError: self.set_info_text("Error. This page has already monitored", True) else: self.set_info_text("Info. Object was successfully added", False) self.lineEdit_login.setText(self.auto_login) self.lineEdit_password.setText(self.auto_pwd) self.lineEdit_email.setText(self.auto_email) self.lineEdit_time.setText(self.auto_time) self.lineEdit_link.clear() self.lineEdit_price.clear() self.lineEdit_xpath.clear() else: self.set_info_text("Warning. Fill all field properly", True) return data.get_element(link) # def on_monitor(self): # new_price = monitoring.check_if_price_lower(self.label_link, self.label_xpath, self.label_price, self.label_time) # email_send.send_email(self.label_email, self.label_link, new_price) def set_info_text(self, text, is_warning): self.label_info.setText(text) if is_warning: self.label_info.setStyleSheet(styles.label_info_wrong) else: self.label_info.setStyleSheet(styles.label_info_right) self.timer.setInterval(5000) self.timer.timeout.connect(lambda: self.label_info.setText("")) self.timer.start()
def __init__(self): super(Translate, self).__init__() self.resize(640, 480) self.setMinimumSize(640, 480) self.setMaximumSize(640, 480) self.setWindowTitle('Translate') self.setWindowIcon(QIcon('arti.PNG')) self.setFont(QFont('Roboto', 12)) palette = QPalette() palette.setColor(palette.Window, QColor('#000000')) palette.setColor(palette.WindowText, QColor('#FFFFFF')) palette.setColor(palette.Button, QColor("#00FF00")) palette.setColor(palette.ButtonText, QColor("#000000")) self.setPalette(palette) self.menubar = QMenuBar(self) self.menubar.setGeometry(0, 0, 682, 21) self.menubar.setFont(QFont('Roboto', 10)) self.date_menu = QMenu(self.menubar) self.date_menu.setTitle(str(datetime.now().strftime('%d-%m-%Y'))) self.setMenuBar(self.menubar) self.menubar.addAction(self.date_menu.menuAction()) self.label = QLabel(self) self.label.setGeometry(QRect(0, 40, 631, 91)) self.label.setAlignment(Qt.AlignCenter) self.label.setText( 'Welcome to Translate \n Tip: The language for text you enter below is always English.' ) self.to_translate = QLineEdit(self) self.to_translate.setGeometry(QRect(10, 180, 611, 41)) self.to_translate.setPlaceholderText('Initial Text:') self.label_2 = QLabel(self) self.label_2.setGeometry(QRect(10, 270, 151, 31)) self.label_2.setText('Select Language -->') self.translate_button = QPushButton(self) self.translate_button.setGeometry(QRect(400, 260, 191, 51)) self.translate_button.setCursor(QCursor(Qt.PointingHandCursor)) self.translate_button.setText('Let\'s Translate!!') self.translate_button.clicked.connect(lambda: self.button_press()) self.translated_text = QLabel(self) self.translated_text.setGeometry(QRect(20, 350, 601, 71)) self.translated_text.setAlignment(Qt.AlignCenter) self.translated_text.setWordWrap(True) self.language = QComboBox(self) self.language.addItem("None") self.language.addItem("Afrikaans") # 1 self.language.addItem("Albanian") # 2 self.language.addItem("Amharic") # 3 self.language.addItem("Arabic") # 4 self.language.addItem("Armenian") # 5 self.language.addItem("Azerbaijani") # 6 self.language.addItem("Basque") # 7 self.language.addItem("Belarusian") # 8 self.language.addItem("Bengali") # 9 self.language.addItem("Bosnian") # 10 self.language.addItem("Bulgarian") # 11 self.language.addItem("Catalan") # 12 self.language.addItem("Cebuano") # 13 self.language.addItem("Chinese (Simplified)") # 14 self.language.addItem("Chinese (Traditional)") # 15 self.language.addItem("Corsican") # 16 self.language.addItem("Croatian") # 17 self.language.addItem("Czech") # 18 self.language.addItem("Danish") # 19 self.language.addItem("Dutch") # 20 self.language.addItem("English") # 21 self.language.addItem("Esperanto") # 22 self.language.addItem("Estonian") # 23 self.language.addItem("Finnish") # 24 self.language.addItem("French") # 25 self.language.addItem("Frisian") # 26 self.language.addItem("Galician") # 27 self.language.addItem("Georgian") # 28 self.language.addItem("German") # 29 self.language.addItem("Greek") # 30 self.language.addItem("Gujarati") # 31 self.language.addItem("Haitian Creole") # 32 self.language.addItem("Hausa") # 33 self.language.addItem("Hawaiian") # 34 self.language.addItem("Hebrew") # 35 self.language.addItem("Hindi") # 36 self.language.addItem("Hmong") # 37 self.language.addItem("Hungarian") # 38 self.language.addItem("Icelandic") # 39 self.language.addItem("Igbo") # 40 self.language.addItem("Indonesian") # 41 self.language.addItem("Irish") # 42 self.language.addItem("Italian") # 43 self.language.addItem("Japanese") # 44 self.language.addItem("Javanese") # 45 self.language.addItem("Kannada") # 46 self.language.addItem("Kazakh") # 47 self.language.addItem("Khmer") # 48 self.language.addItem("Kinyarwanda") # 49 self.language.addItem("Korean") # 50 self.language.addItem("Kurdish") # 51 self.language.addItem("Kyrgyz") # 52 self.language.addItem("Lao") # 53 self.language.addItem("Latin") # 54 self.language.addItem("Latvian") # 55 self.language.addItem("Lithuanian") # 56 self.language.addItem("Luxembourgish") # 57 self.language.addItem("Macedonian") # 58 self.language.addItem("Malagasy") # 59 self.language.addItem("Malay") # 60 self.language.addItem("Malayalam") # 61 self.language.addItem("Maltese") # 62 self.language.addItem("Maori") # 63 self.language.addItem("Marathi") # 64 self.language.addItem("Mongolian") # 65 self.language.addItem("Mayanmar (Burmese)") # 66 self.language.addItem("Nepali") # 67 self.language.addItem("Norwegian") # 68 self.language.addItem("Nyanja (Chichewa)") # 69 self.language.addItem("Odia (Oriya)") # 70 self.language.addItem("Pashto") # 71 self.language.addItem("Persian") # 72 self.language.addItem("Polish") # 73 self.language.addItem("Portugese (Portugal, Brazil)") # 74 self.language.addItem("Punjabi") # 75 self.language.addItem("Romanian") # 76 self.language.addItem("Russian") # 77 self.language.addItem("Samoan") # 78 self.language.addItem("Scots Gaelic") # 79 self.language.addItem("Serbian") # 80 self.language.addItem("Sesotho") # 81 self.language.addItem("Shona") # 82 self.language.addItem("Sindhi") # 83 self.language.addItem("Sinhala (Sinhalese)") # 84 self.language.addItem("Slovak") # 85 self.language.addItem("Slovenian") # 86 self.language.addItem("Somali") # 87 self.language.addItem("Spanish") # 88 self.language.addItem("Sundanese") # 89 self.language.addItem("Swahili") # 90 self.language.addItem("Swedish") # 91 self.language.addItem("Tagalong (Filipino)") # 92 self.language.addItem("Tajik") # 93 self.language.addItem("Tamil") # 94 self.language.addItem("Tatar") # 95 self.language.addItem("Telugu") # 96 self.language.addItem("Thai") # 97 self.language.addItem("Turkish") # 98 self.language.addItem("Turkmen") # 99 self.language.addItem("Ukrainian") # 100 self.language.addItem("Urdu") # 101 self.language.addItem("Uyghur") # 102 self.language.addItem("Uzbek") # 103 self.language.addItem("Vietnamese") # 104 self.language.addItem("Welsh") # 105 self.language.addItem("Xhosa") # 106 self.language.addItem("Yiddish") # 107 self.language.addItem("Yoruba") # 108 self.language.addItem("Zulu") # 109 self.language.setGeometry(QRect(180, 270, 171, 31)) QMetaObject.connectSlotsByName(self)
class MainWindow(QMainWindow): """Provides the parent window that includes the BookmarkWidget, BrowserTabWidget, and a DownloadWidget, to offer the complete web browsing experience.""" def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle('PySide2 tabbed browser Example') self._tab_widget = BrowserTabWidget(create_main_window_with_browser) self._tab_widget.enabled_changed.connect(self._enabled_changed) self._tab_widget.download_requested.connect(self._download_requested) self.setCentralWidget(self._tab_widget) self.connect(self._tab_widget, QtCore.SIGNAL("url_changed(QUrl)"), self.url_changed) self._bookmark_dock = QDockWidget() self._bookmark_dock.setWindowTitle('Bookmarks') self._bookmark_widget = BookmarkWidget() self._bookmark_widget.open_bookmark.connect(self.load_url) self._bookmark_widget.open_bookmark_in_new_tab.connect(self.load_url_in_new_tab) self._bookmark_dock.setWidget(self._bookmark_widget) self.addDockWidget(Qt.LeftDockWidgetArea, self._bookmark_dock) self._find_tool_bar = None self._actions = {} self._create_menu() self._tool_bar = QToolBar() self.addToolBar(self._tool_bar) for action in self._actions.values(): if not action.icon().isNull(): self._tool_bar.addAction(action) self._addres_line_edit = QLineEdit() self._addres_line_edit.setClearButtonEnabled(True) self._addres_line_edit.returnPressed.connect(self.load) self._tool_bar.addWidget(self._addres_line_edit) self._zoom_label = QLabel() self.statusBar().addPermanentWidget(self._zoom_label) self._update_zoom_label() self._bookmarksToolBar = QToolBar() self.addToolBar(Qt.TopToolBarArea, self._bookmarksToolBar) self.insertToolBarBreak(self._bookmarksToolBar) self._bookmark_widget.changed.connect(self._update_bookmarks) self._update_bookmarks() def _update_bookmarks(self): self._bookmark_widget.populate_tool_bar(self._bookmarksToolBar) self._bookmark_widget.populate_other(self._bookmark_menu, 3) def _create_menu(self): file_menu = self.menuBar().addMenu("&File") exit_action = QAction(QIcon.fromTheme("application-exit"), "E&xit", self, shortcut = "Ctrl+Q", triggered=qApp.quit) file_menu.addAction(exit_action) navigation_menu = self.menuBar().addMenu("&Navigation") style_icons = ':/qt-project.org/styles/commonstyle/images/' back_action = QAction(QIcon.fromTheme("go-previous", QIcon(style_icons + 'left-32.png')), "Back", self, shortcut = QKeySequence(QKeySequence.Back), triggered = self._tab_widget.back) self._actions[QWebEnginePage.Back] = back_action back_action.setEnabled(False) navigation_menu.addAction(back_action) forward_action = QAction(QIcon.fromTheme("go-next", QIcon(style_icons + 'right-32.png')), "Forward", self, shortcut = QKeySequence(QKeySequence.Forward), triggered = self._tab_widget.forward) forward_action.setEnabled(False) self._actions[QWebEnginePage.Forward] = forward_action navigation_menu.addAction(forward_action) reload_action = QAction(QIcon(style_icons + 'refresh-32.png'), "Reload", self, shortcut = QKeySequence(QKeySequence.Refresh), triggered = self._tab_widget.reload) self._actions[QWebEnginePage.Reload] = reload_action reload_action.setEnabled(False) navigation_menu.addAction(reload_action) navigation_menu.addSeparator() new_tab_action = QAction("New Tab", self, shortcut = 'Ctrl+T', triggered = self.add_browser_tab) navigation_menu.addAction(new_tab_action) close_tab_action = QAction("Close Current Tab", self, shortcut = "Ctrl+W", triggered = self._close_current_tab) navigation_menu.addAction(close_tab_action) edit_menu = self.menuBar().addMenu("&Edit") find_action = QAction("Find", self, shortcut = QKeySequence(QKeySequence.Find), triggered = self._show_find) edit_menu.addAction(find_action) edit_menu.addSeparator() undo_action = QAction("Undo", self, shortcut = QKeySequence(QKeySequence.Undo), triggered = self._tab_widget.undo) self._actions[QWebEnginePage.Undo] = undo_action undo_action.setEnabled(False) edit_menu.addAction(undo_action) redo_action = QAction("Redo", self, shortcut = QKeySequence(QKeySequence.Redo), triggered = self._tab_widget.redo) self._actions[QWebEnginePage.Redo] = redo_action redo_action.setEnabled(False) edit_menu.addAction(redo_action) edit_menu.addSeparator() cut_action = QAction("Cut", self, shortcut = QKeySequence(QKeySequence.Cut), triggered = self._tab_widget.cut) self._actions[QWebEnginePage.Cut] = cut_action cut_action.setEnabled(False) edit_menu.addAction(cut_action) copy_action = QAction("Copy", self, shortcut = QKeySequence(QKeySequence.Copy), triggered = self._tab_widget.copy) self._actions[QWebEnginePage.Copy] = copy_action copy_action.setEnabled(False) edit_menu.addAction(copy_action) paste_action = QAction("Paste", self, shortcut = QKeySequence(QKeySequence.Paste), triggered = self._tab_widget.paste) self._actions[QWebEnginePage.Paste] = paste_action paste_action.setEnabled(False) edit_menu.addAction(paste_action) edit_menu.addSeparator() select_all_action = QAction("Select All", self, shortcut = QKeySequence(QKeySequence.SelectAll), triggered = self._tab_widget.select_all) self._actions[QWebEnginePage.SelectAll] = select_all_action select_all_action.setEnabled(False) edit_menu.addAction(select_all_action) self._bookmark_menu = self.menuBar().addMenu("&Bookmarks") add_bookmark_action = QAction("&Add Bookmark", self, triggered = self._add_bookmark) self._bookmark_menu.addAction(add_bookmark_action) add_tool_bar_bookmark_action = QAction("&Add Bookmark to Tool Bar", self, triggered = self._add_tool_bar_bookmark) self._bookmark_menu.addAction(add_tool_bar_bookmark_action) self._bookmark_menu.addSeparator() tools_menu = self.menuBar().addMenu("&Tools") download_action = QAction("Open Downloads", self, triggered = DownloadWidget.open_download_directory) tools_menu.addAction(download_action) window_menu = self.menuBar().addMenu("&Window") window_menu.addAction(self._bookmark_dock.toggleViewAction()) window_menu.addSeparator() zoom_in_action = QAction(QIcon.fromTheme("zoom-in"), "Zoom In", self, shortcut = QKeySequence(QKeySequence.ZoomIn), triggered = self._zoom_in) window_menu.addAction(zoom_in_action) zoom_out_action = QAction(QIcon.fromTheme("zoom-out"), "Zoom Out", self, shortcut = QKeySequence(QKeySequence.ZoomOut), triggered = self._zoom_out) window_menu.addAction(zoom_out_action) reset_zoom_action = QAction(QIcon.fromTheme("zoom-original"), "Reset Zoom", self, shortcut = "Ctrl+0", triggered = self._reset_zoom) window_menu.addAction(reset_zoom_action) about_menu = self.menuBar().addMenu("&About") about_action = QAction("About Qt", self, shortcut = QKeySequence(QKeySequence.HelpContents), triggered=qApp.aboutQt) about_menu.addAction(about_action) def add_browser_tab(self): return self._tab_widget.add_browser_tab() def _close_current_tab(self): if self._tab_widget.count() > 1: self._tab_widget.close_current_tab() else: self.close() def close_event(self, event): main_windows.remove(self) event.accept() def load(self): url_string = self._addres_line_edit.text().strip() if url_string: self.load_url_string(url_string) def load_url_string(self, url_s): url = QUrl.fromUserInput(url_s) if (url.isValid()): self.load_url(url) def load_url(self, url): self._tab_widget.load(url) def load_url_in_new_tab(self, url): self.add_browser_tab().load(url) def url_changed(self, url): self._addres_line_edit.setText(url.toString()) def _enabled_changed(self, web_action, enabled): action = self._actions[web_action] if action: action.setEnabled(enabled) def _add_bookmark(self): index = self._tab_widget.currentIndex() if index >= 0: url = self._tab_widget.url() title = self._tab_widget.tabText(index) icon = self._tab_widget.tabIcon(index) self._bookmark_widget.add_bookmark(url, title, icon) def _add_tool_bar_bookmark(self): index = self._tab_widget.currentIndex() if index >= 0: url = self._tab_widget.url() title = self._tab_widget.tabText(index) icon = self._tab_widget.tabIcon(index) self._bookmark_widget.add_tool_bar_bookmark(url, title, icon) def _zoom_in(self): new_zoom = self._tab_widget.zoom_factor() * 1.5 if (new_zoom <= WebEngineView.maximum_zoom_factor()): self._tab_widget.set_zoom_factor(new_zoom) self._update_zoom_label() def _zoom_out(self): new_zoom = self._tab_widget.zoom_factor() / 1.5 if (new_zoom >= WebEngineView.minimum_zoom_factor()): self._tab_widget.set_zoom_factor(new_zoom) self._update_zoom_label() def _reset_zoom(self): self._tab_widget.set_zoom_factor(1) self._update_zoom_label() def _update_zoom_label(self): percent = int(self._tab_widget.zoom_factor() * 100) self._zoom_label.setText("{}%".format(percent)) def _download_requested(self, item): # Remove old downloads before opening a new one for old_download in self.statusBar().children(): if type(old_download).__name__ == 'download_widget' and \ old_download.state() != QWebEngineDownloadItem.DownloadInProgress: self.statusBar().removeWidget(old_download) del old_download item.accept() download_widget = download_widget(item) download_widget.removeRequested.connect(self._remove_download_requested, Qt.QueuedConnection) self.statusBar().addWidget(download_widget) def _remove_download_requested(self): download_widget = self.sender() self.statusBar().removeWidget(download_widget) del download_widget def _show_find(self): if self._find_tool_bar is None: self._find_tool_bar = FindToolBar() self._find_tool_bar.find.connect(self._tab_widget.find) self.addToolBar(Qt.BottomToolBarArea, self._find_tool_bar) else: self._find_tool_bar.show() self._find_tool_bar.focus_find() def write_bookmarks(self): self._bookmark_widget.write_bookmarks()
def _create_reg(self, ind_list, name, width, color): # Create a widget to hold the register's bits reg_widget = QWidget(self) reg_layout = QVBoxLayout(reg_widget) reg_widget.setLayout(reg_layout) reg_layout.setSpacing(0) reg_layout.setMargin(0) # Create a widget to hold the register's label and value textbox label_value = QWidget(reg_widget) lv_layout = QHBoxLayout(label_value) label_value.setLayout(lv_layout) lv_layout.setSpacing(1) lv_layout.setMargin(0) reg_layout.addWidget(label_value) # Create a label to show the register's name reg_label = QLabel(name, label_value) reg_label.setAlignment(Qt.AlignCenter) font = reg_label.font() font.setPointSize(8) reg_label.setFont(font) lv_layout.addWidget(reg_label) # Create a textbox to show the register's value in octal n_digits = int((width + 2) / 3) if n_digits == 1: value_width = 25 elif n_digits == 2: value_width = 30 else: value_width = 45 reg_value = QLineEdit(label_value) reg_value.setReadOnly(True) reg_value.setMaximumSize(value_width, 32) reg_value.setText(n_digits * '0') font = QFont('Monospace') font.setStyleHint(QFont.TypeWriter) font.setPointSize(10) reg_value.setFont(font) reg_value.setAlignment(Qt.AlignCenter) lv_layout.addWidget(reg_value) # Create a frame to hold the register's bits bit_frame = QFrame(reg_widget) bit_layout = QHBoxLayout(bit_frame) bit_layout.setSpacing(1) bit_layout.setMargin(0) bit_frame.setLayout(bit_layout) bit_frame.setFrameStyle(QFrame.StyledPanel | QFrame.Raised) # Add indicators for each bit in the register, from MSB to LSB for i in range(width, 0, -1): ind = Indicator(bit_frame, color) ind.setFixedSize(20, 32) bit_layout.addWidget(ind) ind_list.insert(0, ind) # Add separators between each group of 3 bits if (i > 1) and ((i % 3) == 1): sep = QFrame(bit_frame) sep.setFrameStyle(QFrame.VLine | QFrame.Raised) bit_layout.addWidget(sep) reg_layout.addWidget(bit_frame) return reg_widget, reg_value
def __init__(self): super().__init__() self.setWindowTitle('输出.srt时间轴文件') self.resize(550, 350) self.layout = QGridLayout() self.setLayout(self.layout) self.startPos = QTimeEdit() self.startPos.setDisplayFormat('hh:mm:ss.zzz') self.layout.addWidget(QLabel('开始位置'), 0, 0, 1, 3) self.layout.addWidget(self.startPos, 0, 2, 1, 3) self.endPos = QTimeEdit() self.endPos.setDisplayFormat('hh:mm:ss.zzz') self.layout.addWidget(QLabel('结束位置'), 0, 6, 1, 3) self.layout.addWidget(self.endPos, 0, 8, 1, 3) self.timeMarkType = QComboBox() self.timeMarkType.addItems(['相对时间', '绝对时间']) self.layout.addWidget(QLabel('记录方式'), 1, 0, 1, 3) self.layout.addWidget(self.timeMarkType, 1, 2, 1, 3) self.offset = QTimeEdit() self.offset.setDisplayFormat('hh:mm:ss.zzz') self.layout.addWidget(QLabel('时间轴偏移'), 1, 6, 1, 4) self.layout.addWidget(self.offset, 1, 8, 1, 3) self.layout.addWidget(QLabel('最大无效时长(毫秒)'), 2, 0, 1, 6) self.maxIgnore = QLineEdit() self.layout.addWidget(self.maxIgnore, 2, 4, 1, 4) self.maxIgnore.setText("100") self.layout.addWidget(QLabel('最大合并间隔(毫秒)'), 3, 0, 1, 6) self.maxMerge = QLineEdit() self.layout.addWidget(self.maxMerge, 3, 4, 1, 4) self.maxMerge.setText("100") self.mergeOrIgnore = QComboBox() self.mergeOrIgnore.addItems(['优先合并', '优先忽略']) self.layout.addWidget(QLabel('合并&忽略优先设置'), 4, 0, 1, 6) self.layout.addWidget(self.mergeOrIgnore, 4, 4, 1, 3) self.isExportUnnumbering = QCheckBox() self.layout.addWidget(self.isExportUnnumbering, 5, 0, 1, 1) self.layout.addWidget(QLabel('同时导出无编号.srt文件'), 5, 1, 1, 6) self.saveDir = QLineEdit() self.layout.addWidget(self.saveDir, 6, 0, 1, 6) self.setPath = QPushButton('保存位置') self.layout.addWidget(self.setPath, 6, 6, 1, 1) self.setPath.clicked.connect(self.choosePath) self.exportSrt = QPushButton('导出文件') self.cancel = QPushButton('取消') self.help = QPushButton('帮助') self.layout.addWidget(self.exportSrt, 7, 0, 1, 2) self.layout.addWidget(self.cancel, 7, 2, 1, 2) self.layout.addWidget(self.help, 7, 4, 1, 2) self.exportSrt.clicked.connect(self.execExportSrt) self.cancel.clicked.connect(self.closeWindow) self.help.clicked.connect(self.dispHelp)
class InstructionRegister(QWidget): def __init__(self, parent, usbif, color): super().__init__(parent) self._br_inds = [] self._st_inds = [] self._sq_inds = [] self._status_inds = {} self._setup_ui(color) usbif.poll(um.ReadMonRegI()) usbif.poll(um.ReadMonRegStatus()) usbif.poll(um.ReadStatusPeripheral()) usbif.listen(self) def handle_msg(self, msg): if isinstance(msg, um.MonRegI): self.set_i_values(msg.br, msg.st, msg.sqext, msg.sq) elif isinstance(msg, um.MonRegStatus): self._status_inds['iip'].set_on(msg.iip) self._status_inds['inhl'].set_on(msg.inhl) self._status_inds['inkl'].set_on(msg.inkl) elif isinstance(msg, um.StatusPeripheral): self._status_inds['ld'].set_on(msg.ld) self._status_inds['chld'].set_on(msg.chld) self._status_inds['rd'].set_on(msg.rd) self._status_inds['chrd'].set_on(msg.chrd) def set_i_values(self, br, st, sqext, sq): self._set_reg_value(self._br_inds, self._br_value, br) self._set_reg_value(self._st_inds, self._st_value, st) self._set_reg_value(self._sq_inds, self._sq_value, (sqext << 5) | sq) self._inst_value.setText(agc.disassemble_subinst(sqext, sq, st)) def _setup_ui(self, color): # Set up our basic layout layout = QHBoxLayout(self) self.setLayout(layout) layout.setSpacing(3) layout.setMargin(1) # Construct register groups for BR, ST, and SQ br_frame, self._br_value = self._create_reg(self._br_inds, 'BR', 2, color) st_frame, self._st_value = self._create_reg(self._st_inds, 'ST', 3, color) sq_frame, self._sq_value = self._create_reg(self._sq_inds, 'SQ', 7, color) layout.addWidget(br_frame) layout.addWidget(st_frame) layout.addWidget(sq_frame) stat_group = QWidget(self) layout.addWidget(stat_group) stat_layout = QGridLayout(stat_group) stat_layout.setMargin(0) stat_layout.setSpacing(0) col = 0 for name, label in STATUS_INDS.items(): self._status_inds[name] = self._create_status_light( label, stat_group, stat_layout, col) col += 1 # Create a grouping widget for the I label and decoded instruction value box label_value = QWidget(self) lv_layout = QHBoxLayout(label_value) lv_layout.setSpacing(3) lv_layout.setMargin(1) lv_layout.setContentsMargins(0, 32, 0, 0) label_value.setLayout(lv_layout) layout.addWidget(label_value) # Create a value box for displaying the overall decoded instruction self._inst_value = QLineEdit(label_value) self._inst_value.setReadOnly(True) self._inst_value.setMaximumSize(65, 32) self._inst_value.setText('TC0') font = QFont('Monospace') font.setStyleHint(QFont.TypeWriter) font.setPointSize(10) self._inst_value.setFont(font) self._inst_value.setAlignment(Qt.AlignCenter) lv_layout.addWidget(self._inst_value) # Create a label to show 'I' label = QLabel('I', label_value) font = label.font() font.setPointSize(14) font.setBold(True) label.setFont(font) lv_layout.addWidget(label) # Add some spacing to account for lack of parity indicators layout.addSpacing(52) def _set_reg_value(self, inds, value_box, x): # Generic function to display in octal the value of a register, with the # appropriate number of digits for i in range(0, len(inds)): inds[i].set_on((x & (1 << i)) != 0) fmt_string = '%%0%oo' % int((len(inds) + 2) / 3) value_box.setText(fmt_string % x) def _create_reg(self, ind_list, name, width, color): # Create a widget to hold the register's bits reg_widget = QWidget(self) reg_layout = QVBoxLayout(reg_widget) reg_widget.setLayout(reg_layout) reg_layout.setSpacing(0) reg_layout.setMargin(0) # Create a widget to hold the register's label and value textbox label_value = QWidget(reg_widget) lv_layout = QHBoxLayout(label_value) label_value.setLayout(lv_layout) lv_layout.setSpacing(1) lv_layout.setMargin(0) reg_layout.addWidget(label_value) # Create a label to show the register's name reg_label = QLabel(name, label_value) reg_label.setAlignment(Qt.AlignCenter) font = reg_label.font() font.setPointSize(8) reg_label.setFont(font) lv_layout.addWidget(reg_label) # Create a textbox to show the register's value in octal n_digits = int((width + 2) / 3) if n_digits == 1: value_width = 25 elif n_digits == 2: value_width = 30 else: value_width = 45 reg_value = QLineEdit(label_value) reg_value.setReadOnly(True) reg_value.setMaximumSize(value_width, 32) reg_value.setText(n_digits * '0') font = QFont('Monospace') font.setStyleHint(QFont.TypeWriter) font.setPointSize(10) reg_value.setFont(font) reg_value.setAlignment(Qt.AlignCenter) lv_layout.addWidget(reg_value) # Create a frame to hold the register's bits bit_frame = QFrame(reg_widget) bit_layout = QHBoxLayout(bit_frame) bit_layout.setSpacing(1) bit_layout.setMargin(0) bit_frame.setLayout(bit_layout) bit_frame.setFrameStyle(QFrame.StyledPanel | QFrame.Raised) # Add indicators for each bit in the register, from MSB to LSB for i in range(width, 0, -1): ind = Indicator(bit_frame, color) ind.setFixedSize(20, 32) bit_layout.addWidget(ind) ind_list.insert(0, ind) # Add separators between each group of 3 bits if (i > 1) and ((i % 3) == 1): sep = QFrame(bit_frame) sep.setFrameStyle(QFrame.VLine | QFrame.Raised) bit_layout.addWidget(sep) reg_layout.addWidget(bit_frame) return reg_widget, reg_value def _create_status_light(self, name, parent, layout, col): label = QLabel(name, parent) label.setAlignment(Qt.AlignBottom | Qt.AlignCenter) label.setFixedSize(30, 20) font = label.font() font.setPointSize(8) label.setFont(font) layout.addWidget(label, 1, col) layout.setAlignment(label, Qt.AlignBottom) # Add an indicator to show inhibit state ind = Indicator(parent, QColor(0, 255, 255)) ind.setFixedSize(20, 20) layout.addWidget(ind, 2, col) layout.setAlignment(ind, Qt.AlignCenter) return ind
def __init__(self, subtitles_name, subtitles_delay, subtitles_language, subtitles_track_name, subtitles_set_default, subtitles_set_forced, subtitles_default_value_delay, subtitles_default_value_language, subtitles_default_value_track_name, subtitles_default_value_set_default, subtitles_default_value_set_forced, subtitle_set_default_disabled=False, subtitle_set_forced_disabled=False, disable_edit=False, parent=None): super().__init__(parent) self.window_title = "Subtitle Info" self.state = "no" self.subtitles_count = len(subtitles_delay) self.messageIcon = QLabel() self.subtitle_tab_comboBox = InfoCellDialogTabComboBox( hint="Subtitles Groups") for i in range(self.subtitles_count): self.subtitle_tab_comboBox.addItem("Subtitle #" + str(i + 1)) self.subtitle_tab_comboBox.setCurrentIndex(0) self.subtitle_tab_comboBox.currentIndexChanged.connect( self.update_current_subtitle_index) self.current_subtitle_index = 0 self.disable_edit = disable_edit self.current_subtitle_name = subtitles_name self.current_subtitle_language = subtitles_language self.current_subtitle_delay = subtitles_delay self.current_subtitle_track_name = subtitles_track_name self.current_subtitle_set_default = subtitles_set_default self.current_subtitle_set_forced = subtitles_set_forced self.default_subtitle_language = subtitles_default_value_language self.default_subtitle_delay = subtitles_default_value_delay self.default_subtitle_track_name = subtitles_default_value_track_name self.default_subtitle_set_default = subtitles_default_value_set_default self.default_subtitle_set_forced = subtitles_default_value_set_forced self.subtitle_set_default_disabled = subtitle_set_default_disabled self.subtitle_set_forced_disabled = subtitle_set_forced_disabled self.subtitle_name_label = QLabel("Subtitle Name:") self.subtitle_name_value = QLabel( str(self.current_subtitle_name[self.current_subtitle_index])) width_to_be_fixed = 0 for i in range(len(self.current_subtitle_name)): width_to_be_fixed = max( width_to_be_fixed, self.subtitle_name_value.fontMetrics().boundingRect( self.current_subtitle_name[i]).width()) self.subtitle_name_value.setFixedWidth(width_to_be_fixed + 10) self.subtitle_delay_label = QLabel("Subtitle Delay:") self.subtitle_delay_spin = QDoubleSpinBox() self.setup_subtitle_delay_spin() self.subtitle_language_label = QLabel("Subtitle Language:") self.subtitle_language_comboBox = QComboBox() self.setup_subtitle_language_comboBox() self.subtitle_track_name_label = QLabel("Subtitle Track Name:") self.subtitle_track_name_lineEdit = QLineEdit() self.setup_subtitle_track_name_lineEdit() self.subtitle_set_forced_label = QLabel("Subtitle Forced State:") self.subtitle_set_forced_checkBox = QCheckBox() self.setup_subtitle_set_forced_checkBox() self.subtitle_set_default_label = QLabel("Subtitle Default State:") self.subtitle_set_default_checkBox = QCheckBox() self.setup_subtitle_set_default_checkBox() self.yes_button = QPushButton("OK") self.no_button = QPushButton("Cancel") self.reset_button = QPushButton("Reset To Default") self.buttons_layout = QHBoxLayout() self.subtitle_delay_layout = QHBoxLayout() self.subtitle_language_layout = QHBoxLayout() self.subtitle_track_name_layout = QHBoxLayout() self.subtitle_set_default_layout = QHBoxLayout() self.subtitle_set_forced_layout = QHBoxLayout() self.buttons_layout.addWidget(QLabel(""), stretch=3) self.buttons_layout.addWidget(self.reset_button, stretch=2) self.buttons_layout.addWidget(self.yes_button, stretch=2) self.buttons_layout.addWidget(self.no_button, stretch=2) self.buttons_layout.addWidget(QLabel(""), stretch=3) self.subtitle_setting_layout = QGridLayout() self.subtitle_editable_setting_layout = QFormLayout() self.subtitle_editable_setting_layout.addRow(self.subtitle_name_label, self.subtitle_name_value) self.subtitle_editable_setting_layout.addRow( self.subtitle_track_name_label, self.subtitle_track_name_lineEdit) self.subtitle_editable_setting_layout.addRow( self.subtitle_language_label, self.subtitle_language_comboBox) self.subtitle_editable_setting_layout.addRow(self.subtitle_delay_label, self.subtitle_delay_spin) self.subtitle_editable_setting_layout.addRow( self.subtitle_set_default_label, self.subtitle_set_default_checkBox) self.subtitle_editable_setting_layout.addRow( self.subtitle_set_forced_label, self.subtitle_set_forced_checkBox) self.subtitle_setting_layout.addWidget(self.subtitle_tab_comboBox, 0, 0) self.subtitle_setting_layout.addLayout( self.subtitle_editable_setting_layout, 1, 0, 5, 2) self.subtitle_setting_layout.addWidget(self.messageIcon, 1, 3, 5, -1) self.main_layout = QGridLayout() self.main_layout.addLayout(self.subtitle_setting_layout, 0, 0, 2, 3) self.main_layout.addLayout(self.buttons_layout, 2, 0, 1, -1) self.main_layout.setContentsMargins(20, 20, 20, 20) self.setLayout(self.main_layout) self.setup_ui() self.signal_connect()
def _setup_ui(self, color): # Set up our basic layout layout = QHBoxLayout(self) self.setLayout(layout) layout.setSpacing(3) layout.setMargin(1) # Construct register groups for BR, ST, and SQ br_frame, self._br_value = self._create_reg(self._br_inds, 'BR', 2, color) st_frame, self._st_value = self._create_reg(self._st_inds, 'ST', 3, color) sq_frame, self._sq_value = self._create_reg(self._sq_inds, 'SQ', 7, color) layout.addWidget(br_frame) layout.addWidget(st_frame) layout.addWidget(sq_frame) stat_group = QWidget(self) layout.addWidget(stat_group) stat_layout = QGridLayout(stat_group) stat_layout.setMargin(0) stat_layout.setSpacing(0) col = 0 for name, label in STATUS_INDS.items(): self._status_inds[name] = self._create_status_light( label, stat_group, stat_layout, col) col += 1 # Create a grouping widget for the I label and decoded instruction value box label_value = QWidget(self) lv_layout = QHBoxLayout(label_value) lv_layout.setSpacing(3) lv_layout.setMargin(1) lv_layout.setContentsMargins(0, 32, 0, 0) label_value.setLayout(lv_layout) layout.addWidget(label_value) # Create a value box for displaying the overall decoded instruction self._inst_value = QLineEdit(label_value) self._inst_value.setReadOnly(True) self._inst_value.setMaximumSize(65, 32) self._inst_value.setText('TC0') font = QFont('Monospace') font.setStyleHint(QFont.TypeWriter) font.setPointSize(10) self._inst_value.setFont(font) self._inst_value.setAlignment(Qt.AlignCenter) lv_layout.addWidget(self._inst_value) # Create a label to show 'I' label = QLabel('I', label_value) font = label.font() font.setPointSize(14) font.setBold(True) label.setFont(font) lv_layout.addWidget(label) # Add some spacing to account for lack of parity indicators layout.addSpacing(52)
def __init__(self, prop, parent=None): super().__init__(prop, parent) self.edit_widget = QLineEdit() self.add_subwidget(self.edit_widget) self.edit_widget.editingFinished.connect(self.on_text_edited)
class Widget(QWidget): def __init__(self): QWidget.__init__(self) self.items = 0 # Example data self._data = { "Water": 24.5, "Electricity": 55.1, "Rent": 850.0, "Supermarket": 230.4, "Internet": 29.99, "Bars": 21.85, "Public transportation": 60.0, "Coffee": 22.45, "Restaurants": 120 } # Left self.table = QTableWidget() self.table.setColumnCount(2) self.table.setHorizontalHeaderLabels(["Description", "Price"]) self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # Chart self.chart_view = QtCharts.QChartView() self.chart_view.setRenderHint(QPainter.Antialiasing) # Right self.description = QLineEdit() self.price = QLineEdit() self.add = QPushButton("Add") self.clear = QPushButton("Clear") self.quit = QPushButton("Quit") self.plot = QPushButton("Plot") # Disabling 'Add' button self.add.setEnabled(False) self.right = QVBoxLayout() self.right.setMargin(10) self.right.addWidget(QLabel("Description")) self.right.addWidget(self.description) self.right.addWidget(QLabel("Price")) self.right.addWidget(self.price) self.right.addWidget(self.add) self.right.addWidget(self.plot) self.right.addWidget(self.chart_view) self.right.addWidget(self.clear) self.right.addWidget(self.quit) # QWidget Layout self.layout = QHBoxLayout() #self.table_view.setSizePolicy(size) self.layout.addWidget(self.table) self.layout.addLayout(self.right) # Set the layout to the QWidget self.setLayout(self.layout) # Signals and Slots self.add.clicked.connect(self.add_element) self.quit.clicked.connect(self.quit_application) self.plot.clicked.connect(self.plot_data) self.clear.clicked.connect(self.clear_table) self.description.textChanged[str].connect(self.check_disable) self.price.textChanged[str].connect(self.check_disable) # Fill example data self.fill_table() @Slot() def add_element(self): des = self.description.text() price = self.price.text() self.table.insertRow(self.items) description_item = QTableWidgetItem(des) price_item = QTableWidgetItem("{:.2f}".format(float(price))) price_item.setTextAlignment(Qt.AlignRight) self.table.setItem(self.items, 0, description_item) self.table.setItem(self.items, 1, price_item) self.description.setText("") self.price.setText("") self.items += 1 @Slot() def check_disable(self, s): if not self.description.text() or not self.price.text(): self.add.setEnabled(False) else: self.add.setEnabled(True) @Slot() def plot_data(self): # Get table information series = QtCharts.QPieSeries() for i in range(self.table.rowCount()): text = self.table.item(i, 0).text() number = float(self.table.item(i, 1).text()) series.append(text, number) chart = QtCharts.QChart() chart.addSeries(series) chart.legend().setAlignment(Qt.AlignLeft) self.chart_view.setChart(chart) @Slot() def quit_application(self): QApplication.quit() def fill_table(self, data=None): data = self._data if not data else data for desc, price in data.items(): description_item = QTableWidgetItem(desc) price_item = QTableWidgetItem("{:.2f}".format(price)) price_item.setTextAlignment(Qt.AlignRight) self.table.insertRow(self.items) self.table.setItem(self.items, 0, description_item) self.table.setItem(self.items, 1, price_item) self.items += 1 @Slot() def clear_table(self): self.table.setRowCount(0) self.items = 0
class PaperStatsPlots(PBDialog): """Class that constructs a window to show the results of `paperStats` """ def __init__(self, fig, title=None, parent=None): """Constructor. Defines some properties and buttons Parameters: fig: the figure to be shown title (optional): the window title parent (default None): the parent object, which should have a property lastPaperStats """ super(PaperStatsPlots, self).__init__(parent) self.fig = fig self.canvas = None if title is not None: self.setWindowTitle(title) layout = QGridLayout(self) layout.setSpacing(1) self.setLayout(layout) self.updatePlots() nlines = 1 self.layout().addWidget(PBLabel(igstr.lineMoreInfo), nlines + 1, 0) self.textBox = QLineEdit("") self.textBox.setReadOnly(True) self.layout().addWidget(self.textBox, nlines + 2, 0, 1, 2) self.saveButton = QPushButton(igstr.save, self) self.saveButton.clicked.connect(self.saveAction) self.layout().addWidget(self.saveButton, nlines + 3, 0) self.clButton = QPushButton(igstr.close, self) self.clButton.clicked.connect(self.onClose) self.clButton.setAutoDefault(True) self.layout().addWidget(self.clButton, nlines + 3, 1) def onClose(self): """Close dialog""" QDialog.close(self) def saveAction(self): """Save the plot into a file, after asking the directory where to save them """ savePath = askDirName(self, igstr.whereSavePlot) if savePath != "": try: self.parent().lastPaperStats["fig"] = pBStats.plotStats( paper=True, save=True, path=savePath) except AttributeError: pBGUILogger.warning("", exc_info=True) else: infoMessage(igstr.plotSaved) self.saveButton.setDisabled(True) def pickEvent(self, event): """Save into `self.textBox` the coordinates of the clicked object (`Line2D`) in the plot. Parameter: a `matplotlib.backend_bases.Event` """ ob = event.artist ix = -1 if isinstance(ob, Line2D): xdata = ob.get_xdata() ydata = ob.get_ydata() ind = event.ind formatString = igstr.xInDateIsD self.textBox.setText(formatString % ( igstr.citations, np.take(xdata, ind)[0].strftime(igstr.datefmt), np.take(ydata, ind)[0], )) def updatePlots(self): """Reset the dialog window removing all the previous items and create a new canvas for the figure. """ i = 0 while True: item = self.layout().takeAt(i) if item is None: break del item if hasattr(self, "canvas"): del self.canvas if self.fig is not None: self.canvas = FigureCanvas(self.fig) self.layout().addWidget(self.canvas, 0, 0, 1, 2) self.canvas.mpl_connect("pick_event", self.pickEvent) self.canvas.draw()
def testWithoutValidator(self): edit = QLineEdit() self.assertEqual(edit.text(), '') edit.insert('1') self.assertEqual(edit.text(), '1') edit.insert('a') self.assertEqual(edit.text(), '1a') edit.insert('2') self.assertEqual(edit.text(), '1a2')
def add_line(self, key): layout = QHBoxLayout() label = QLabel(self) name =str(key) label.setText(name) layout.addWidget(label) value = self.properties[key] if isinstance(value, (bool)): checkbox = QCheckBox(self) checkbox.setChecked(bool(value)) layout.addWidget(checkbox) checkbox.stateChanged.connect(partial(self.update_value, key=key, type_func=bool)) #self.connect(checkbox, QtCore.SIGNAL('stateChanged(int)'), partial(self.update_value, key=key, type_func=bool)) elif isinstance(value, (int, float, complex)): value = str(value) line_edit = QLineEdit(self) line_edit.setText(value) layout.addWidget(line_edit) line_edit.textChanged.connect(partial(self.update_value, key=key, type_func=float)) #self.connect(line_edit, QtCore.SIGNAL('textChanged(QString)'), partial(self.update_value, key=key, type_func=float)) elif isinstance(value, (int)): value = str(value) line_edit = QLineEdit(self) line_edit.setText(value) layout.addWidget(line_edit) line_edit.textChanged.connect(partial(self.update_value, key=key, type_func=int)) #self.connect(line_edit, QtCore.SIGNAL('textChanged(QString)'), partial(self.update_value, key=key, type_func=int)) elif isinstance(value, (str)): value = str(value) line_edit = QLineEdit(self) line_edit.setText(value) layout.addWidget(line_edit) line_edit.textChanged.connect(partial(self.update_value, key=key, type_func=str)) #self.connect(line_edit, QtCore.SIGNAL('textChanged(QString)'), partial(self.update_value, key=key, type_func=str)) elif isinstance(value, dict): button = QPushButton(self) button.setText("Set Values") button.setObjectName(key) button.clicked.connect(self.update_dictionary) #self.connect(button, QtCore.SIGNAL("clicked()"), self.update_dictionary) layout.addWidget(button) self.settingsVerticalLayout.addLayout(layout)
class InputWindow(QDialog): """Window where user can enter new data into a table. It returns the data formatted into a dictionary. platforms: the platforms from the currently loaded collection.""" def __init__(self, platforms, parent=None): super(InputWindow, self).__init__(parent=parent) self.setContentsMargins(5, 5, 5, 5) self._platforms = ['1292 Advanced Programmable Video System', '3DO', 'APF MP1000/Imagination Machine', 'Acorn 32-bit', 'Adventure Vision', 'Alice 32/90', 'Altair 680', 'Altair 8800', 'Amazon Alexa', 'Amiga', 'Amiga CD32', 'Amstrad CPC', 'Amstrad PCW', 'Android', 'Apple I', 'Apple II', 'Apple IIgs', 'Arcade', 'Arcadia 2001', 'Arduboy', 'Astral 2000', 'Atari 2600', 'Atari 5200', 'Atari 7800', 'Atari 8-bit', 'Atari ST', 'Atom', 'BBC Micro', 'BREW', 'Bally Astrocade', 'BeOS', 'BlackBerry', 'Blu-ray Disc Player', 'Browser', 'Bubble', 'CD-i', 'CDTV', 'CP/M', 'Camputers Lynx', 'Casio Loopy', 'Casio PV-1000', 'ClickStart', 'Coleco Adam', 'ColecoVision', 'Colour Genie', 'Commodore 128', 'Commodore 16, Plus/4', 'Commodore 64', 'Commodore PET/CBM', 'Compal 80', 'Compucolor I', 'Compucolor II', 'Compucorp Programmable Calculator', 'CreatiVision', 'DOS', 'DVD Player', 'Dedicated console', 'Dedicated handheld', 'Didj', 'DoJa', 'Dragon 32/64', 'ECD Micromind', 'Electron', 'Enterprise', 'Epoch Cassette Vision', 'Epoch Game Pocket Computer', 'Epoch Super Cassette Vision', 'ExEn', 'Exelvision', 'Exidy Sorcerer', 'Fairchild Channel F', 'Famicom Disk System', 'FM Towns', 'FM-7', 'FRED/COSMAC', 'Fire OS', 'Freebox', 'GIMINI', 'GNEX', 'GP2X', 'GP2X Wiz', 'GP32', 'GVM', 'Galaksija', 'Game Boy', 'Game Boy Advance', 'Game Boy Color', 'Game Gear', 'Game Wave', 'Game.Com', 'GameCube', 'GameStick', 'Genesis', 'Gizmondo', 'Glulx', 'HD DVD Player', 'HP 9800', 'HP Programmable Calculator', 'Heath/Zenith H8/H89', 'Heathkit H11', 'Hitachi S1', 'Hugo', 'HyperScan', 'IBM 5100', 'Ideal-Computer', 'Intel 8008', 'Intel 8080', 'Intellivision', 'Interton Video 2000', 'J2ME', 'Jaguar', 'Jolt', 'Jupiter Ace', 'KIM-1', 'Kindle Classic', 'Laser 200', 'LaserActive', 'LeapFrog Explorer', 'LeapTV', 'Leapster', 'Linux', 'Lynx', 'MOS Technology 6502', 'MRE', 'MSX', 'MSX 2', 'Macintosh', 'Maemo', 'Mainframe', 'Mattel Aquarius', 'MeeGo', 'Mega Drive', 'Memotech MTX', 'Microbee', 'Microtan 65', 'Microvision', 'Mophun', 'Motorola 6800', 'Motorola 68k', 'N-Gage', 'N-Gage (service)', 'NES', 'Nascom', 'Neo Geo AES', 'Neo Geo CD', 'Neo Geo MVS', 'Neo Geo Pocket', 'Neo Geo Pocket Color', 'Neo Geo X', 'New Nintendo 3DS', 'NewBrain', 'Newton', 'Nintendo 3DS', 'Nintendo 64', 'Nintendo DS', 'Nintendo DSi', 'Nintendo Switch', 'North Star', 'Noval 760', 'Nuon', 'OS/2', 'Oculus Go', 'Oculus Quest', 'Odyssey', 'Odyssey 2', 'Ohio Scientific', 'OnLive', 'Orao', 'Oric', 'Ouya', 'PC Booter', 'PC-6001', 'PC-8000', 'PC-88', 'PC-98', 'PC-FX', 'PS Vita', 'PSP', 'Palm OS', 'Philips VG 5000', 'Photo CD', 'Pippin', 'PlayStation', 'PlayStation 2', 'PlayStation 3', 'PlayStation 4', 'Playdia', 'Pokémon Mini', 'Pokitto', 'Poly-88', 'RCA Studio II', 'Roku', 'SAM Coupé', 'SC/MP', 'SD-200/270/290', 'SEGA 32X', 'SEGA CD', 'SEGA Dreamcast', 'SEGA Master System', 'SEGA Pico', 'SEGA Saturn', 'SG-1000', 'SK-VM', 'SMC-777', 'SNES', 'SRI-500/1000', 'SWTPC 6800', 'Sharp MZ-80B/2000/2500', 'Sharp MZ-80K/700/800/1500', 'Sharp X1', 'Sharp X68000', 'Sharp Zaurus', 'Signetics 2650', 'Sinclair QL', 'Sol-20', 'Sord M5', 'Spectravideo', 'Stadia', "Super A'can", 'SuperGrafx', 'Supervision', 'Symbian', 'TADS', 'TI Programmable Calculator', 'TI-99/4A', 'TIM', 'TRS-80', 'TRS-80 CoCo', 'TRS-80 MC-10', 'Taito X-55', 'Tatung Einstein', 'Tektronix 4050', 'Tele-Spiel ES-2201', 'Telstar Arcade', 'Terminal', 'Thomson MO', 'Thomson TO', 'Tiki 100', 'Timex Sinclair 2068', 'Tizen', 'Tomahawk F1', 'Tomy Tutor', 'TurboGrafx CD', 'TurboGrafx-16', 'V.Flash', 'V.Smile', 'VIC-20', 'VIS', 'Vectrex', 'VideoBrain', 'Videopac+ G7400', 'Virtual Boy', 'WIPI', 'Wang 2200', 'Wii', 'Wii U', 'Windows', 'Windows 3.x', 'Windows Apps', 'Windows Mobile', 'Windows Phone', 'WonderSwan', 'WonderSwan Color', 'XaviXPORT', 'Xbox', 'Xbox 360', 'Xbox One', 'Xerox Alto', 'Z-machine', 'ZX Spectrum', 'ZX Spectrum Next', 'ZX80', 'ZX81', 'Zeebo', 'Zilog Z80', 'Zilog Z8000', 'Zodiac', 'Zune', 'bada', 'digiBlast', 'iPad', 'iPhone', 'iPod Classic', 'tvOS', 'watchOS', 'webOS'] # Add any platforms in user's collection that doesn't exist in the platform list for platform in platforms: if platform not in self._platforms: self._platforms.append(platform) self._platforms.sort() # For holding the internal platforms column's data self._platformsData = "" self._dataTypes = ["Game", "Console", "Accessory"] self._dataTypeLabel = QLabel("Type\t ") self._dataType = QComboBox() self._dataType.addItems(self._dataTypes) self._dataType.currentIndexChanged.connect(self._changeWidgets) self._nameLabel = QLabel("Name\t ") self._name = QLineEdit() self._name.textChanged.connect(self._changeWidgets) self._platformLabel = QLabel("Platform\t ") self._platform = QComboBox() self._platform.view().setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self._platform.addItems(["", "(New platform)"]) self._platform.addItems(self._platforms) self._platform.currentIndexChanged.connect(self._addPlatform) self._autofillButton = QPushButton("Autofill") self._autofillButton.clicked.connect(self._autofill) self._autofillButton.setEnabled(False) self._regionLabel = QLabel("Region\t ") self._region = QComboBox() self._region.addItems(["NTSC (JP)", "NTSC (NA)", "PAL"]) self._countryLabel = QLabel("Country\t ") self._countryLabel.setEnabled(True) self._country = QLineEdit() self._country.setEnabled(True) self._publisherLabel = QLabel("Publisher\t") self._publisherLabel.setEnabled(True) self._publisher = QLineEdit() self._publisher.setEnabled(True) self._developerLabel = QLabel("Developer") self._developer = QLineEdit() self._developer.setEnabled(True) self._codeLabel = QLabel("Code\t ") self._code = QLineEdit() self._itemLabel = QLabel("Game") self._item = QCheckBox() self._boxLabel = QLabel("Box") self._box = QCheckBox() self._manualLabel = QLabel("Manual") self._manual = QCheckBox() self._yearLabel = QLabel("Year\t ") self._year = QLineEdit() self._genreLabel = QLabel("Genre\t ") self._genre = QLineEdit() self._paidLabel = QLabel("Paid price ") self._paid = QLineEdit("$0") self._commentLabel = QLabel("Comment") self._comment = QLineEdit() self._okButton = QPushButton() self._okButton.setText("OK") self._okButton.setMaximumSize(self._okButton.sizeHint()) self._okButton.clicked.connect(self.accept) self._cnclButton = QPushButton() self._cnclButton.setText("Cancel") self._cnclButton.setMaximumSize(self._cnclButton.sizeHint()) self._cnclButton.clicked.connect(self.reject) self._vbox = QVBoxLayout() self._vbox.addStretch() self._hboxType = QHBoxLayout() self._hboxType.addStretch() self._hboxName = QHBoxLayout() self._hboxName.addStretch() self._hboxPlatform = QHBoxLayout() self._hboxRegion = QHBoxLayout() self._hboxRegion.addStretch() self._hboxCode = QHBoxLayout() self._hboxCode.addStretch() self._hboxCountry = QHBoxLayout() self._hboxCountry.addStretch() self._hboxPublisher = QHBoxLayout() self._hboxDeveloper = QHBoxLayout() self._hboxBoxMan = QHBoxLayout() self._hboxYear = QHBoxLayout() self._hboxGenre = QHBoxLayout() self._hboxPaid = QHBoxLayout() self._hboxComment = QHBoxLayout() self._hboxComment.addStretch() self._hboxBtn = QHBoxLayout() self._hboxBtn.addStretch() self._hboxType.addWidget(self._dataTypeLabel, 0) self._hboxType.addWidget(self._dataType, 1) self._hboxName.addWidget(self._nameLabel, 0) self._hboxName.addWidget(self._name, 1) self._hboxPlatform.addWidget(self._platformLabel, 0) self._hboxPlatform.addWidget(self._platform, 1) self._hboxRegion.addWidget(self._regionLabel, 0) self._hboxRegion.addWidget(self._region, 1) self._hboxCountry.addWidget(self._countryLabel, 0) self._hboxCountry.addWidget(self._country, 1) self._hboxPublisher.addWidget(self._publisherLabel, 0) self._hboxPublisher.addSpacing(5) self._hboxPublisher.addWidget(self._publisher, 1) self._hboxDeveloper.addWidget(self._developerLabel, 0) self._hboxDeveloper.addWidget(self._developer, 1) self._hboxCode.addWidget(self._codeLabel, 0) self._hboxCode.addWidget(self._code, 1) self._hboxYear.addWidget(self._yearLabel, 0) self._hboxYear.addWidget(self._year, 1) self._hboxGenre.addWidget(self._genreLabel, 0) self._hboxGenre.addWidget(self._genre, 1) self._hboxPaid.addWidget(self._paidLabel, 0) self._hboxPaid.addWidget(self._paid, 1) self._hboxComment.addWidget(self._commentLabel, 0) self._hboxComment.addSpacing(2) self._hboxComment.addWidget(self._comment, 1) self._hboxBoxMan.addStretch(10) self._hboxBoxMan.addWidget(self._itemLabel, 0) self._hboxBoxMan.addWidget(self._item, 1) self._hboxBoxMan.addStretch(5) self._hboxBoxMan.addWidget(self._boxLabel, 2) self._hboxBoxMan.addWidget(self._box, 3) self._hboxBoxMan.addStretch(5) self._hboxBoxMan.addWidget(self._manualLabel, 4) self._hboxBoxMan.addWidget(self._manual, 5) self._hboxBoxMan.addStretch(10) self._hboxBtn.addWidget(self._autofillButton, 0, Qt.AlignLeft) self._hboxBtn.addStretch(10) self._hboxBtn.addWidget(self._okButton, 1) self._hboxBtn.addWidget(self._cnclButton, 2) self._vbox.addLayout(self._hboxType, 0) self._vbox.addLayout(self._hboxName, 1) self._vbox.addLayout(self._hboxPlatform, 2) self._vbox.addLayout(self._hboxRegion, 3) self._vbox.addLayout(self._hboxPublisher, 4) self._vbox.addLayout(self._hboxDeveloper, 5) self._vbox.addLayout(self._hboxCountry, 6) self._vbox.addLayout(self._hboxCode, 7) self._vbox.addLayout(self._hboxYear, 8) self._vbox.addLayout(self._hboxGenre, 9) self._vbox.addLayout(self._hboxPaid, 10) self._vbox.addLayout(self._hboxComment, 11) self._vbox.addLayout(self._hboxBoxMan, 12) self._vbox.addLayout(self._hboxBtn, 13) self.setLayout(self._vbox) self.setWindowTitle("Add to collection") self.setFixedSize(QSize(500, 340)) self._center() def _addPlatform(self): if (self._platform.currentText() not in ("", "(New platform)") and self._name.text() != "" and not self._name.text().isspace()): self._autofillButton.setEnabled(True) else: self._autofillButton.setEnabled(False) if self._platform.currentText() == "(New platform)": while True: platform, ok = QInputDialog.getText(self, "Add platform", "Platform name:") if ok: if platform == "" or platform.isspace(): self._displayMsgBox(0) else: lastIndex = self._platform.count() self._platform.addItem(platform) self._platform.setCurrentIndex(lastIndex) break else: break def _autofill(self): name = self._name.text() platform = self._platform.currentText() country = self._country.text() region = self._region.currentText() if name == "" or platform == "" or name.isspace() or platform.isspace(): self._displayMsgBox(1) else: # Fill in missing info info = getMobyRelease(name, platform, region, country) if info["publisher"] == "": self._displayMsgBox(2) return publisher = info["publisher"] developer = info["developer"] platforms = info["platforms"] genre = info["genre"] code = info["code"] year = info["year"] if year == "" and code == "" and country != "": # Can't find release for country self._displayMsgBox(3) elif year == "" and code == "": # Can't find release at all self._displayMsgBox(4) else: self._year.setText(year) self._code.setText(code) self._genre.setText(genre) self._publisher.setText(publisher) self._developer.setText(developer) self._platformsData = platforms def _center(self): """Centers window on screen""" qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def _changeWidgets(self): """Changes the label widgets based on what type of data is being entered""" if self._dataType.currentIndex() == 0: self._codeLabel.setEnabled(True) self._code.setEnabled(True) self._countryLabel.setEnabled(True) self._country.setEnabled(True) self._codeLabel.setText("Code\t ") self._itemLabel.setText("Game") self._genreLabel.setEnabled(True) self._genre.setEnabled(True) if (self._name.text() != "" and not self._name.text().isspace() and self._platform.currentText() not in ("", "(New platform)")): self._autofillButton.setEnabled(True) else: self._autofillButton.setEnabled(False) elif self._dataType.currentIndex() == 1: self._codeLabel.setEnabled(True) self._code.setEnabled(True) self._countryLabel.setEnabled(True) self._country.setEnabled(True) self._codeLabel.setText("Serial No\t ") self._itemLabel.setText("Console") self._genreLabel.setEnabled(False) self._genre.setEnabled(False) self._autofillButton.setEnabled(False) elif self._dataType.currentIndex() == 2: self._countryLabel.setEnabled(True) self._country.setEnabled(True) self._codeLabel.setEnabled(False) self._code.setEnabled(False) self._itemLabel.setText("Accessory") self._genreLabel.setEnabled(False) self._genre.setEnabled(False) self._autofillButton.setEnabled(False) def _displayMsgBox(self, value: int, level=QMessageBox.Warning): titles = ["Invalid platform", "Missing data", "No title found", "No info found for country", "No info found"] messages = ["Can't add empty string or whitespace.", "Please enter both a name and a platform.", "Couldn't find any info on that title. Is the spelling and platform correct?", "Couldn't find any info for that country. Is the region correct?", "Sorry, couldn't find any info about this title."] msgBox = QMessageBox() msgBox.setIcon(level) msgBox.setWindowTitle(titles[value]) msgBox.setText("<h2>" + titles[value] + "</h2>") msgBox.setInformativeText(messages[value]) msgBox.exec_() def returnData(self): data = None if self._dataType.currentIndex() == 0: data = {"platform": self._platform.currentText(), "name": self._name.text(), "region": self._region.currentText(), "code": self._code.text(), "game": "Yes" if self._item.isChecked() else "No", "box": "Yes" if self._box.isChecked() else "No", "manual": "Yes" if self._manual.isChecked() else "No", "year": self._year.text(), "genre": self._genre.text(), "price": ",".join((self._paid.text(), "$0", "$0", "$0")), "comment": self._comment.text(), "publisher": self._publisher.text(), "developer": self._developer.text(), "platforms": self._platformsData } elif self._dataType.currentIndex() == 1: data = {"platform": self._platform.currentText(), "name": self._name.text(), "region": self._region.currentText(), "country": self._country.text(), "serial number": self._code.text(), "console": "Yes" if self._item.isChecked() else "No", "box": "Yes" if self._box.isChecked() else "No", "manual": "Yes" if self._manual.isChecked() else "No", "year": self._year.text(), "price": ",".join((self._paid.text(), "$0", "$0", "$0")), "comment": self._comment.text() } elif self._dataType.currentIndex() == 2: data = {"platform": self._platform.currentText(), "name": self._name.text(), "region": self._region.currentText(), "country": self._country.text(), "accessory": "Yes" if self._item.isChecked() else "No", "box": "Yes" if self._box.isChecked() else "No", "manual": "Yes" if self._manual.isChecked() else "No", "year": self._year.text(), "price": ",".join((self._paid.text(), "$0", "$0", "$0")), "comment": self._comment.text() } return data
def initialise(self): self.settingsFile = os.path.join(self.findNukeHomeDir(), "deadline_settings.ini") print("Loading settings: " + self.settingsFile) # Initialize the submission settings. self.settings = QSettings(self.settingsFile, QSettings.IniFormat) print("Grabbing submitter info...") try: dcOutput = CallDeadlineCommand([ "-prettyJSON", "-GetSubmissionInfo", "Pools", "Groups", "MaxPriority", "TaskLimit", "UserHomeDir", "RepoDir:submission/Hiero/Main", "RepoDir:submission/Integration/Main", ], useDeadlineBg=True) output = json.loads(dcOutput, encoding="utf-8") except ValueError as e: print("Unable to get submitter info from Deadline:\n\n" + e.message) raise if output["ok"]: self.submissionInfo = output["result"] else: raise ValueError( "DeadlineCommand returned a bad result and was unable to grab the submitter info.\n\n" + output["result"]) # Get the Deadline temp directory. deadlineHome = self.submissionInfo["UserHomeDir"].strip() self.deadlineTemp = os.path.join(deadlineHome, "temp") self.integrationDir = self.submissionInfo["RepoDirs"][ "submission/Integration/Main"].strip() # Get maximum priority. maximumPriority = self.submissionInfo["MaxPriority"] # Collect the pools and groups. pools = self.submissionInfo["Pools"] secondaryPools = [""] secondaryPools.extend(pools) groups = self.submissionInfo["Groups"] # Set up the other default arrays. onJobComplete = ("Nothing", "Archive", "Delete") nukeVersions = ("6.0", "6.1", "6.2", "6.3", "6.4", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3", "8.4", "9.0", "9.1", "9.2", "9.3", "9.4", "10.0", "10.1", "10.2", "10.3", "10.4", "11.0", "11.1", "11.2", "11.3") buildsToForce = ("None", "32bit", "64bit") # Main Window mainWindow = hiero.ui.mainWindow() dialog = QDialog(mainWindow) self.dialog = dialog dialog.setWindowTitle("Submit to Deadline (and render with Nuke)") # Main Layout topLayout = QVBoxLayout() dialog.setLayout(topLayout) tabWidget = QTabWidget(dialog) jobTab = QWidget() jobTabLayout = QVBoxLayout() jobTab.setLayout(jobTabLayout) # Job Info Layout jobInfoGroupBox = QGroupBox("Job Description") jobTabLayout.addWidget(jobInfoGroupBox) jobInfoLayout = QGridLayout() jobInfoGroupBox.setLayout(jobInfoLayout) # Job Name jobInfoLayout.addWidget(QLabel("Job Name"), 0, 0) jobNameWidget = QLineEdit(self.settings.value("JobName", "")) jobInfoLayout.addWidget(jobNameWidget, 0, 1) # Comment jobInfoLayout.addWidget(QLabel("Comment"), 1, 0) commentWidget = QLineEdit(self.settings.value("Comment", "")) jobInfoLayout.addWidget(commentWidget, 1, 1) # Department jobInfoLayout.addWidget(QLabel("Department"), 2, 0) departmentWidget = QLineEdit(self.settings.value("Department", "")) jobInfoLayout.addWidget(departmentWidget, 2, 1) # Job Options Layout jobOptionsGroupBox = QGroupBox("Job Options") jobTabLayout.addWidget(jobOptionsGroupBox) jobOptionsLayout = QGridLayout() jobOptionsGroupBox.setLayout(jobOptionsLayout) # Pool jobOptionsLayout.addWidget(QLabel("Pool"), 0, 0) poolWidget = QComboBox() for pool in pools: poolWidget.addItem(pool) defaultPool = self.settings.value("Pool", "none") defaultIndex = poolWidget.findText(defaultPool) if defaultIndex != -1: poolWidget.setCurrentIndex(defaultIndex) jobOptionsLayout.addWidget(poolWidget, 0, 1, 1, 3) # Secondary Pool jobOptionsLayout.addWidget(QLabel("Secondary Pool"), 1, 0) secondaryPoolWidget = QComboBox() for secondaryPool in secondaryPools: secondaryPoolWidget.addItem(secondaryPool) defaultSecondaryPool = self.settings.value("SecondaryPool", "") defaultIndex = secondaryPoolWidget.findText(defaultSecondaryPool) if defaultIndex != -1: secondaryPoolWidget.setCurrentIndex(defaultIndex) jobOptionsLayout.addWidget(secondaryPoolWidget, 1, 1, 1, 3) # Group jobOptionsLayout.addWidget(QLabel("Group"), 2, 0) groupWidget = QComboBox() for group in groups: groupWidget.addItem(group) defaultGroup = self.settings.value("Group", "none") defaultIndex = groupWidget.findText(defaultGroup) if defaultIndex != -1: groupWidget.setCurrentIndex(defaultIndex) jobOptionsLayout.addWidget(groupWidget, 2, 1, 1, 3) # Priority initPriority = int(self.settings.value("Priority", "50")) if initPriority > maximumPriority: initPriority = maximumPriority / 2 jobOptionsLayout.addWidget(QLabel("Priority"), 3, 0) priorityWidget = QSpinBox() priorityWidget.setRange(0, maximumPriority) priorityWidget.setValue(initPriority) jobOptionsLayout.addWidget(priorityWidget, 3, 1) # Task Timeout jobOptionsLayout.addWidget(QLabel("Task Timeout"), 4, 0) taskTimeoutWidget = QSpinBox() taskTimeoutWidget.setRange(0, 1000000) taskTimeoutWidget.setValue(int(self.settings.value("TaskTimeout", "0"))) jobOptionsLayout.addWidget(taskTimeoutWidget, 4, 1) # Auto Task Timeout autoTaskTimeoutWidget = QCheckBox("Enable Auto Task Timeout") autoTaskTimeoutWidget.setChecked( strtobool(self.settings.value("AutoTaskTimeout", "False"))) jobOptionsLayout.addWidget(autoTaskTimeoutWidget, 4, 2) # Concurrent Tasks jobOptionsLayout.addWidget(QLabel("Concurrent Tasks"), 5, 0) concurrentTasksWidget = QSpinBox() concurrentTasksWidget.setRange(1, 16) concurrentTasksWidget.setValue( int(self.settings.value("ConcurrentTasks", "1"))) jobOptionsLayout.addWidget(concurrentTasksWidget, 5, 1) # Limit Tasks To Slave's Task Limit limitConcurrentTasksWidget = QCheckBox( "Limit Tasks To Slave's Task Limit") limitConcurrentTasksWidget.setChecked( strtobool(self.settings.value("LimitConcurrentTasks", "True"))) jobOptionsLayout.addWidget(limitConcurrentTasksWidget, 5, 2) # Machine Limit jobOptionsLayout.addWidget(QLabel("Machine Limit"), 6, 0) machineLimitWidget = QSpinBox() machineLimitWidget.setRange(0, 1000000) machineLimitWidget.setValue( int(self.settings.value("MachineLimit", "1"))) jobOptionsLayout.addWidget(machineLimitWidget, 6, 1) # Machine List Is A Blacklist isBlacklistWidget = QCheckBox("Machine List Is A Blacklist") isBlacklistWidget.setChecked( strtobool(self.settings.value("IsBlacklist", "False"))) jobOptionsLayout.addWidget(isBlacklistWidget, 6, 2) # Machine List jobOptionsLayout.addWidget(QLabel("Machine List"), 7, 0) machineListWidget = QLineEdit(self.settings.value("MachineList", "")) jobOptionsLayout.addWidget(machineListWidget, 7, 1, 1, 2) def browseMachineList(): output = CallDeadlineCommand( ["-selectmachinelist", str(machineListWidget.text())], False) output = output.replace("\r", "").replace("\n", "") if output != "Action was cancelled by user": machineListWidget.setText(output) machineListButton = QPushButton("Browse") machineListButton.pressed.connect(browseMachineList) jobOptionsLayout.addWidget(machineListButton, 7, 3) # Limits jobOptionsLayout.addWidget(QLabel("Limits"), 8, 0) limitsWidget = QLineEdit(self.settings.value("Limits", "")) jobOptionsLayout.addWidget(limitsWidget, 8, 1, 1, 2) def browseLimitList(): output = CallDeadlineCommand( ["-selectlimitgroups", str(limitsWidget.text())], False) output = output.replace("\r", "").replace("\n", "") if output != "Action was cancelled by user": limitsWidget.setText(output) limitsButton = QPushButton("Browse") limitsButton.pressed.connect(browseLimitList) jobOptionsLayout.addWidget(limitsButton, 8, 3) # On Job Complete jobOptionsLayout.addWidget(QLabel("On Job Complete"), 9, 0) onJobCompleteWidget = QComboBox() for option in onJobComplete: onJobCompleteWidget.addItem(option) defaultOption = self.settings.value("OnJobComplete", "Nothing") defaultIndex = onJobCompleteWidget.findText(defaultOption) if defaultIndex != -1: onJobCompleteWidget.setCurrentIndex(defaultIndex) jobOptionsLayout.addWidget(onJobCompleteWidget, 9, 1) # Submit Job As Suspended submitSuspendedWidget = QCheckBox("Submit Job As Suspended") submitSuspendedWidget.setChecked( strtobool(self.settings.value("SubmitSuspended", "False"))) jobOptionsLayout.addWidget(submitSuspendedWidget, 9, 2) # Nuke Options nukeOptionsGroupBox = QGroupBox("Nuke Options") jobTabLayout.addWidget(nukeOptionsGroupBox) nukeOptionsLayout = QGridLayout() nukeOptionsGroupBox.setLayout(nukeOptionsLayout) # Version nukeOptionsLayout.addWidget(QLabel("Version"), 0, 0) versionWidget = QComboBox() for version in nukeVersions: versionWidget.addItem(version) defaultVersion = self.settings.value("Version", "7.0") defaultIndex = versionWidget.findText(defaultVersion) if defaultIndex != -1: versionWidget.setCurrentIndex(defaultIndex) nukeOptionsLayout.addWidget(versionWidget, 0, 1) # Submit Nuke Script File With Job submitScriptWidget = QCheckBox("Submit Nuke Script File With Job") submitScriptWidget.setChecked( strtobool(self.settings.value("SubmitScript", "False"))) nukeOptionsLayout.addWidget(submitScriptWidget, 0, 2) # Build To Force nukeOptionsLayout.addWidget(QLabel("Build To Force"), 1, 0) buildWidget = QComboBox() for build in buildsToForce: buildWidget.addItem(build) defaultBuild = self.settings.value("Build", "None") defaultIndex = buildWidget.findText(defaultBuild) if defaultIndex != -1: buildWidget.setCurrentIndex(defaultIndex) nukeOptionsLayout.addWidget(buildWidget, 1, 1) # Render With NukeX useNukeXWidget = QCheckBox("Render With NukeX") useNukeXWidget.setChecked( strtobool(self.settings.value("UseNukeX", "False"))) nukeOptionsLayout.addWidget(useNukeXWidget, 1, 2) # Max RAM Usage (MB) nukeOptionsLayout.addWidget(QLabel("Max RAM Usage (MB)"), 2, 0) memoryWidget = QSpinBox() memoryWidget.setRange(0, 5000) memoryWidget.setValue(int(self.settings.value("Memory", "0"))) nukeOptionsLayout.addWidget(memoryWidget, 2, 1) # Continue On Error continueOnErrorWidget = QCheckBox("Continue On Error") continueOnErrorWidget.setChecked( strtobool(self.settings.value("ContinueOnError", "False"))) nukeOptionsLayout.addWidget(continueOnErrorWidget, 2, 2) # Threads nukeOptionsLayout.addWidget(QLabel("Threads"), 3, 0) threadsWidget = QSpinBox() threadsWidget.setRange(0, 256) threadsWidget.setValue(int(self.settings.value("Threads", "0"))) nukeOptionsLayout.addWidget(threadsWidget, 3, 1) # Use Batch Mode batchModeWidget = QCheckBox("Use Batch Mode") batchModeWidget.setChecked( strtobool(self.settings.value("BatchMode", "False"))) nukeOptionsLayout.addWidget(batchModeWidget, 3, 2) # Frames Per Task nukeOptionsLayout.addWidget(QLabel("Frames Per Task"), 4, 0) framesPerTaskWidget = QSpinBox() framesPerTaskWidget.setRange(1, 1000000) framesPerTaskWidget.setValue( int(self.settings.value("FramesPerTask", "1"))) nukeOptionsLayout.addWidget(framesPerTaskWidget, 4, 1) nukeOptionsLayout.addWidget( QLabel("(this only affects non-movie jobs)"), 4, 2) tabWidget.addTab(jobTab, "Job Options") # Button Box (Extra work required to get the custom ordering we want) self.pipelineToolStatusLabel.setAlignment(Qt.AlignRight | Qt.AlignVCenter) pipelineToolStatus = self.retrievePipelineToolStatus() self.updatePipelineToolStatusLabel(pipelineToolStatus) integrationButton = QPushButton("Pipeline Tools") integrationButton.clicked.connect(self.OpenIntegrationWindow) submitButton = QPushButton("Submit") submitButton.clicked.connect(dialog.accept) submitButton.setDefault(True) cancelButton = QPushButton("Cancel") cancelButton.clicked.connect(dialog.reject) buttonGroupBox = QGroupBox() buttonLayout = QGridLayout() buttonLayout.setColumnStretch( 0, 1) # Makes the pipeline status label expand, not the buttons buttonGroupBox.setLayout(buttonLayout) buttonGroupBox.setAlignment(Qt.AlignRight) buttonGroupBox.setFlat(True) buttonLayout.addWidget(self.pipelineToolStatusLabel, 0, 0) buttonLayout.addWidget(integrationButton, 0, 1) buttonLayout.addWidget(submitButton, 0, 2) buttonLayout.addWidget(cancelButton, 0, 3) topLayout.addWidget(tabWidget) topLayout.addWidget(buttonGroupBox) # Show the dialog. result = (dialog.exec_() == QDialog.DialogCode.Accepted) if result: # Need to pass integration dir path to render task self.settings.setValue("IntegrationDir", self.integrationDir) self.settings.setValue("JobName", jobNameWidget.text()) self.settings.setValue("Comment", commentWidget.text()) self.settings.setValue("Department", departmentWidget.text()) self.settings.setValue("Pool", poolWidget.currentText()) self.settings.setValue("SecondaryPool", secondaryPoolWidget.currentText()) self.settings.setValue("Group", groupWidget.currentText()) self.settings.setValue("Priority", priorityWidget.value()) self.settings.setValue("TaskTimeout", taskTimeoutWidget.value()) self.settings.setValue("AutoTaskTimeout", str(autoTaskTimeoutWidget.isChecked())) self.settings.setValue("ConcurrentTasks", concurrentTasksWidget.value()) self.settings.setValue("LimitConcurrentTasks", str(limitConcurrentTasksWidget.isChecked())) self.settings.setValue("MachineLimit", machineLimitWidget.value()) self.settings.setValue("IsBlacklist", str(isBlacklistWidget.isChecked())) self.settings.setValue("MachineList", machineListWidget.text()) self.settings.setValue("Limits", limitsWidget.text()) self.settings.setValue("OnJobComplete", onJobCompleteWidget.currentText()) self.settings.setValue("SubmitSuspended", str(submitSuspendedWidget.isChecked())) self.settings.setValue("Version", versionWidget.currentText()) self.settings.setValue("SubmitScript", str(submitScriptWidget.isChecked())) self.settings.setValue("Build", buildWidget.currentText()) self.settings.setValue("UseNukeX", str(useNukeXWidget.isChecked())) self.settings.setValue("FramesPerTask", framesPerTaskWidget.value()) self.settings.setValue("ContinueOnError", str(continueOnErrorWidget.isChecked())) self.settings.setValue("Threads", threadsWidget.value()) self.settings.setValue("BatchMode", str(batchModeWidget.isChecked())) self.settings.setValue("Memory", memoryWidget.value()) print("Saving settings: " + self.settingsFile) self.settings.sync() else: print("Submission canceled") self.settings = None # Not sure if there is a better way to stop the export process. This works, but it leaves all the tasks # in the Queued state. self.setError("Submission was canceled")
class DependsOn(QDialog): def __init__(self, addr: int, operand, instr=None, func: Optional[Function]=None, parent=None): super().__init__(parent) self._addr = addr self._operand = operand self._instruction = instr self._function = func # output self.location: Optional[int] = None self.arg: Optional = None self.reg: Optional = None # UI widgets self._instr_layout: QHBoxLayout = None self._func_layout: QHBoxLayout = None self._arg_widget: QWidget = None self._reg_widget: QWidget = None self._before_radio: QRadioButton = None self._after_radio: QRadioButton = None self._arg_layout: QVBoxLayout = None self._arg_radiobox: QRadioButton = None self._arg_box: QLineEdit = None self._reg_layout: QVBoxLayout = None self._reg_radiobox: QRadioButton = None self._reg_box: QLineEdit = None self._init_widgets() def _init_widgets(self): # the instruction instr_lbl = QLabel("Instruction") instr_box = QLineEdit("TODO") instr_box.setReadOnly(True) self._instr_layout = QHBoxLayout() self._instr_layout.addWidget(instr_lbl) self._instr_layout.addWidget(instr_box) # the function func_lbl = QLabel("Function") func_box = QLineEdit("TODO") func_box.setReadOnly(True) self._func_layout = QHBoxLayout() self._func_layout.addWidget(func_lbl) self._func_layout.addWidget(func_box) # # location # location_group = QGroupBox("Location") self._before_radio = QRadioButton("Before the instruction") self._after_radio = QRadioButton("After the instruction") location_layout = QVBoxLayout() location_layout.addWidget(self._before_radio) location_layout.addWidget(self._after_radio) location_layout.addStretch(1) self._before_radio.setChecked(True) location_group.setLayout(location_layout) # # target atoms # # function argument self._arg_radiobox = QRadioButton("Function argument") self._arg_radiobox.clicked.connect(self._on_targetatoms_radiobutton_clicked) self._arg_box = QLineEdit("") # register self._reg_radiobox = QRadioButton("Register") self._reg_radiobox.clicked.connect(self._on_targetatoms_radiobutton_clicked) self._reg_box = QLineEdit("") atom_type_group = QGroupBox("Atom type") atom_type_layout = QVBoxLayout() atom_type_layout.addWidget(self._arg_radiobox) # atom_type_layout.addWidget(self._reg_radiobox) atom_type_layout.addStretch(1) atom_type_group.setLayout(atom_type_layout) atom_layout = QVBoxLayout() arg_layout = QHBoxLayout() arg_lbl = QLabel("Argument index") self._arg_widget = QWidget() self._arg_widget.setLayout(arg_layout) arg_layout.addWidget(arg_lbl) arg_layout.addWidget(self._arg_box) reg_layout = QHBoxLayout() reg_lbl = QLabel("Register name") self._reg_widget = QWidget() self._reg_widget.setLayout(reg_layout) reg_layout.addWidget(reg_lbl) reg_layout.addWidget(self._reg_box) atom_layout.addWidget(self._arg_widget) atom_layout.addWidget(self._reg_widget) self._arg_radiobox.setChecked(True) self._reg_widget.setHidden(True) # # buttons # ok_btn = QPushButton("OK") ok_btn.clicked.connect(self._on_ok_clicked) cancel_btn = QPushButton("Cancel") cancel_btn.clicked.connect(self._on_cancel_clicked) buttons_layout = QHBoxLayout() buttons_layout.addWidget(ok_btn) buttons_layout.addWidget(cancel_btn) layout = QVBoxLayout() if self._function is not None: func_box.setText(function_prototype_str(self._function)) layout.addLayout(self._func_layout) else: layout.addLayout(self._instr_layout) layout.addWidget(location_group) layout.addWidget(atom_type_group) layout.addLayout(atom_layout) layout.addLayout(buttons_layout) self.setLayout(layout) # # Events # def _targetatoms_hide_all(self): self._arg_widget.setHidden(True) self._reg_widget.setHidden(True) def _on_targetatoms_radiobutton_clicked(self): self._targetatoms_hide_all() if self._arg_radiobox.isChecked(): self._arg_widget.setHidden(False) elif self._reg_radiobox.isChecked(): self._reg_widget.setHidden(False) def _on_ok_clicked(self): if self._before_radio.isChecked(): self.location = OP_BEFORE else: self.location = OP_AFTER if self._arg_radiobox.isChecked(): try: self.arg = int(self._arg_box.text()) except ValueError: # invalid argument index QMessageBox(self).critical(self, "Invalid argument index", "The given function argument index \"%s\" is unsupported. Only integers are allowed." % self._arg_box.text(), buttons=QMessageBox.Ok, ) return else: raise NotImplementedError() self.close() def _on_cancel_clicked(self): self.location = None self.arg = None self.reg = None self.close()
def _init_widgets(self): # the instruction instr_lbl = QLabel("Instruction") instr_box = QLineEdit("TODO") instr_box.setReadOnly(True) self._instr_layout = QHBoxLayout() self._instr_layout.addWidget(instr_lbl) self._instr_layout.addWidget(instr_box) # the function func_lbl = QLabel("Function") func_box = QLineEdit("TODO") func_box.setReadOnly(True) self._func_layout = QHBoxLayout() self._func_layout.addWidget(func_lbl) self._func_layout.addWidget(func_box) # # location # location_group = QGroupBox("Location") self._before_radio = QRadioButton("Before the instruction") self._after_radio = QRadioButton("After the instruction") location_layout = QVBoxLayout() location_layout.addWidget(self._before_radio) location_layout.addWidget(self._after_radio) location_layout.addStretch(1) self._before_radio.setChecked(True) location_group.setLayout(location_layout) # # target atoms # # function argument self._arg_radiobox = QRadioButton("Function argument") self._arg_radiobox.clicked.connect(self._on_targetatoms_radiobutton_clicked) self._arg_box = QLineEdit("") # register self._reg_radiobox = QRadioButton("Register") self._reg_radiobox.clicked.connect(self._on_targetatoms_radiobutton_clicked) self._reg_box = QLineEdit("") atom_type_group = QGroupBox("Atom type") atom_type_layout = QVBoxLayout() atom_type_layout.addWidget(self._arg_radiobox) # atom_type_layout.addWidget(self._reg_radiobox) atom_type_layout.addStretch(1) atom_type_group.setLayout(atom_type_layout) atom_layout = QVBoxLayout() arg_layout = QHBoxLayout() arg_lbl = QLabel("Argument index") self._arg_widget = QWidget() self._arg_widget.setLayout(arg_layout) arg_layout.addWidget(arg_lbl) arg_layout.addWidget(self._arg_box) reg_layout = QHBoxLayout() reg_lbl = QLabel("Register name") self._reg_widget = QWidget() self._reg_widget.setLayout(reg_layout) reg_layout.addWidget(reg_lbl) reg_layout.addWidget(self._reg_box) atom_layout.addWidget(self._arg_widget) atom_layout.addWidget(self._reg_widget) self._arg_radiobox.setChecked(True) self._reg_widget.setHidden(True) # # buttons # ok_btn = QPushButton("OK") ok_btn.clicked.connect(self._on_ok_clicked) cancel_btn = QPushButton("Cancel") cancel_btn.clicked.connect(self._on_cancel_clicked) buttons_layout = QHBoxLayout() buttons_layout.addWidget(ok_btn) buttons_layout.addWidget(cancel_btn) layout = QVBoxLayout() if self._function is not None: func_box.setText(function_prototype_str(self._function)) layout.addLayout(self._func_layout) else: layout.addLayout(self._instr_layout) layout.addWidget(location_group) layout.addWidget(atom_type_group) layout.addLayout(atom_layout) layout.addLayout(buttons_layout) self.setLayout(layout)
class JoinDialog(QDialog): def __init__(self, parent=None): super(JoinDialog, self).__init__(parent) # formatting self.setWindowTitle("Join room") # validator regexp = QtCore.QRegExp('[A-Za-z0-9_]+') validator = QtGui.QRegExpValidator(regexp) # widgets self.room_nameInput = QLineEdit() self.room_nameInput.setValidator(validator) self.passwordInput = QLineEdit() self.passwordInput.setValidator(validator) self.passwordInput.setEchoMode(QLineEdit.Password) # OK and Cancel buttons self.buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) self.buttons.button(QDialogButtonBox.Ok).setText('Join') self.buttons.setCenterButtons(True) # signals self.room_nameInput.textChanged.connect(self.check_input) self.room_nameInput.textChanged.emit(self.room_nameInput.text()) self.passwordInput.textChanged.connect(self.check_input) self.passwordInput.textChanged.emit(self.passwordInput.text()) # layout self.mainLayout = QVBoxLayout(self) self.mainLayout.addWidget(self.room_nameInput) self.mainLayout.addWidget(self.passwordInput) self.mainLayout.addWidget(self.buttons) self.buttons.accepted.connect(self.accept) self.buttons.rejected.connect(self.reject) # self.buttons.setEnabled(False) self.room_nameInput.setFocus() def check_input(self, *args, **kwargs): sender = self.sender() validator = sender.validator() state = validator.validate(sender.text(), 0)[0] if state == QtGui.QValidator.Acceptable: color = '#ffffff' elif state == QtGui.QValidator.Intermediate: color = '#ffffff' else: color = '#f6989d' # red sender.setStyleSheet('QLineEdit { background-color: %s }' % color) # get current data from the dialog def get_room_nameInput(self): return self.room_nameInput.text() # get current data from the dialog def getPasswordInput(self): return self.passwordInput.text() # static method to create the dialog and return (date, time, accepted) @staticmethod def run(parent=None): dialog = JoinDialog(parent) result = dialog.exec_() room_name = dialog.get_room_nameInput() password = dialog.getPasswordInput() return room_name, password, result == QDialog.Accepted
def testWithIntValidator(self): edit = QLineEdit() edit.setValidator(BlankIntValidator(edit)) self.assertEqual(edit.text(), '') edit.insert('1') self.assertEqual(edit.text(), '1') edit.insert('a') self.assertEqual(edit.text(), '1') edit.insert('2') self.assertEqual(edit.text(), '12')
class ExportSrt(QDialog): def __init__(self): super().__init__() self.setWindowTitle('输出.srt时间轴文件') self.resize(550, 350) self.layout = QGridLayout() self.setLayout(self.layout) self.startPos = QTimeEdit() self.startPos.setDisplayFormat('hh:mm:ss.zzz') self.layout.addWidget(QLabel('开始位置'), 0, 0, 1, 3) self.layout.addWidget(self.startPos, 0, 2, 1, 3) self.endPos = QTimeEdit() self.endPos.setDisplayFormat('hh:mm:ss.zzz') self.layout.addWidget(QLabel('结束位置'), 0, 6, 1, 3) self.layout.addWidget(self.endPos, 0, 8, 1, 3) self.timeMarkType = QComboBox() self.timeMarkType.addItems(['相对时间', '绝对时间']) self.layout.addWidget(QLabel('记录方式'), 1, 0, 1, 3) self.layout.addWidget(self.timeMarkType, 1, 2, 1, 3) self.offset = QTimeEdit() self.offset.setDisplayFormat('hh:mm:ss.zzz') self.layout.addWidget(QLabel('时间轴偏移'), 1, 6, 1, 4) self.layout.addWidget(self.offset, 1, 8, 1, 3) self.layout.addWidget(QLabel('最大无效时长(毫秒)'), 2, 0, 1, 6) self.maxIgnore = QLineEdit() self.layout.addWidget(self.maxIgnore, 2, 4, 1, 4) self.maxIgnore.setText("100") self.layout.addWidget(QLabel('最大合并间隔(毫秒)'), 3, 0, 1, 6) self.maxMerge = QLineEdit() self.layout.addWidget(self.maxMerge, 3, 4, 1, 4) self.maxMerge.setText("100") self.mergeOrIgnore = QComboBox() self.mergeOrIgnore.addItems(['优先合并', '优先忽略']) self.layout.addWidget(QLabel('合并&忽略优先设置'), 4, 0, 1, 6) self.layout.addWidget(self.mergeOrIgnore, 4, 4, 1, 3) self.isExportUnnumbering = QCheckBox() self.layout.addWidget(self.isExportUnnumbering, 5, 0, 1, 1) self.layout.addWidget(QLabel('同时导出无编号.srt文件'), 5, 1, 1, 6) self.saveDir = QLineEdit() self.layout.addWidget(self.saveDir, 6, 0, 1, 6) self.setPath = QPushButton('保存位置') self.layout.addWidget(self.setPath, 6, 6, 1, 1) self.setPath.clicked.connect(self.choosePath) self.exportSrt = QPushButton('导出文件') self.cancel = QPushButton('取消') self.help = QPushButton('帮助') self.layout.addWidget(self.exportSrt, 7, 0, 1, 2) self.layout.addWidget(self.cancel, 7, 2, 1, 2) self.layout.addWidget(self.help, 7, 4, 1, 2) self.exportSrt.clicked.connect(self.execExportSrt) self.cancel.clicked.connect(self.closeWindow) self.help.clicked.connect(self.dispHelp) def setDefault(self, autoSub, videoDuration): self.autoSub = autoSub self.endPos.setTime(ms2QTime(videoDuration)) def closeWindow(self): self.destroy(True, True) def dispHelp(self): self.helpContents = '''- 开始位置 & 结束位置:.srt文件开始及结束的时间点 - 记录方式:记录原始视频的绝对时间,或是以开始位置为0记录相对时间 - 时间轴偏移:时间点位置整体调整 - 最大无效时长:语音段时长不超过这个值时,该语音段会被忽略。0:不忽略任何语音段 - 最大合并间隔:两个语音段之间的空白时长不超过这个值时,两个语音段将被合并。0:不合并任何语音段 - 合并&忽略优先设置:如果一个语音段同时可以被合并以及被忽略,设置指定进行哪个操作''' self.helpPage = QMessageBox() self.helpPage.setText(self.helpContents) self.helpPage.show() def choosePath(self): subtitlePath = QFileDialog.getSaveFileName(self, "选择文件夹", '', "字幕文件 (*.srt)")[0] if subtitlePath: self.saveDir.setText(subtitlePath) def execExportSrt(self): voiceCntRaw = len(self.autoSub) if voiceCntRaw == 0: self.timeNotFound = QMessageBox() self.timeNotFound.setText("没有找到时间轴信息。") self.timeNotFound.show() return startPos = QTime2ms(self.startPos.time()) endPos = QTime2ms(self.endPos.time())
class MainWindow(QWidget): """ Main UI Window """ def __init__(self, parent=None): """ Initialize the chess board. """ super().__init__(parent) self.setWindowTitle("PyChess") self.resize(1280, 720) self.svgWidget = QSvgWidget(parent=self) self.svgWidget.setGeometry(10, 10, 700, 700) self.boardSize = min(self.svgWidget.width(), self.svgWidget.height()) self.margin = 0.05 * self.boardSize self.squareSize = (self.boardSize - 2 * self.margin) / 8 self.board = chess.Board() self.pieceToMove = [None, None] self.drawBoard() self.enginePath = "Use double \ instead of \ when on Windows system." self.time = 0.1 self.maxtimelabel = QLabel("Max. time per move(in s):") self.engineLabel = QLabel("Enter path to engine:") self.engineButton = QPushButton("Find move") self.moveButton = QPushButton("Make move") self.undoButton = QPushButton("Undo move") self.undoButton.setMaximumWidth(175) self.pathField = QLineEdit() self.engineTime = QLineEdit() self.engineResult = QLineEdit() self.pathField.setText( "Use double \ instead of \ when on Windows system.") self.main_layout = QHBoxLayout() self.tool_layout = QGridLayout() self.tool_layout.addWidget(self.engineLabel, 0, 0) self.tool_layout.addWidget(self.pathField, 0, 1) self.tool_layout.addWidget(self.maxtimelabel, 1, 0) self.tool_layout.addWidget(self.engineTime, 1, 1) self.tool_layout.addWidget(self.engineButton, 2, 0) self.tool_layout.addWidget(self.engineResult, 2, 1) self.tool_layout.addWidget(self.moveButton, 3, 0) self.tool_layout.addWidget(self.undoButton, 3, 1) self.main_layout.addWidget(self.svgWidget, 55) self.main_layout.addLayout(self.tool_layout, 45) self.setLayout(self.main_layout) self.engineButton.clicked.connect(self.find_move) self.moveButton.clicked.connect(self.make_move) self.undoButton.clicked.connect(self.undo_move) @Slot(QWidget) def mousePressEvent(self, event): """ Handles the left mouse click and enables moving the chess pieces by first clicking on the chess piece and then on the target square. """ if event.x() <= self.boardSize and event.y() <= self.boardSize: if self.margin < event.x( ) < self.boardSize - self.margin and self.margin < event.y( ) < self.boardSize - self.margin: if event.buttons() == Qt.LeftButton: file = int((event.x() - self.margin) / self.squareSize) rank = 7 - int((event.y() - self.margin) / self.squareSize) square = chess.square(file, rank) piece = self.board.piece_at(square) coordinates = "{}{}".format(chr(file + 97), str(rank + 1)) if self.pieceToMove[0] is not None: move = chess.Move.from_uci("{}{}".format( self.pieceToMove[1], coordinates)) if move in self.board.legal_moves: self.board.push(move) piece = None coordinates = None self.pieceToMove = [piece, coordinates] self.drawBoard() def drawBoard(self): """ Draw a chess board for the starting position and then redraw it for every move. """ self.svgBoard = self.board._repr_svg_().encode("UTF-8") self.svgDrawBoard = self.svgWidget.load(self.svgBoard) return self.svgDrawBoard def find_move(self): """ Calculate the best move according to Stockfish """ self.enginePath = self.pathField.text() self.time = float(self.engineTime.text()) engine = chess.engine.SimpleEngine.popen_uci(self.enginePath) result = engine.play(self.board, chess.engine.Limit(time=self.time)) self.engineResult.setText(str(result.move)) engine.quit() return result.move def make_move(self): """ Finds and plays the best move """ move = self.find_move() self.board.push(move) self.drawBoard() def undo_move(self): """ Undo the last move played on the board """ self.board.pop() self.drawBoard()
def __init__(self): QWidget.__init__(self) self.items = 0 # Example data self._data = { "Water": 24.5, "Electricity": 55.1, "Rent": 850.0, "Supermarket": 230.4, "Internet": 29.99, "Bars": 21.85, "Public transportation": 60.0, "Coffee": 22.45, "Restaurants": 120 } # Left self.table = QTableWidget() self.table.setColumnCount(2) self.table.setHorizontalHeaderLabels(["Description", "Price"]) self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # Chart self.chart_view = QtCharts.QChartView() self.chart_view.setRenderHint(QPainter.Antialiasing) # Right self.description = QLineEdit() self.price = QLineEdit() self.add = QPushButton("Add") self.clear = QPushButton("Clear") self.quit = QPushButton("Quit") self.plot = QPushButton("Plot") # Disabling 'Add' button self.add.setEnabled(False) self.right = QVBoxLayout() self.right.setMargin(10) self.right.addWidget(QLabel("Description")) self.right.addWidget(self.description) self.right.addWidget(QLabel("Price")) self.right.addWidget(self.price) self.right.addWidget(self.add) self.right.addWidget(self.plot) self.right.addWidget(self.chart_view) self.right.addWidget(self.clear) self.right.addWidget(self.quit) # QWidget Layout self.layout = QHBoxLayout() #self.table_view.setSizePolicy(size) self.layout.addWidget(self.table) self.layout.addLayout(self.right) # Set the layout to the QWidget self.setLayout(self.layout) # Signals and Slots self.add.clicked.connect(self.add_element) self.quit.clicked.connect(self.quit_application) self.plot.clicked.connect(self.plot_data) self.clear.clicked.connect(self.clear_table) self.description.textChanged[str].connect(self.check_disable) self.price.textChanged[str].connect(self.check_disable) # Fill example data self.fill_table()
def __init__(self, platforms, parent=None): super(InputWindow, self).__init__(parent=parent) self.setContentsMargins(5, 5, 5, 5) self._platforms = ['1292 Advanced Programmable Video System', '3DO', 'APF MP1000/Imagination Machine', 'Acorn 32-bit', 'Adventure Vision', 'Alice 32/90', 'Altair 680', 'Altair 8800', 'Amazon Alexa', 'Amiga', 'Amiga CD32', 'Amstrad CPC', 'Amstrad PCW', 'Android', 'Apple I', 'Apple II', 'Apple IIgs', 'Arcade', 'Arcadia 2001', 'Arduboy', 'Astral 2000', 'Atari 2600', 'Atari 5200', 'Atari 7800', 'Atari 8-bit', 'Atari ST', 'Atom', 'BBC Micro', 'BREW', 'Bally Astrocade', 'BeOS', 'BlackBerry', 'Blu-ray Disc Player', 'Browser', 'Bubble', 'CD-i', 'CDTV', 'CP/M', 'Camputers Lynx', 'Casio Loopy', 'Casio PV-1000', 'ClickStart', 'Coleco Adam', 'ColecoVision', 'Colour Genie', 'Commodore 128', 'Commodore 16, Plus/4', 'Commodore 64', 'Commodore PET/CBM', 'Compal 80', 'Compucolor I', 'Compucolor II', 'Compucorp Programmable Calculator', 'CreatiVision', 'DOS', 'DVD Player', 'Dedicated console', 'Dedicated handheld', 'Didj', 'DoJa', 'Dragon 32/64', 'ECD Micromind', 'Electron', 'Enterprise', 'Epoch Cassette Vision', 'Epoch Game Pocket Computer', 'Epoch Super Cassette Vision', 'ExEn', 'Exelvision', 'Exidy Sorcerer', 'Fairchild Channel F', 'Famicom Disk System', 'FM Towns', 'FM-7', 'FRED/COSMAC', 'Fire OS', 'Freebox', 'GIMINI', 'GNEX', 'GP2X', 'GP2X Wiz', 'GP32', 'GVM', 'Galaksija', 'Game Boy', 'Game Boy Advance', 'Game Boy Color', 'Game Gear', 'Game Wave', 'Game.Com', 'GameCube', 'GameStick', 'Genesis', 'Gizmondo', 'Glulx', 'HD DVD Player', 'HP 9800', 'HP Programmable Calculator', 'Heath/Zenith H8/H89', 'Heathkit H11', 'Hitachi S1', 'Hugo', 'HyperScan', 'IBM 5100', 'Ideal-Computer', 'Intel 8008', 'Intel 8080', 'Intellivision', 'Interton Video 2000', 'J2ME', 'Jaguar', 'Jolt', 'Jupiter Ace', 'KIM-1', 'Kindle Classic', 'Laser 200', 'LaserActive', 'LeapFrog Explorer', 'LeapTV', 'Leapster', 'Linux', 'Lynx', 'MOS Technology 6502', 'MRE', 'MSX', 'MSX 2', 'Macintosh', 'Maemo', 'Mainframe', 'Mattel Aquarius', 'MeeGo', 'Mega Drive', 'Memotech MTX', 'Microbee', 'Microtan 65', 'Microvision', 'Mophun', 'Motorola 6800', 'Motorola 68k', 'N-Gage', 'N-Gage (service)', 'NES', 'Nascom', 'Neo Geo AES', 'Neo Geo CD', 'Neo Geo MVS', 'Neo Geo Pocket', 'Neo Geo Pocket Color', 'Neo Geo X', 'New Nintendo 3DS', 'NewBrain', 'Newton', 'Nintendo 3DS', 'Nintendo 64', 'Nintendo DS', 'Nintendo DSi', 'Nintendo Switch', 'North Star', 'Noval 760', 'Nuon', 'OS/2', 'Oculus Go', 'Oculus Quest', 'Odyssey', 'Odyssey 2', 'Ohio Scientific', 'OnLive', 'Orao', 'Oric', 'Ouya', 'PC Booter', 'PC-6001', 'PC-8000', 'PC-88', 'PC-98', 'PC-FX', 'PS Vita', 'PSP', 'Palm OS', 'Philips VG 5000', 'Photo CD', 'Pippin', 'PlayStation', 'PlayStation 2', 'PlayStation 3', 'PlayStation 4', 'Playdia', 'Pokémon Mini', 'Pokitto', 'Poly-88', 'RCA Studio II', 'Roku', 'SAM Coupé', 'SC/MP', 'SD-200/270/290', 'SEGA 32X', 'SEGA CD', 'SEGA Dreamcast', 'SEGA Master System', 'SEGA Pico', 'SEGA Saturn', 'SG-1000', 'SK-VM', 'SMC-777', 'SNES', 'SRI-500/1000', 'SWTPC 6800', 'Sharp MZ-80B/2000/2500', 'Sharp MZ-80K/700/800/1500', 'Sharp X1', 'Sharp X68000', 'Sharp Zaurus', 'Signetics 2650', 'Sinclair QL', 'Sol-20', 'Sord M5', 'Spectravideo', 'Stadia', "Super A'can", 'SuperGrafx', 'Supervision', 'Symbian', 'TADS', 'TI Programmable Calculator', 'TI-99/4A', 'TIM', 'TRS-80', 'TRS-80 CoCo', 'TRS-80 MC-10', 'Taito X-55', 'Tatung Einstein', 'Tektronix 4050', 'Tele-Spiel ES-2201', 'Telstar Arcade', 'Terminal', 'Thomson MO', 'Thomson TO', 'Tiki 100', 'Timex Sinclair 2068', 'Tizen', 'Tomahawk F1', 'Tomy Tutor', 'TurboGrafx CD', 'TurboGrafx-16', 'V.Flash', 'V.Smile', 'VIC-20', 'VIS', 'Vectrex', 'VideoBrain', 'Videopac+ G7400', 'Virtual Boy', 'WIPI', 'Wang 2200', 'Wii', 'Wii U', 'Windows', 'Windows 3.x', 'Windows Apps', 'Windows Mobile', 'Windows Phone', 'WonderSwan', 'WonderSwan Color', 'XaviXPORT', 'Xbox', 'Xbox 360', 'Xbox One', 'Xerox Alto', 'Z-machine', 'ZX Spectrum', 'ZX Spectrum Next', 'ZX80', 'ZX81', 'Zeebo', 'Zilog Z80', 'Zilog Z8000', 'Zodiac', 'Zune', 'bada', 'digiBlast', 'iPad', 'iPhone', 'iPod Classic', 'tvOS', 'watchOS', 'webOS'] # Add any platforms in user's collection that doesn't exist in the platform list for platform in platforms: if platform not in self._platforms: self._platforms.append(platform) self._platforms.sort() # For holding the internal platforms column's data self._platformsData = "" self._dataTypes = ["Game", "Console", "Accessory"] self._dataTypeLabel = QLabel("Type\t ") self._dataType = QComboBox() self._dataType.addItems(self._dataTypes) self._dataType.currentIndexChanged.connect(self._changeWidgets) self._nameLabel = QLabel("Name\t ") self._name = QLineEdit() self._name.textChanged.connect(self._changeWidgets) self._platformLabel = QLabel("Platform\t ") self._platform = QComboBox() self._platform.view().setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self._platform.addItems(["", "(New platform)"]) self._platform.addItems(self._platforms) self._platform.currentIndexChanged.connect(self._addPlatform) self._autofillButton = QPushButton("Autofill") self._autofillButton.clicked.connect(self._autofill) self._autofillButton.setEnabled(False) self._regionLabel = QLabel("Region\t ") self._region = QComboBox() self._region.addItems(["NTSC (JP)", "NTSC (NA)", "PAL"]) self._countryLabel = QLabel("Country\t ") self._countryLabel.setEnabled(True) self._country = QLineEdit() self._country.setEnabled(True) self._publisherLabel = QLabel("Publisher\t") self._publisherLabel.setEnabled(True) self._publisher = QLineEdit() self._publisher.setEnabled(True) self._developerLabel = QLabel("Developer") self._developer = QLineEdit() self._developer.setEnabled(True) self._codeLabel = QLabel("Code\t ") self._code = QLineEdit() self._itemLabel = QLabel("Game") self._item = QCheckBox() self._boxLabel = QLabel("Box") self._box = QCheckBox() self._manualLabel = QLabel("Manual") self._manual = QCheckBox() self._yearLabel = QLabel("Year\t ") self._year = QLineEdit() self._genreLabel = QLabel("Genre\t ") self._genre = QLineEdit() self._paidLabel = QLabel("Paid price ") self._paid = QLineEdit("$0") self._commentLabel = QLabel("Comment") self._comment = QLineEdit() self._okButton = QPushButton() self._okButton.setText("OK") self._okButton.setMaximumSize(self._okButton.sizeHint()) self._okButton.clicked.connect(self.accept) self._cnclButton = QPushButton() self._cnclButton.setText("Cancel") self._cnclButton.setMaximumSize(self._cnclButton.sizeHint()) self._cnclButton.clicked.connect(self.reject) self._vbox = QVBoxLayout() self._vbox.addStretch() self._hboxType = QHBoxLayout() self._hboxType.addStretch() self._hboxName = QHBoxLayout() self._hboxName.addStretch() self._hboxPlatform = QHBoxLayout() self._hboxRegion = QHBoxLayout() self._hboxRegion.addStretch() self._hboxCode = QHBoxLayout() self._hboxCode.addStretch() self._hboxCountry = QHBoxLayout() self._hboxCountry.addStretch() self._hboxPublisher = QHBoxLayout() self._hboxDeveloper = QHBoxLayout() self._hboxBoxMan = QHBoxLayout() self._hboxYear = QHBoxLayout() self._hboxGenre = QHBoxLayout() self._hboxPaid = QHBoxLayout() self._hboxComment = QHBoxLayout() self._hboxComment.addStretch() self._hboxBtn = QHBoxLayout() self._hboxBtn.addStretch() self._hboxType.addWidget(self._dataTypeLabel, 0) self._hboxType.addWidget(self._dataType, 1) self._hboxName.addWidget(self._nameLabel, 0) self._hboxName.addWidget(self._name, 1) self._hboxPlatform.addWidget(self._platformLabel, 0) self._hboxPlatform.addWidget(self._platform, 1) self._hboxRegion.addWidget(self._regionLabel, 0) self._hboxRegion.addWidget(self._region, 1) self._hboxCountry.addWidget(self._countryLabel, 0) self._hboxCountry.addWidget(self._country, 1) self._hboxPublisher.addWidget(self._publisherLabel, 0) self._hboxPublisher.addSpacing(5) self._hboxPublisher.addWidget(self._publisher, 1) self._hboxDeveloper.addWidget(self._developerLabel, 0) self._hboxDeveloper.addWidget(self._developer, 1) self._hboxCode.addWidget(self._codeLabel, 0) self._hboxCode.addWidget(self._code, 1) self._hboxYear.addWidget(self._yearLabel, 0) self._hboxYear.addWidget(self._year, 1) self._hboxGenre.addWidget(self._genreLabel, 0) self._hboxGenre.addWidget(self._genre, 1) self._hboxPaid.addWidget(self._paidLabel, 0) self._hboxPaid.addWidget(self._paid, 1) self._hboxComment.addWidget(self._commentLabel, 0) self._hboxComment.addSpacing(2) self._hboxComment.addWidget(self._comment, 1) self._hboxBoxMan.addStretch(10) self._hboxBoxMan.addWidget(self._itemLabel, 0) self._hboxBoxMan.addWidget(self._item, 1) self._hboxBoxMan.addStretch(5) self._hboxBoxMan.addWidget(self._boxLabel, 2) self._hboxBoxMan.addWidget(self._box, 3) self._hboxBoxMan.addStretch(5) self._hboxBoxMan.addWidget(self._manualLabel, 4) self._hboxBoxMan.addWidget(self._manual, 5) self._hboxBoxMan.addStretch(10) self._hboxBtn.addWidget(self._autofillButton, 0, Qt.AlignLeft) self._hboxBtn.addStretch(10) self._hboxBtn.addWidget(self._okButton, 1) self._hboxBtn.addWidget(self._cnclButton, 2) self._vbox.addLayout(self._hboxType, 0) self._vbox.addLayout(self._hboxName, 1) self._vbox.addLayout(self._hboxPlatform, 2) self._vbox.addLayout(self._hboxRegion, 3) self._vbox.addLayout(self._hboxPublisher, 4) self._vbox.addLayout(self._hboxDeveloper, 5) self._vbox.addLayout(self._hboxCountry, 6) self._vbox.addLayout(self._hboxCode, 7) self._vbox.addLayout(self._hboxYear, 8) self._vbox.addLayout(self._hboxGenre, 9) self._vbox.addLayout(self._hboxPaid, 10) self._vbox.addLayout(self._hboxComment, 11) self._vbox.addLayout(self._hboxBoxMan, 12) self._vbox.addLayout(self._hboxBtn, 13) self.setLayout(self._vbox) self.setWindowTitle("Add to collection") self.setFixedSize(QSize(500, 340)) self._center()
def testTupleReturn(self): text = QLineEdit("PySide bug 632") text.setTextMargins(10, 20, 30, 40) (a, b, c, d) = text.getTextMargins() self.assert_((a, b, c, d), (10, 20, 30, 40))