class WriteModeWidget(QWidget): def __init__(self, parent=None): super(WriteModeWidget, self).__init__(parent) self.initUI() def initUI(self): self.writr_mode_title = QLabel('导出设置') self.write_button = QCheckBox('导出docx') self.write_every_link_a_file = QRadioButton('每个链接对应一个文件') self.write_links_to_one_file = QRadioButton('保存为一个文件') self.write_mode_core_box = QVBoxLayout() self.write_mode_core_box.addWidget(self.write_every_link_a_file) self.write_mode_core_box.addWidget(self.write_links_to_one_file) self.write_mode_surface_box = QHBoxLayout() self.write_mode_surface_box.addSpacing(25) self.write_mode_surface_box.addLayout(self.write_mode_core_box) self.writr_mode_box = QVBoxLayout() self.writr_mode_title.setAlignment(Qt.AlignCenter) self.writr_mode_box.addWidget(self.writr_mode_title) self.writr_mode_box.addWidget(self.write_button) self.writr_mode_box.addLayout(self.write_mode_surface_box) self.write = True self.write_button.toggle() self.writr_mode = 'multi' self.write_every_link_a_file.toggle() self.write_mode_button_group = QButtonGroup() self.write_mode_button_group.addButton(self.write_every_link_a_file) self.write_mode_button_group.addButton(self.write_links_to_one_file) self.write_button.stateChanged.connect(self.onWriteButtonClicked) self.write_mode_button_group.buttonClicked.connect( self.onWriteModeButtonClicked) self.setLayout(self.writr_mode_box) def onWriteButtonClicked(self, state): if state == Qt.Checked: self.write = True self.setWriteModeButtonGroupEnabled(True) else: self.write = False self.setWriteModeButtonGroupEnabled(False) def onWriteModeButtonClicked(self): if self.write_mode_button_group.checkedButton( ) is self.write_every_link_a_file: self.writr_mode = 'multi' elif self.write_mode_button_group.checkedButton( ) is self.write_links_to_one_file: self.writr_mode = 'one' def setWriteModeButtonGroupEnabled(self, bool): self.write_every_link_a_file.setEnabled(bool) self.write_links_to_one_file.setEnabled(bool) def getMode(self): return self.write, self.writr_mode
class Pencere(QWidget): def __init__(self): super().__init__() self.yerlesim = QVBoxLayout(self) self.radyo1 = QRadioButton("Kadın", self) self.radyo2 = QRadioButton("Erkek", self) self.dugme = QPushButton("Tamam", self) self.yazi = QLabel("Erkek cinsiyetini seçtiniz.", self) self.dugmeGrubu = QButtonGroup(self) self.dugmeGrubu.addButton(self.radyo1) self.dugmeGrubu.addButton(self.radyo2) self.yerlesim.addWidget(self.radyo1) self.yerlesim.addWidget(self.radyo2) self.yerlesim.addWidget(self.dugme) self.yerlesim.addWidget(self.yazi) self.dugme.clicked.connect(self.tiklandi) def tiklandi(self): if self.dugmeGrubu.checkedButton(): metin = self.dugmeGrubu.checkedButton().text( ) + " cinsiyetini seçtiniz." self.yazi.setText(metin)
class LabelButtonGroup(QWidget): def __init__(self, label = '', buttons = {'UJ object reference value': 'Name to show'}): super(LabelButtonGroup, self).__init__() self.label = QLabel() self.label.setText(label) self.button_group = QButtonGroup() self.buttons = {} self.layout = QHBoxLayout() self.layout.setContentsMargins(0,0,0,0) self.layout.addWidget(self.label) for button_key in buttons.keys(): self.buttons[button_key] = QRadioButton(buttons[button_key]) self.button_group.addButton(self.buttons[button_key]) self.layout.addWidget(self.buttons[button_key]) def show(self): for button in self.buttons.values(): button.show() self.label.show() def hide(self): for button in self.buttons.values(): button.hide() self.label.hide() def set_text(self, key): if key != '': self.buttons[key].setChecked(1) def text(self): return self.button_group.checkedButton().text() def checked(self): return self.button_group.checkedButton()
def get_btn_group_value(button_group: QtWidgets.QButtonGroup) -> Optional[Any]: """Retuns the value of data_item attribute of the selected button. """ try: return button_group.checkedButton().data_item except AttributeError: return None
class DyStockSelectAddColumnsDlg(QDialog): def __init__(self, data, title, parent=None): super().__init__(parent) self._data = data self._initUi(title) def _initUi(self, title): self.setWindowTitle('添加{0}列'.format(title)) # 控件 increaseColumnsLable = QLabel('基准日期几日{0}'.format(title)) self._increaseColumnsLineEdit = QLineEdit( ','.join(self._data['days']) if self._data else '1,2,3,4,5,10') # 前 & 后 forwardRadioButton = QRadioButton('向前') backwardRadioButton = QRadioButton('向后') backwardRadioButton.setChecked(True) # 添加到QButtonGroup self._wardButtonGroup = QButtonGroup() self._wardButtonGroup.addButton(forwardRadioButton, 1) self._wardButtonGroup.addButton(backwardRadioButton, 2) cancelPushButton = QPushButton('Cancel') okPushButton = QPushButton('OK') cancelPushButton.clicked.connect(self._cancel) okPushButton.clicked.connect(self._ok) # 布局 grid = QGridLayout() grid.setSpacing(10) grid.addWidget(increaseColumnsLable, 0, 0, 1, 2) grid.addWidget(self._increaseColumnsLineEdit, 1, 0, 1, 2) grid.addWidget(forwardRadioButton, 2, 0) grid.addWidget(backwardRadioButton, 2, 1) grid.addWidget(okPushButton, 3, 1) grid.addWidget(cancelPushButton, 3, 0) self.setLayout(grid) self.setMinimumWidth(QApplication.desktop().size().width() // 5) def _ok(self): checkedButton = self._wardButtonGroup.checkedButton() text = checkedButton.text() self._data['backward'] = True if text == '向后' else False self._data['days'] = [ int(x) for x in self._increaseColumnsLineEdit.text().split(',') ] self.accept() def _cancel(self): self.reject()
class Window(QWidget): def __init__(self): super().__init__() self.resize(200, 200) self.setWindowTitle('Buttongroup') # Widgets self.radiolist = [] self.radios = QButtonGroup() for i in range(20): b = QRadioButton(f'Radio {i + 1}') self.radiolist.append(b) self.radios.addButton(b) self.radios.buttonClicked.connect(self.button_func) self.output = QLabel('Before check!') # Layout vBox = QVBoxLayout() for i in range(len(self.radiolist)): vBox.addWidget(self.radiolist[i]) vBox.addWidget(self.output) self.setLayout(vBox) self.show() def button_func(self): self.output.setText('A button was clicked!') txt_of_button = self.radios.checkedButton().text() self.output.setText(str(txt_of_button))
class DyStockSelectAddColumnsDlg(QDialog): def __init__(self, data, title, parent=None): super().__init__(parent) self._data = data self._initUi(title) def _initUi(self, title): self.setWindowTitle('添加{0}列'.format(title)) # 控件 increaseColumnsLable = QLabel('基准日期几日{0}'.format(title)) self._increaseColumnsLineEdit = QLineEdit(','.join(self._data['days']) if self._data else '2,3,4,5,10' ) # 前 & 后 forwardRadioButton = QRadioButton('向前') backwardRadioButton = QRadioButton('向后'); backwardRadioButton.setChecked(True) # 添加到QButtonGroup self._wardButtonGroup = QButtonGroup() self._wardButtonGroup.addButton(forwardRadioButton, 1); self._wardButtonGroup.addButton(backwardRadioButton, 2) cancelPushButton = QPushButton('Cancel') okPushButton = QPushButton('OK') cancelPushButton.clicked.connect(self._cancel) okPushButton.clicked.connect(self._ok) # 布局 grid = QGridLayout() grid.setSpacing(10) grid.addWidget(increaseColumnsLable, 0, 0, 1, 2) grid.addWidget(self._increaseColumnsLineEdit, 1, 0, 1, 2) grid.addWidget(forwardRadioButton, 2, 0) grid.addWidget(backwardRadioButton, 2, 1) grid.addWidget(okPushButton, 3, 1) grid.addWidget(cancelPushButton, 3, 0) self.setLayout(grid) self.setMinimumWidth(QApplication.desktop().size().width()//5) def _ok(self): checkedButton = self._wardButtonGroup.checkedButton() text = checkedButton.text() self._data['backward'] = True if text == '向后' else False self._data['days'] = [int(x) for x in self._increaseColumnsLineEdit.text().split(',')] self.accept() def _cancel(self): self.reject()
class PixelSizeWidget(QWidget): pixelSizeChanged = pyqtSignal(int) def __init__(self): super(PixelSizeWidget, self).__init__() self._layout = QHBoxLayout() self._button_group = QButtonGroup() self._button_group.buttonClicked.connect(self._on_btn_checked) self._1pxButton = QPushButton() self._1pxButton.setCheckable(True) self._1pxButton.setProperty("pixel_size", 1) icon = QIcon() icon.addPixmap(QPixmap(":/icons/ico_1px"), QIcon.Normal, QIcon.Off) self._1pxButton.setIcon(icon) self._1pxButton.setIconSize(QSize(21, 21)) self._2pxButton = QPushButton() self._2pxButton.setCheckable(True) self._2pxButton.setProperty("pixel_size", 2) icon = QIcon() icon.addPixmap(QPixmap(":/icons/ico_2px"), QIcon.Normal, QIcon.Off) self._2pxButton.setIcon(icon) self._2pxButton.setIconSize(QSize(21, 21)) self._4pxButton = QPushButton() self._4pxButton.setCheckable(True) self._4pxButton.setProperty("pixel_size", 4) icon = QIcon() icon.addPixmap(QPixmap(":/icons/ico_4px"), QIcon.Normal, QIcon.Off) self._4pxButton.setIcon(icon) self._4pxButton.setIconSize(QSize(21, 21)) self._button_group.addButton(self._1pxButton, 0) self._button_group.addButton(self._2pxButton, 1) self._button_group.addButton(self._4pxButton, 2) self._layout.addWidget(self._1pxButton) self._layout.addWidget(self._2pxButton) self._layout.addWidget(self._4pxButton) self._1pxButton.setChecked(True) self.setLayout(self._layout) def _on_btn_checked(self): pixel_size = self._button_group.checkedButton().property("pixel_size") self.pixelSizeChanged.emit(pixel_size)
class ButtonListWidget(QGroupBox): selectionChanged = pyqtSignal(object) def __init__(self, name, parent=None): QGroupBox.__init__(self, name, parent) self.setLayout(FloatingLayout()) self.name = name self.button_group = QButtonGroup() self.button_group.setExclusive(False) self.buttons = {} def create_button(self, button_name): button = QPushButton(button_name) button.setFlat(True) button.setCheckable(True) button.clicked.connect(self.clickedButton) return button def add_button(self, button_name): button = self.create_button(button_name) self.buttons[button_name] = button self.layout().addWidget(button) self.button_group.addButton(button) return button def get_button(self, button_name): return self.buttons[button_name] def toggleChecked(self, button_name, apply=True): selection = None for button in self.button_group.buttons(): if button.text() != button_name: button.setChecked(False) else: if apply: button.setChecked(not button.isChecked()) if button.isChecked(): selection = button_name self.selectionChanged.emit(selection) def clickedButton(self): button_name = str(self.sender().text()) self.toggleChecked(button_name, False) #for button in self.button_group.buttons(): #if button is not self.sender(): #button.setChecked(False) #print "sender:", label_name def get_checked_button(self): return self.button_group.checkedButton()
class PromotionDialog(QDialog): """ BRIEF A dialog used to decide what to promote a pawn to """ def __init__(self, parent=None): """ BRIF Initialize the dialog with buttons """ super().__init__(parent, Qt.WindowSystemMenuHint | Qt.WindowTitleHint) self.setWindowTitle("Promotion") radio_q = QRadioButton("q") radio_r = QRadioButton("r") radio_b = QRadioButton("b") radio_n = QRadioButton("n") self.button_group = QButtonGroup() self.button_group.addButton(radio_q) self.button_group.addButton(radio_r) self.button_group.addButton(radio_b) self.button_group.addButton(radio_n) radio_q.setChecked(True) radio_h_layout = QHBoxLayout() radio_h_layout.addWidget(radio_q) radio_h_layout.addWidget(radio_r) radio_h_layout.addWidget(radio_b) radio_h_layout.addWidget(radio_n) group_box = QGroupBox() group_box.setLayout(radio_h_layout) ok_button = QPushButton("Ok") cancel_button = QPushButton("Cancel") ok_button.released.connect(self.accept) cancel_button.released.connect(self.reject) button_h_layout = QHBoxLayout() button_h_layout.addWidget(ok_button) button_h_layout.addWidget(cancel_button) v_layout = QVBoxLayout() v_layout.addWidget(group_box) v_layout.addLayout(button_h_layout) self.setLayout(v_layout) def SelectedPiece(self): """ BRIEF Get the uci piece type the user selected from the dialog """ return self.button_group.checkedButton().text()
class FieldSelector(QDialog): def __init__(self, parent, mw: AnkiQt, note_type: int, field_type: str, config: Config): super().__init__(parent) self.config = config self.mw = mw self.page = 0 self.setWindowTitle("Select Fields") self.setFixedWidth(400) self.layout = QVBoxLayout() self.setLayout(self.layout) description_header = "<h1>Select Fields</h1>" description_label = QLabel(description_header) description_label.setMinimumSize(self.sizeHint()) description_label.setWordWrap(True) description_label.setAlignment(Qt.AlignCenter) self.layout.addWidget(description_label) note_type_fetched = mw.col.models.get(note_type) description_label.setText( description_header + config.get_template(field_type, "noteTypeSpecific") ["description"].replace("{{noteType}}", note_type_fetched["name"])) fields: list = note_type_fetched["flds"] self.next_btn = QPushButton("Continue") self.next_btn.setEnabled(False) self.next_btn.clicked.connect(lambda: self.close()) self.buttongroup = QButtonGroup() radios = [] for field in fields: radio = QRadioButton(field["name"]) radio.field = field["name"] radios.append(radio) [self.buttongroup.addButton(x) for x in radios] [self.layout.addWidget(x) for x in radios] self.buttongroup.buttonClicked.connect(self.selection_changed) self.selected_field = None self.layout.addWidget(self.next_btn) def selection_changed(self): selected = self.buttongroup.checkedButton() if selected is not None: self.selected_field = selected.field self.next_btn.setEnabled(True) else: self.selected_field = None self.next_btn.setEnabled(False)
class LabelButtonGroup(QWidget): def __init__(self, label='', buttons={'UJ object reference value': 'Name to show'}): super(LabelButtonGroup, self).__init__() self.label = QLabel() self.label.setText(label) self.button_group = QButtonGroup() self.buttons = {} self.layout = QHBoxLayout() self.layout.setContentsMargins(0, 0, 0, 0) self.layout.addWidget(self.label) for button_key in buttons.keys(): self.buttons[button_key] = QRadioButton(buttons[button_key]) self.button_group.addButton(self.buttons[button_key]) self.layout.addWidget(self.buttons[button_key]) def show(self): for button in self.buttons.values(): button.show() self.label.show() def hide(self): for button in self.buttons.values(): button.hide() self.label.hide() def set_text(self, key): if key != '': self.buttons[key].setChecked(1) def text(self): return self.button_group.checkedButton().text() def checked(self): return self.button_group.checkedButton()
class DyStockTableSelectDlg(QDialog): def __init__(self, data, dlgName): super().__init__() self._data = data self._initUi(dlgName) def _initUi(self, dlgName): self.setWindowTitle(dlgName) allRadioButton = QRadioButton('所有'); allRadioButton.setChecked(True) highlightRadioButton = QRadioButton('高亮') # 添加到QButtonGroup self._buttonGroup = QButtonGroup() self._buttonGroup.addButton(allRadioButton, 1); self._buttonGroup.addButton(highlightRadioButton, 2) cancelPushButton = QPushButton('Cancel') okPushButton = QPushButton('OK') cancelPushButton.clicked.connect(self._cancel) okPushButton.clicked.connect(self._ok) # 布局 grid = QGridLayout() grid.setSpacing(10) grid.addWidget(allRadioButton, 1, 0) grid.addWidget(highlightRadioButton, 1, 1) grid.addWidget(okPushButton, 2, 1) grid.addWidget(cancelPushButton, 2, 0) self.setLayout(grid) self.setMinimumWidth(QApplication.desktop().size().width()//5) def _ok(self): checkedButton = self._buttonGroup.checkedButton() text = checkedButton.text() self._data['all'] = True if text == '所有' else False self.accept() def _cancel(self): self.reject()
class DyStockTableSelectDlg(QDialog): def __init__(self, data, dlgName): super().__init__() self._data = data self._initUi(dlgName) def _initUi(self, dlgName): self.setWindowTitle(dlgName) allRadioButton = QRadioButton('所有') allRadioButton.setChecked(True) highlightRadioButton = QRadioButton('高亮') # 添加到QButtonGroup self._buttonGroup = QButtonGroup() self._buttonGroup.addButton(allRadioButton, 1) self._buttonGroup.addButton(highlightRadioButton, 2) cancelPushButton = QPushButton('Cancel') okPushButton = QPushButton('OK') cancelPushButton.clicked.connect(self._cancel) okPushButton.clicked.connect(self._ok) # 布局 grid = QGridLayout() grid.setSpacing(10) grid.addWidget(allRadioButton, 1, 0) grid.addWidget(highlightRadioButton, 1, 1) grid.addWidget(okPushButton, 2, 1) grid.addWidget(cancelPushButton, 2, 0) self.setLayout(grid) self.setMinimumWidth(QApplication.desktop().size().width() // 5) def _ok(self): checkedButton = self._buttonGroup.checkedButton() text = checkedButton.text() self._data['all'] = True if text == '所有' else False self.accept() def _cancel(self): self.reject()
class Select_Dialog(QDialog, Ui_Dialog): def __init__(self): super(QDialog, self).__init__() super(Ui_Dialog, self).__init__() super().setupUi(self) self.bg = QButtonGroup() self.bg.addButton(self.maxlikelihoodButton, 0) self.bg.addButton(self.mindistButton, 1) self.bg.addButton(self.mahalanobisButton, 2) self.bg.addButton(self.anotherButton, 3) self.bg.addButton(self.randomforestButton, 4) self.bg.addButton(self.svmButton, 5) self.bg.addButton(self.annButton, 6) self.bg.addButton(self.adaboostButton, 7) self.pushButton.clicked.connect(self.submit) def submit(self): self.chosen = self.bg.checkedButton().text() self.close()
class IdgamesDetailView(Base, Form): def __init__(self, root, controller, parent=None): super(self.__class__, self).__init__(parent) self.setupUi(self) add_widget(root, self, 'IDGAMES_DETAIL') self.controller = controller self.mirror_button_group = QButtonGroup() self.button_layout = self.findChild(QVBoxLayout, 'idgames_detail_download_layout') radio_button_labels = ['Germany','Idaho','Greece','Greece (HTTP)','Texas','Germany (TLS)','New York','Virginia'] for i, label in enumerate(radio_button_labels): radio_button = QRadioButton(label) radio_button.setObjectName(label.upper()) radio_button.setChecked(i == 0) self.button_layout.insertWidget(1 + i, radio_button) self.mirror_button_group.addButton(radio_button) data_labels = ['title', 'filename', 'size', 'date', 'author', 'description', 'credits', 'base', 'buildtime', 'editors', 'bugs','rating'] self.idgames_response_widget = IdgamesResponseWidget(self, data_labels, 'idgames_detail', self.download, data_labels) def set_data(self, item, already_downloaded, detail_type): self.detail_type = detail_type self.idgames_response_widget.set_data(item, already_downloaded) self.textfile = self.findChild(QPlainTextEdit, 'idgames_detail_textfile') if item.get('textfile'): self.textfile.setPlainText(item['textfile']) self.textfile.show() else: self.textfile.hide() def download(self, id): mirror = self.mirror_button_group.checkedButton().objectName() self.controller.download(id, mirror, self.detail_type)
class DrawMain(QWidget): fileName = "" def __init__(self,*args): super(DrawMain, self).__init__(*args) self.grid = QGridLayout(self) self.grid.addWidget(QLabel(),0,0,1,23) self.grid.addWidget(QLabel(), 0, 23, 24, 1) self.Excel_Loader() self.Logo_Print() def Excel_Loader(self): # ------------title---------------------------------- self.csv_title = QLabel() self.csv_title.setObjectName("title_label") self.csv_title.setText('路径') self.grid.addWidget(self.csv_title, 2,1,1,22, Qt.AlignLeft | Qt.AlignVCenter) # ------------lable---------------------------------- self.csv_lable = QLabel() self.csv_lable.setObjectName("normal_label") self.csv_lable.setText('请点击右侧按钮选择市场预算表......') self.grid.addWidget(self.csv_lable, 5,2,2,19, Qt.AlignLeft | Qt.AlignVCenter) # ------------load_btn---------------------------------- self.csv_btn = QPushButton('...') self.csv_btn.setObjectName('load_btn_CSV') self.csv_btn.clicked.connect(self.msg) self.grid.addWidget(self.csv_btn, 5,21,2,2, Qt.AlignRight | Qt.AlignVCenter) # ------------title---------------------------------- self.csv_title = QLabel() self.csv_title.setObjectName("title_label") self.csv_title.setText('表名') self.grid.addWidget(self.csv_title, 9, 1, 1, 22, Qt.AlignLeft | Qt.AlignVCenter) #-----------------rb--------------------------------- self.bg1 = QButtonGroup() for index,item in enumerate(ROUTER.keys()): rb = QRadioButton(item) rb.setObjectName('rb_btn') if index < 4: self.grid.addWidget(rb, 11, 3+index*5, 2, 5, Qt.AlignLeft | Qt.AlignVCenter) elif index < 8: self.grid.addWidget(rb, 14, index*5-17, 2, 5, Qt.AlignLeft | Qt.AlignVCenter) else: self.grid.addWidget(rb, 17, index * 5 - 37, 2, 5, Qt.AlignLeft | Qt.AlignVCenter) self.bg1.addButton(rb, index) # -------------submit_btn------------------------------- self.sub_btn = QPushButton('点 击 上 传') self.sub_btn.setObjectName('submit_btn') self.sub_btn.clicked.connect(self.submit) self.grid.addWidget(self.sub_btn, 21, 2, 2, 18, Qt.AlignRight | Qt.AlignVCenter) def submit(self): if self.bg1.checkedButton(): self.pL(self.bg1.checkedButton().text(),1) if self.fileName[-4:] == '.csv': str = self.fileName if len(str) > 40: self.csv_lable.setText(str[0:40] + '......') else: self.csv_lable.setText(str) self.csv_lable.setStyleSheet('#normal_label{color:gray}') self.threads = Job() self.threads.signal.connect(self.pL) self.threads.tbl_name = self.bg1.checkedButton().text() self.threads.setFileName(self.fileName) self.threads.start() else: self.csv_lable.setText('您选择的文件不是csv格式,请重新选择......') self.csv_lable.setStyleSheet('#normal_label{color:red}') else: self.pL("选择表名啊凶dei!",2) self.csv_lable.setText('选择表名啊凶dei!') self.csv_lable.setStyleSheet('#normal_label{color:red}') def msg(self): fileName, filetype = QFileDialog.getOpenFileName(self, "选取文件", DEFAULT_OPEN_PATH, "All Files (*);;Text Files (*.txt)") self.fileName = fileName if fileName[-4:] == '.csv': str = fileName if len(str) > 40: self.csv_lable.setText(str[0:40] + '......') else: self.csv_lable.setText(str) self.csv_lable.setStyleSheet('#normal_label{color:gray}') else: self.csv_lable.setText('您选择的文件不是csv格式,请重新选择......') self.csv_lable.setStyleSheet('#normal_label{color:red}') def Logo_Print(self): # ------------title---------------------------------- self.logo_label = QLabel() self.logo_label.setText('log......') self.logo_label.setObjectName("logo_label") self.grid.addWidget(self.logo_label, 23, 0, 1, 23, Qt.AlignLeft | Qt.AlignBottom) def pL(self,var,num=1): self.logo_label.setText(var) if num == 1: self.logo_label.setStyleSheet('#logo_label{color:gray}') elif num == 2 : self.csv_lable.setStyleSheet('#normal_label{color:red}') self.logo_label.setStyleSheet('#logo_label{color:red}') elif num == 3 : self.csv_lable.setStyleSheet('#normal_label{color:#69AAE0}') self.logo_label.setStyleSheet('#logo_label{color:#69AAE0}')
class FileDialogWizardDialog(QDialog, Ui_FileDialogWizardDialog): """ Class implementing the color dialog wizard dialog. It displays a dialog for entering the parameters for the QFileDialog code generator. """ def __init__(self, pyqtVariant, parent=None): """ Constructor @param pyqtVariant variant of PyQt (integer; 0, 4 or 5) @param parent parent widget (QWidget) """ super(FileDialogWizardDialog, self).__init__(parent) self.setupUi(self) self.eStartWithCompleter = E5FileCompleter(self.eStartWith) self.eWorkDirCompleter = E5DirCompleter(self.eWorkDir) self.__pyqtVariant = pyqtVariant self.__typeButtonsGroup = QButtonGroup(self) self.__typeButtonsGroup.setExclusive(True) self.__typeButtonsGroup.addButton(self.rOpenFile, 1) self.__typeButtonsGroup.addButton(self.rOpenFiles, 2) self.__typeButtonsGroup.addButton(self.rSaveFile, 3) self.__typeButtonsGroup.addButton(self.rfOpenFile, 11) self.__typeButtonsGroup.addButton(self.rfOpenFiles, 12) self.__typeButtonsGroup.addButton(self.rfSaveFile, 13) self.__typeButtonsGroup.addButton(self.rDirectory, 20) self.__typeButtonsGroup.buttonClicked[int].connect( self.__toggleInitialFilterAndResult) self.__toggleInitialFilterAndResult(1) self.pyqtComboBox.addItems(["PyQt4", "PyQt5"]) if self.__pyqtVariant == 5: self.pyqtComboBox.setCurrentIndex(1) else: self.pyqtComboBox.setCurrentIndex(0) self.rSaveFile.toggled[bool].connect(self.__toggleConfirmCheckBox) self.rfSaveFile.toggled[bool].connect(self.__toggleConfirmCheckBox) self.rDirectory.toggled[bool].connect(self.__toggleGroupsAndTest) self.cStartWith.toggled[bool].connect(self.__toggleGroupsAndTest) self.cWorkDir.toggled[bool].connect(self.__toggleGroupsAndTest) self.cFilters.toggled[bool].connect(self.__toggleGroupsAndTest) self.bTest = self.buttonBox.addButton( self.tr("Test"), QDialogButtonBox.ActionRole) msh = self.minimumSizeHint() self.resize(max(self.width(), msh.width()), msh.height()) def __adjustOptions(self, options): """ Private method to adjust the file dialog options. @param options file dialog options (QFileDialog.Options) @return modified options (QFileDialog.Options) """ if Globals.isLinuxPlatform(): options |= QFileDialog.DontUseNativeDialog return options @pyqtSlot(str) def on_pyqtComboBox_currentIndexChanged(self, txt): """ Private slot to setup the dialog for the selected PyQt variant. @param txt text of the selected combo box entry (string) """ self.rfOpenFile.setEnabled(txt == "PyQt5") self.rfOpenFiles.setEnabled(txt == "PyQt5") self.rfSaveFile.setEnabled(txt == "PyQt5") if txt == "PyQt5": if self.rfOpenFile.isChecked(): self.rOpenFile.setChecked(True) elif self.rfOpenFiles.isChecked(): self.rOpenFiles.setChecked(True) elif self.rfSaveFile.isChecked(): self.rSaveFile.setChecked(True) self.__pyqtVariant = 5 if txt == "PyQt5" else 4 self.__toggleInitialFilterAndResult( self.__typeButtonsGroup.checkedId()) def on_buttonBox_clicked(self, button): """ Private slot called by a button of the button box clicked. @param button button that was clicked (QAbstractButton) """ if button == self.bTest: self.on_bTest_clicked() @pyqtSlot() def on_bTest_clicked(self): """ Private method to test the selected options. """ if self.rOpenFile.isChecked() or self.rfOpenFile.isChecked(): if not self.cSymlinks.isChecked(): options = QFileDialog.Options(QFileDialog.DontResolveSymlinks) else: options = QFileDialog.Options() options = self.__adjustOptions(options) if self.rOpenFile.isChecked() and self.__pyqtVariant == 4: QFileDialog.getOpenFileName( None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), options) else: QFileDialog.getOpenFileNameAndFilter( None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), self.eInitialFilter.text(), options) elif self.rOpenFiles.isChecked() or self.rfOpenFiles.isChecked(): if not self.cSymlinks.isChecked(): options = QFileDialog.Options(QFileDialog.DontResolveSymlinks) else: options = QFileDialog.Options() options = self.__adjustOptions(options) if self.rOpenFiles.isChecked() and self.__pyqtVariant == 4: QFileDialog.getOpenFileNames( None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), options) else: QFileDialog.getOpenFileNamesAndFilter( None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), self.eInitialFilter.text(), options) elif self.rSaveFile.isChecked() or self.rfSaveFile.isChecked(): if not self.cSymlinks.isChecked(): options = QFileDialog.Options(QFileDialog.DontResolveSymlinks) else: options = QFileDialog.Options() options = self.__adjustOptions(options) if self.rSaveFile.isChecked() and self.__pyqtVariant == 4: QFileDialog.getSaveFileName( None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), options) else: QFileDialog.getSaveFileNameAndFilter( None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), self.eInitialFilter.text(), options) elif self.rDirectory.isChecked(): options = QFileDialog.Options() if not self.cSymlinks.isChecked(): options |= QFileDialog.Options(QFileDialog.DontResolveSymlinks) if self.cDirOnly.isChecked(): options |= QFileDialog.Options(QFileDialog.ShowDirsOnly) else: options |= QFileDialog.Options(QFileDialog.Option(0)) options = self.__adjustOptions(options) QFileDialog.getExistingDirectory( None, self.eCaption.text(), self.eWorkDir.text(), options) def __toggleConfirmCheckBox(self): """ Private slot to enable/disable the confirmation check box. """ self.cConfirmOverwrite.setEnabled( self.rSaveFile.isChecked() or self.rfSaveFile.isChecked()) def __toggleGroupsAndTest(self): """ Private slot to enable/disable certain groups and the test button. """ if self.rDirectory.isChecked(): self.filePropertiesGroup.setEnabled(False) self.dirPropertiesGroup.setEnabled(True) self.bTest.setDisabled(self.cWorkDir.isChecked()) else: self.filePropertiesGroup.setEnabled(True) self.dirPropertiesGroup.setEnabled(False) self.bTest.setDisabled( self.cStartWith.isChecked() or self.cFilters.isChecked()) def __toggleInitialFilterAndResult(self, id): """ Private slot to enable/disable the initial filter elements and the results entries. @param id id of the clicked button (integer) """ if (self.__pyqtVariant == 4 and id in [11, 12, 13]) or \ (self.__pyqtVariant == 5 and id in [1, 2, 3]): enable = True else: enable = False self.lInitialFilter.setEnabled(enable) self.eInitialFilter.setEnabled(enable) self.cInitialFilter.setEnabled(enable) self.lFilterVariable.setEnabled(enable) self.eFilterVariable.setEnabled(enable) def getCode(self, indLevel, indString): """ Public method to get the source code for Qt4 and Qt5. @param indLevel indentation level (int) @param indString string used for indentation (space or tab) (string) @return generated code (string) """ # calculate our indentation level and the indentation string il = indLevel + 1 istring = il * indString estring = os.linesep + indLevel * indString # now generate the code if self.parentSelf.isChecked(): parent = "self" elif self.parentNone.isChecked(): parent = "None" elif self.parentOther.isChecked(): parent = self.parentEdit.text() if parent == "": parent = "None" # prepare the result variables nameVariable = self.eNameVariable.text() if not nameVariable: if self.__typeButtonsGroup.checkedButton() in [ self.rOpenFile, self.rfOpenFile, self.rSaveFile, self.rfSaveFile]: nameVariable = "fileName" elif self.__typeButtonsGroup.checkedButton() in [ self.rOpenFiles, self.rfOpenFiles]: nameVariable = "fileNames" elif self.__typeButtonsGroup.checkedButton() == self.rDirectory: nameVariable = "dirName" else: nameVariable = "res" filterVariable = self.eFilterVariable.text() if not filterVariable: if (self.__pyqtVariant == 4 and self.__typeButtonsGroup.checkedButton() in [ self.rfOpenFile, self.rfOpenFiles, self.rfSaveFile]) or \ (self.__pyqtVariant == 5 and self.__typeButtonsGroup.checkedButton() in [ self.rOpenFile, self.rOpenFiles, self.rSaveFile]): filterVariable = ", selectedFilter" else: filterVariable = "" code = '{0}{1} = QFileDialog.'.format(nameVariable, filterVariable) if self.rOpenFile.isChecked() or self.rfOpenFile.isChecked(): if self.rOpenFile.isChecked(): code += 'getOpenFileName({0}{1}'.format(os.linesep, istring) else: code += 'getOpenFileNameAndFilter({0}{1}'.format( os.linesep, istring) code += '{0},{1}{2}'.format(parent, os.linesep, istring) if not self.eCaption.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: code += 'self.tr("{0}"),{1}{2}'.format( self.eCaption.text(), os.linesep, istring) if not self.eStartWith.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: if self.cStartWith.isChecked(): fmt = '{0},{1}{2}' else: fmt = 'self.tr("{0}"),{1}{2}' code += fmt.format(self.eStartWith.text(), os.linesep, istring) if self.eFilters.text() == "": code += '""' else: if self.cFilters.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' code += fmt.format(self.eFilters.text()) if self.rfOpenFile.isChecked() or self.__pyqtVariant == 5: if self.eInitialFilter.text() == "": filter = "None" else: if self.cInitialFilter.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' filter = fmt.format(self.eInitialFilter.text()) code += ',{0}{1}{2}'.format(os.linesep, istring, filter) if not self.cSymlinks.isChecked(): code += \ ',{0}{1}QFileDialog.Options(' \ 'QFileDialog.DontResolveSymlinks)' \ .format(os.linesep, istring) code += '){0}'.format(estring) elif self.rOpenFiles.isChecked() or self.rfOpenFiles.isChecked(): if self.rOpenFiles.isChecked(): code += 'getOpenFileNames({0}{1}'.format(os.linesep, istring) else: code += 'getOpenFileNamesAndFilter({0}{1}'.format( os.linesep, istring) code += '{0},{1}{2}'.format(parent, os.linesep, istring) if not self.eCaption.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: code += 'self.tr("{0}"),{1}{2}'.format( self.eCaption.text(), os.linesep, istring) if not self.eStartWith.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: if self.cStartWith.isChecked(): fmt = '{0},{1}{2}' else: fmt = 'self.tr("{0}"),{1}{2}' code += fmt.format(self.eStartWith.text(), os.linesep, istring) if not self.eFilters.text(): code += '""' else: if self.cFilters.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' code += fmt.format(self.eFilters.text()) if self.rfOpenFiles.isChecked() or self.__pyqtVariant == 5: if self.eInitialFilter.text() == "": filter = "None" else: if self.cInitialFilter.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' filter = fmt.format(self.eInitialFilter.text()) code += ',{0}{1}{2}'.format(os.linesep, istring, filter) if not self.cSymlinks.isChecked(): code += \ ',{0}{1}QFileDialog.Options(' \ 'QFileDialog.DontResolveSymlinks)' \ .format(os.linesep, istring) code += '){0}'.format(estring) elif self.rSaveFile.isChecked() or self.rfSaveFile.isChecked(): if self.rSaveFile.isChecked(): code += 'getSaveFileName({0}{1}'.format(os.linesep, istring) else: code += 'getSaveFileNameAndFilter({0}{1}'.format( os.linesep, istring) code += '{0},{1}{2}'.format(parent, os.linesep, istring) if not self.eCaption.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: code += 'self.tr("{0}"),{1}{2}'.format( self.eCaption.text(), os.linesep, istring) if not self.eStartWith.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: if self.cStartWith.isChecked(): fmt = '{0},{1}{2}' else: fmt = 'self.tr("{0}"),{1}{2}' code += fmt.format(self.eStartWith.text(), os.linesep, istring) if not self.eFilters.text(): code += '""' else: if self.cFilters.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' code += fmt.format(self.eFilters.text()) if self.rfSaveFile.isChecked() or self.__pyqtVariant == 5: if self.eInitialFilter.text() == "": filter = "None" else: if self.cInitialFilter.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' filter = fmt.format(self.eInitialFilter.text()) code += ',{0}{1}{2}'.format(os.linesep, istring, filter) if (not self.cSymlinks.isChecked()) or \ (not self.cConfirmOverwrite.isChecked()): code += ',{0}{1}QFileDialog.Options('.format( os.linesep, istring) if not self.cSymlinks.isChecked(): code += 'QFileDialog.DontResolveSymlinks' if (not self.cSymlinks.isChecked()) and \ (not self.cConfirmOverwrite.isChecked()): code += ' | ' if not self.cConfirmOverwrite.isChecked(): code += 'QFileDialog.DontConfirmOverwrite' code += ')' code += '){0}'.format(estring) elif self.rDirectory.isChecked(): code += 'getExistingDirectory({0}{1}'.format(os.linesep, istring) code += '{0},{1}{2}'.format(parent, os.linesep, istring) if not self.eCaption.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: code += 'self.tr("{0}"),{1}{2}'.format( self.eCaption.text(), os.linesep, istring) if not self.eWorkDir.text(): code += '""' else: if self.cWorkDir.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' code += fmt.format(self.eWorkDir.text()) code += ',{0}{1}QFileDialog.Options('.format(os.linesep, istring) if not self.cSymlinks.isChecked(): code += 'QFileDialog.DontResolveSymlinks | ' if self.cDirOnly.isChecked(): code += 'QFileDialog.ShowDirsOnly' else: code += 'QFileDialog.Option(0)' code += ')){0}'.format(estring) return code
class FoodOrder(QWidget): def __init__(self): super().__init__() self.initialize_ui() def initialize_ui(self): self.setMinimumSize(600, 700) self.setWindowTitle('Food Order GUI') self.setupTabsAndLayout() self.show() def setupTabsAndLayout(self): """ Set up tab bar and different tab widgets. Also, create the side widget to display items selected. """ self.tab_bar = QTabWidget() self.pizza_tab = QWidget() self.pizza_tab.setObjectName("Tabs") self.wings_tab = QWidget() self.wings_tab.setObjectName("Tabs") self.tab_bar.addTab(self.pizza_tab, "Pizza") self.tab_bar.addTab(self.wings_tab, "Wings") self.pizzaTab() self.wingsTab() # Set up side widget which is not part of the tab widget self.side_widget = QWidget() self.side_widget.setObjectName("Tabs") order_label = QLabel("YOUR ORDER") order_label.setObjectName("Header") items_box = QWidget() items_box.setObjectName("Side") pizza_label = QLabel("Pizza Type: ") self.display_pizza_label = QLabel("") toppings_label = QLabel("Toppings: ") self.display_toppings_label = QLabel("") extra_label = QLabel("Extra: ") self.display_wings_label = QLabel("") # Set grid layout for objects in side widget items_grid = QGridLayout() items_grid.addWidget(pizza_label, 0, 0, Qt.AlignRight) items_grid.addWidget(self.display_pizza_label, 0, 1) items_grid.addWidget(toppings_label, 1, 0, Qt.AlignRight) items_grid.addWidget(self.display_toppings_label, 1, 1) items_grid.addWidget(extra_label, 2, 0, Qt.AlignRight) items_grid.addWidget(self.display_wings_label, 2, 1) items_box.setLayout(items_grid) # Set main layout for side widget side_v_box = QVBoxLayout() side_v_box.addWidget(order_label) side_v_box.addWidget(items_box) side_v_box.addStretch() self.side_widget.setLayout(side_v_box) # Add widgets to main window and set layout main_h_box = QHBoxLayout() main_h_box.addWidget(self.tab_bar) main_h_box.addWidget(self.side_widget) self.setLayout(main_h_box) def pizzaTab(self): """ Create the pizza tab. Allows the user to select the type of pizza and topping using radio buttons. """ tab_pizza_label = QLabel("BUILD YOUR OWN PIZZA") tab_pizza_label.setObjectName("Header") description_box = QWidget() description_box.setObjectName("ImageBorder") pizza_image_path = "images/pizza.png" pizza_image = self.loadImage(pizza_image_path) pizza_desc = QLabel() pizza_desc.setObjectName("ImageInfo") pizza_desc.setText( "Build a custom pizza for you. Start with your favorite crust and add any toppings, " "plus the perfect amount of cheese and sauce.") pizza_desc.setWordWrap(True) h_box = QHBoxLayout() h_box.addWidget(pizza_image) h_box.addWidget(pizza_desc) description_box.setLayout(h_box) crust_gbox = QGroupBox() crust_gbox.setTitle("CHOOSE YOUR CRUST") self.crust_group = QButtonGroup() gb_v_box = QVBoxLayout() crust_list = ["Hand-Tossed", "Flat", "Stuffed"] for cr in crust_list: crust_rb = QRadioButton(cr) gb_v_box.addWidget(crust_rb) self.crust_group.addButton(crust_rb) crust_gbox.setLayout(gb_v_box) # Create group box that will contain toppings choices toppings_gbox = QGroupBox() toppings_gbox.setTitle("CHOOSE YOUR TOPPINGS") # Set up button group for toppings radio buttons self.toppings_group = QButtonGroup() gb_v_box = QVBoxLayout() toppings_list = [ "Pepperoni", "Sausage", "Bacon", "Canadian Bacon", "Beef", "Pineapple", "Mushroom", "Onion", "Olive", "Green Pepper", "Tomato", "Spinach", "Cheese" ] # Create radio buttons for the different toppings and # add to layout for top in toppings_list: toppings_rb = QRadioButton(top) gb_v_box.addWidget(toppings_rb) self.toppings_group.addButton(toppings_rb) self.toppings_group.setExclusive(False) toppings_gbox.setLayout(gb_v_box) # Create button to add information to side widget # when clicked add_to_order_button1 = QPushButton("Add To Order") add_to_order_button1.clicked.connect(self.displayPizzaInOrder) # create layout for pizza tab (page 1) page1_v_box = QVBoxLayout() page1_v_box.addWidget(tab_pizza_label) page1_v_box.addWidget(description_box) page1_v_box.addWidget(crust_gbox) page1_v_box.addWidget(toppings_gbox) page1_v_box.addStretch() page1_v_box.addWidget(add_to_order_button1, alignment=Qt.AlignRight) self.pizza_tab.setLayout(page1_v_box) def wingsTab(self): """ Set up widgets and layouts to display information to the user about the page """ tab_wings_label = QLabel("TRY OUR AMAZING WINGS") tab_wings_label.setObjectName("Header") description_box = QWidget() description_box.setObjectName("ImageBorder") wings_image_path = "images/wings.png" wings_image = self.loadImage(wings_image_path) wings_desc = QLabel() wings_desc.setObjectName("ImageInfo") wings_desc.setText( "6 pieces of rich-tasting, white meat chicken that will have you coming back for more." ) wings_desc.setWordWrap(True) h_box = QHBoxLayout() h_box.addWidget(wings_image) h_box.addWidget(wings_desc) description_box.setLayout(h_box) wings_gbox = QGroupBox() wings_gbox.setTitle("CHOOSE YOUR FLAVOR") self.wings_group = QButtonGroup() gb_v_box = QVBoxLayout() wings_list = ["Buffalo", "Sweet-Sour", "Teriyaki", "Barbecue"] for fl in wings_list: flavor_rb = QRadioButton(fl) gb_v_box.addWidget(flavor_rb) self.wings_group.addButton(flavor_rb) wings_gbox.setLayout(gb_v_box) add_to_order_button2 = QPushButton("Add To Order") add_to_order_button2.clicked.connect(self.displayWingsInOrder) page2_v_box = QVBoxLayout() page2_v_box.addWidget(tab_wings_label) page2_v_box.addWidget(description_box) page2_v_box.addWidget(wings_gbox) page2_v_box.addWidget(add_to_order_button2, alignment=Qt.AlignRight) page2_v_box.addStretch() self.wings_tab.setLayout(page2_v_box) def collectTopingfInList(self): """ Create list of all checked toppings radio buttons. """ return [ button.text() for i, button in enumerate(self.toppings_group.buttons()) if button.isChecked() ] def displayPizzaInOrder(self): """ Collect the text from the radio buttons that are checked on pizza page. Display text in side widget. """ try: pizza_text = self.crust_group.checkedButton().text() self.display_pizza_label.setText(pizza_text) toppings = self.collectTopingfInList() toppings_str = '\n'.join(toppings) self.display_toppings_label.setText(toppings_str) self.repaint() except AttributeError: print("No value selected.") QMessageBox.warning(self, "Error", "No value selected", QMessageBox.Ok) pass def displayWingsInOrder(self): """ Collect the text from the radio buttons that are checked on wings page. Display text in side widget. """ try: text = self.wings_group.checkedButton().text() + " Wings" self.display_wings_label.setText(text) self.repaint() except AttributeError: # print("No value selected.") QMessageBox.warning(self, "Error", "No value selected", QMessageBox.Ok) pass def loadImage(self, path): """ Load and scale images. :param path: path to the file """ try: with open(path): image = QLabel(self) image.setObjectName("ImageInfo") pixmap = QPixmap(path) image.setPixmap( pixmap.scaled(image.size(), Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation)) return image except FileNotFoundError: print("Image not found.")
class TARWindow(QDialog): def __init__(self, resource, size): # Load UI super(TARWindow, self).__init__() uic.loadUi(GUI_FOLDER + 'tarCreation.ui', self) self.resource = cv2.imread(resource) self.h, self.w = self.resource.shape[:2] self.tileSize = size # We'll need a temporal folder self.tmp_dir = tempfile.mkdtemp() # In order to get the tiles we'll define the size self.resourceView.setIconSize(QSize(size, size)) # Defining labels self.comprLabel.setText('Compression:') c = self.getTiles(self.resource, self.h, self.w, self.tileSize) self.columns, self.rows = c self.refreshdir(self.columns, self.rows, self.tileSize) # Radio Buttons in a group self.comprGroup = QButtonGroup() self.comprGroup.addButton(self.tarRadio) self.comprGroup.addButton(self.targzRadio) self.comprGroup.addButton(self.tarbz2Radio) self.comprGroup.addButton(self.tarxzRadio) # We'll define a compression by default self.targzRadio.setChecked(True) # If we don't define blankTile right now it will return an error self.blankTile = str() # Signals self.blankButton.clicked.connect(self.setBlank) self.saveBox.accepted.connect(self.saveTilemap) self.saveBox.rejected.connect(self.cancel) def getTiles(self, resource, h, w, tileSize): # This cuts the resource and put it on the temporary folder. r = 0 for i in range(0, h, tileSize): c = 0 for j in range(0, w, tileSize): box = self.resource[i:i + tileSize, j:j + tileSize] nm = str(c) + '-' + str(r) + '.png' place = os.path.join(self.tmp_dir, nm) cv2.imwrite(place, box) c += 1 r += 1 return (c, r) def hashsum(self, path, hex=True, hash_type=hashlib.md5): # All this function was for deleting the repeated tiles. I won't use # it. hashinst = hash_type() blocksize = hashinst.block_size * 128 with open(path, 'rb') as f: for chunk in iter(lambda: f.read(blocksize), b''): hashinst.update(chunk) return (hashinst.hexdigest() if hex else hashinst.digest()) def refreshdir(self, c, r, size): # This loads the tilemap self.resourceView.setColumnCount(c) self.resourceView.setRowCount(r) for column in range(0, c): self.resourceView.setColumnWidth(column, size) for row in range(0, r): self.resourceView.setRowHeight(row, size) filename = str(column) + '-' + str(row) + '.png' filedir = os.path.join(self.tmp_dir, filename) icon = QIcon(filedir) item = QTableWidgetItem(icon, None) self.resourceView.setItem(row, column, item) @pyqtSlot() def setBlank(self): # Set the blank tile. When you load a new map, the tilemap will give a # default tile for the blank map. r = str(self.resourceView.currentRow()) c = str(self.resourceView.currentColumn()) file = c + '-' + r pixmap = QPixmap(os.path.join(self.tmp_dir, file + '.png')) pixmapitem = QGraphicsPixmapItem(pixmap) scene = QGraphicsScene() scene.addItem(pixmapitem) self.tileView.setScene(scene) self.blankTile = file def saveTilemap(self): # We have to define c and r from self # Because PyQt Signals are shitty # So I'm using a singals style that can't pass arguments c = self.columns r = self.rows # We'll write the metadata fileplace = os.path.join(self.tmp_dir, 'metafile.ini') # You may be thinking: # "Why did you write this string on such a shitty way?" # And the answer is: "NONE OF YOUR F*****G BUSINESS METADATA = ("[META]\n" "COLUMNS = {0}\n" "ROWS = {1}\n" "BLANKTILE = {2}\n" "TILESIZE = {3}\n").format(c, r, self.blankTile, self.tileSize) with open(fileplace, 'w') as metafile: metafile.write(METADATA) filters = 'TAR (*.tar, *.tar.gz, *.tar.xz, *.tar.bz2)' rawSuffix = self.comprGroup.checkedButton().text() suffix = rawSuffix.split(' ')[1][1:-1] sufParts = suffix.split('.') savefile = QFileDialog().getSaveFileName(filter=filters) if len(sufParts) > 2: openAs = 'w:{0}'.format(sufParts[-1]) else: openAs = 'w' with tarfile.open(savefile[0] + suffix, openAs) as tar: for i in os.listdir(self.tmp_dir): tar.add(os.path.join(self.tmp_dir, i), arcname=i) os.remove(os.path.join(self.tmp_dir, i)) os.removedirs(self.tmp_dir) self.close() def cancel(self): self.close()
class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): # 布局 # # 总体布局 self.setGeometry(300, 300, 1400, 750) self.setWindowTitle(u'组卷系统') self.setWindowIcon(QIcon('paper.png')) # # 菜单栏 menubar = self.menuBar() # # # 题库选择 choose_database = menubar.addMenu("题库选择") self.local_data = QAction('本地题库', self, checkable=True) self.local_data.setChecked(True) self.local_data.toggled.connect(self.local_data_choosed) choose_database.addAction(self.local_data) self.online_data = QAction('在线题库', self, checkable=True) self.online_data.setChecked(False) self.online_data.toggled.connect(self.online_data_choosed) choose_database.addAction(self.online_data) # # # 帮助 help_menu = menubar.addMenu("帮助") self.tips = QAction('帮助', self) self.tips.triggered.connect(self.something_helpful) help_menu.addAction(self.tips) self.info = QAction('联系作者', self) self.info.triggered.connect(self.author) help_menu.addAction(self.info) # # 单选10*5 title = QLabel(self) title.setText('一、单选题(每题5分,共10题)') title.adjustSize() title.move(60, 40) for i in range(10): # 用exec批量生成题目 content = "self.title{} = QLabel(self)".format(str(i)) content += "\nself.title{}.setText('default')".format(str(i)) content += "\nself.title{}.move(60,{})".format( str(i), (i + 1) * 60 + 20) content += "\nself.title{}.adjustSize()".format(str(i)) content += "\nself.bg{} = QButtonGroup(self)".format(str(i)) exec(content) for j in range(4): content = "self.but{} = QRadioButton('default',self)".format( str(i) + str(j)) content += "\nself.but{}.move({},{})".format( str(i) + str(j), (j + 1) * 150 - 40, (i + 1) * 60 + 45) content += "\nself.bg{}.addButton(self.but{})".format( str(i), str(i) + str(j)) exec(content) # # 填空3*10 title = QLabel(self) title.setText('二、填空题(每题10分,共3题)') title.adjustSize() title.move(710, 40) for i in range(3): # 用exec批量生成题目 content = "self.cloze_title{} = QLabel(self)".format(str(i)) content += "\nself.cloze_title{}.setText('default')".format(str(i)) content += "\nself.cloze_title{}.move(710,{})".format( str(i), (i + 1) * 60 + 20) content += "\nself.cloze_ans{} = QLineEdit(self)".format(str(i)) content += "\nself.cloze_ans{}.move(710,{})".format( str(i), (i + 1) * 60 + 50) content += "\nself.cloze_ans{}.resize(70,20)".format(str(i)) exec(content) # # 判断2*10 title = QLabel(self) title.setText('三、判断题(每题10分,共2题)') title.adjustSize() title.move(710, 400) for i in range(2): content = "self.binery_choice{} = QLabel(self)".format(str(i)) content += "\nself.binery_choice{}.setText('default')".format( str(i)) content += "\nself.binery_choice{}.move(710,{})".format( str(i), (i + 1) * 60 + 380) exec(content) self.bc1 = QButtonGroup(self) self.bc2 = QButtonGroup(self) self.bc1_ansT = QRadioButton('T', self) self.bc1_ansF = QRadioButton('F', self) self.bc2_ansT = QRadioButton('T', self) self.bc2_ansF = QRadioButton('F', self) self.bc1.addButton(self.bc1_ansT) self.bc1.addButton(self.bc1_ansF) self.bc2.addButton(self.bc2_ansT) self.bc2.addButton(self.bc2_ansF) self.bc1_ansT.move(730, 470) self.bc1_ansF.move(790, 470) self.bc2_ansT.move(730, 530) self.bc2_ansF.move(790, 530) # # 组卷交卷评分 self.make_paper = QPushButton("组卷", self) self.make_paper.clicked.connect(self.make) self.make_paper.move(420, 680) self.btn_submit = QPushButton(u"交卷", self) self.btn_submit.clicked.connect(self.submit) self.btn_submit.move(550, 680) self.flag = False # # 显示 self.show() # 实现菜单栏单选 def local_data_choosed(self): if self.local_data.isChecked(): self.online_data.setChecked(False) else: self.online_data.setChecked(True) def online_data_choosed(self): if self.online_data.isChecked(): self.local_data.setChecked(False) else: self.local_data.setChecked(True) # 实现菜单栏帮助选项 def something_helpful(self): QMessageBox.information( self, "帮助信息", "点击组卷可以生成试卷\n点击交卷提交并评分\n线上题库将连接作者云服务器,服务在课程完成评分后关闭\n阅读README.md文件获取更多信息" ) def author(self): QMessageBox.information( self, "作者信息", "仇白渊\n2018011217014\nhttps://github.com/bugmaker2\n此作品为Python课程课设") # 组成试卷 def make(self): self.flag = True if self.local_data.isChecked(): self.make_from_local() elif self.online_data.isChecked(): self.make_from_online() def make_from_local(self): self.ans = [] # 用于记录正确答案 # 单选题组卷 with open('single choice.csv', 'r') as f: reader = csv.reader(f) all_question = list(reader) ques_id = random.sample(range(len(all_question)), 10) # 随机选取10题单选 n = 0 for i in ques_id: content = "self.title{}.setText(str({})+'.'+all_question[i][0])".format( str(n), n + 1) content += "\nself.title{}.adjustSize()".format(str(n)) # 打乱选项次序 choice_id = random.sample(range(4), 4) m = 0 for abcd in choice_id: content += "\nself.but{}.setText(all_question[i][{}])".format( str(n) + str(m), abcd + 1) content += "\nself.but{}.adjustSize()".format( str(n) + str(m)) m += 1 n += 1 exec(content) # 添加正确答案 self.ans.append(all_question[i][5]) # 填空题组卷 with open('cloze.csv', 'r') as f: reader = csv.reader(f) all_question = list(reader) ques_id = random.sample(range(len(all_question)), 3) n = 0 for i in ques_id: content = "self.cloze_title{}.setText(all_question[i][0])".format( str(n)) content += "\nself.cloze_title{}.adjustSize()".format(str(n)) content += "\nself.cloze_ans{}.setText('')".format(str(n)) exec(content) self.ans.append(all_question[i][1]) n += 1 # 判断题组卷 with open('binery choice.csv', 'r') as f: reader = csv.reader(f) all_question = list(reader) ques_id = random.sample(range(len(all_question)), 2) self.binery_choice0.setText(all_question[ques_id[0]][0]) self.binery_choice1.setText(all_question[ques_id[1]][0]) self.binery_choice0.adjustSize() self.binery_choice1.adjustSize() self.ans.append(all_question[ques_id[0]][1]) self.ans.append(all_question[ques_id[1]][1]) def make_from_online(self): QMessageBox.information(self, "Warnning", "此功能仅作为展示\nsocket服务端已关闭(忘了续费了)") # 交卷并评分 def submit(self): # 算分 if self.complete() and self.flag: reply = QMessageBox.question(self, 'Message', "确定交卷吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if reply == QMessageBox.Yes: self.count() elif self.flag: QMessageBox.information(self, 'Warning', "还有题目没做完!") else: QMessageBox.information(self, 'Warnning', "请先组卷") def complete(self): # 判断是否写完 flag = True if not (self.but00.isChecked() or self.but01.isChecked() or self.but02.isChecked() or self.but03.isChecked()): return False if not (self.but10.isChecked() or self.but11.isChecked() or self.but12.isChecked() or self.but13.isChecked()): return False if not (self.but20.isChecked() or self.but21.isChecked() or self.but22.isChecked() or self.but23.isChecked()): return False if not (self.but30.isChecked() or self.but31.isChecked() or self.but32.isChecked() or self.but33.isChecked()): return False if not (self.but40.isChecked() or self.but41.isChecked() or self.but42.isChecked() or self.but43.isChecked()): return False if not (self.but50.isChecked() or self.but51.isChecked() or self.but52.isChecked() or self.but53.isChecked()): return False if not (self.but60.isChecked() or self.but61.isChecked() or self.but62.isChecked() or self.but63.isChecked()): return False if not (self.but70.isChecked() or self.but71.isChecked() or self.but72.isChecked() or self.but73.isChecked()): return False if not (self.but80.isChecked() or self.but81.isChecked() or self.but82.isChecked() or self.but83.isChecked()): return False if not (self.but90.isChecked() or self.but91.isChecked() or self.but92.isChecked() or self.but93.isChecked()): return False if self.cloze_ans0.text() == "": return False if self.cloze_ans1.text() == "": return False if self.cloze_ans2.text() == "": return False if not (self.bc1_ansT.isChecked() or self.bc1_ansF.isChecked()): return False if not (self.bc2_ansT.isChecked() or self.bc2_ansF.isChecked()): return False return flag def count(self): self.score = 0 print(self.bg0.checkedButton().text()) for i in range(10): content = "self.bg{}.checkedButton().text()==self.ans[i]".format(i) if eval(content): self.score += 5 if self.cloze_ans0.text() == self.ans[10]: self.score += 10 if self.cloze_ans1.text() == self.ans[11]: self.score += 10 if self.cloze_ans2.text() == self.ans[12]: self.score += 10 if self.bc1.checkedButton().text() == self.ans[13]: self.score += 10 if self.bc2.checkedButton().text() == self.ans[14]: self.score += 10 if self.score >= 85: QMessageBox.information( self, 'Score', "最终得分为:" + str(self.score) + "\n太棒啦!继续努力学习嗷") else: QMessageBox.information( self, 'Score', "最终得分为:" + str(self.score) + "\n没有满绩!还要加油嗷") def closeEvent(self, event): # 关闭提示 reply = QMessageBox.question(self, 'Message', "确定退出吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore()
class SettingsDialog(QDialog, Ui_Dialog): def __init__(self, parent): super().__init__(parent) self.setAttribute(Qt.WA_DeleteOnClose) self.setupUi(self) self.lineEdit_loginUsername.setText(app.settings.get("account", "username")) self.lineEdit_loginPassword.setText(app.settings.get("account", "password")) self.checkBox_autoLogin.setChecked(app.settings.getbool("account", "autologin")) self.checkBox_autoStartFrontend.setChecked(self.doesAutoStartFileExists()) self.checkBox_enableDevelopersTools.setChecked( app.settings.getbool("frontend", "enabledeveloperstools")) self.checkBox_allowFlash.setChecked(app.settings.getbool("frontend", "allowflash")) self.checkBox_minimizeToSystray.setChecked( app.settings.getbool("frontend", "minimizetosystray")) self.checkBox_closeToMinimize.setChecked( app.settings.getbool("frontend", "closetominimize")) self.checkBox_popNotifications.setChecked( app.settings.getbool("frontend", "popnotifications")) self.checkBox_notifyBySound.setChecked( app.settings.getbool("frontend", "notifybysound")) self.checkBox_showMonitorWindow.setChecked( app.settings.getbool("frontend", "showmonitorwindow")) self.spinBox_monitorFullSpeed.setValue( app.settings.getint("frontend", "monitorfullspeed")) # clipboard related self.checkBox_watchClipboard.stateChanged.connect(self.slotWatchClipboardToggled) self.checkBox_watchClipboard.setChecked(app.settings.getbool("frontend", "watchclipboard")) self.slotWatchClipboardToggled(self.checkBox_watchClipboard.checkState()) self.plaintext_watchPattern.setPlainText(app.settings.get("frontend", "watchpattern")) self.btngrp_etmStartWhen = QButtonGroup() self.btngrp_etmStartWhen.addButton(self.radio_backendStartWhen1, 1) self.btngrp_etmStartWhen.addButton(self.radio_backendStartWhen2, 2) self.btngrp_etmStartWhen.addButton(self.radio_backendStartWhen3, 3) try: startEtmWhen = callXwaredInterface("getStartEtmWhen") self.btngrp_etmStartWhen.button(startEtmWhen).setChecked(True) except SocketDoesntExist: self.group_etmStartWhen.setEnabled(False) self.btn_addMount.clicked.connect(self.slotAddMount) self.btn_removeMount.clicked.connect(self.slotRemoveMount) self.btn_refreshMount.clicked.connect(self.setupMounts) # Mounts self.setupMounts() # backend setting is a different thing! self.setupETM() @staticmethod def doesAutoStartFileExists(): return os.path.lexists(constants.FRONTEND_AUTOSTART_FILE) @pyqtSlot(int) def slotWatchClipboardToggled(self, state): # disable pattern settings, before # 1. complete patterns # 2. test glib key file compatibility self.plaintext_watchPattern.setReadOnly(True) self.plaintext_watchPattern.setEnabled(state) @pyqtSlot() def setupMounts(self): self.table_mounts.setRowCount(0) self.table_mounts.clearContents() permissionCheckResult = app.mountsFaker.permissionCheck() permissionCheckFailed = ["无法获得检测权限。运行{}查看原因。".format(constants.PERMISSIONCHECK)] mountsMapping = app.mountsFaker.getMountsMapping() for i, mount in enumerate(app.mountsFaker.mounts): # mounts = ['/path/to/1', 'path/to/2', ...] self.table_mounts.insertRow(i) self.table_mounts.setItem(i, 0, QTableWidgetItem(mount)) # drive1: the drive letter it should map to, by alphabetical order drive1 = chr(ord('C') + i) + ":" self.table_mounts.setItem(i, 1, QTableWidgetItem(drive1)) # drive2: the drive letter it actually is assigned to drive2 = mountsMapping.get(mount, "无") # check 1: permission errors = permissionCheckResult.get(mount, permissionCheckFailed) # check 2: mapping if drive1 != drive2: errors.append( "警告:盘符映射在'{actual}',而不是'{should}'。需要重启后端修复。".format( actual = drive2, should = drive1)) brush = QBrush() if errors: brush.setColor(Qt.red) errString = "\n".join(errors) else: brush.setColor(Qt.darkGreen) errString = "正常" errWidget = QTableWidgetItem(errString) errWidget.setForeground(brush) self.table_mounts.setItem(i, 2, errWidget) del brush, errWidget self.table_mounts.resizeColumnsToContents() @pyqtSlot() def slotAddMount(self): fileDialog = QFileDialog(self, Qt.Dialog) fileDialog.setFileMode(QFileDialog.Directory) fileDialog.setOption(QFileDialog.ShowDirsOnly, True) fileDialog.setViewMode(QFileDialog.List) fileDialog.setDirectory(os.environ["HOME"]) if fileDialog.exec(): selected = fileDialog.selectedFiles()[0] if selected in self.newMounts: return row = self.table_mounts.rowCount() self.table_mounts.insertRow(row) self.table_mounts.setItem(row, 0, QTableWidgetItem(selected)) self.table_mounts.setItem(row, 1, QTableWidgetItem("新近添加")) self.table_mounts.setItem(row, 2, QTableWidgetItem("新近添加")) @pyqtSlot() def slotRemoveMount(self): row = self.table_mounts.currentRow() self.table_mounts.removeRow(row) @pyqtSlot() def accept(self): app.settings.set("account", "username", self.lineEdit_loginUsername.text()) app.settings.set("account", "password", self.lineEdit_loginPassword.text()) app.settings.setbool("account", "autologin", self.checkBox_autoLogin.isChecked()) doesAutoStartFileExists = self.doesAutoStartFileExists() if self.checkBox_autoStartFrontend.isChecked() and not doesAutoStartFileExists: # mkdir if autostart dir doesn't exist try: os.mkdir(os.path.dirname(constants.FRONTEND_AUTOSTART_FILE)) except OSError: pass # already exists os.symlink(constants.DESKTOP_FILE_LOCATION, constants.FRONTEND_AUTOSTART_FILE) elif (not self.checkBox_autoStartFrontend.isChecked()) and doesAutoStartFileExists: os.remove(constants.FRONTEND_AUTOSTART_FILE) app.settings.setbool("frontend", "enabledeveloperstools", self.checkBox_enableDevelopersTools.isChecked()) app.settings.setbool("frontend", "allowflash", self.checkBox_allowFlash.isChecked()) app.settings.setbool("frontend", "minimizetosystray", self.checkBox_minimizeToSystray.isChecked()) # A possible Qt bug # https://bugreports.qt-project.org/browse/QTBUG-37695 app.settings.setbool("frontend", "closetominimize", self.checkBox_closeToMinimize.isChecked()) app.settings.setbool("frontend", "popnotifications", self.checkBox_popNotifications.isChecked()) app.settings.setbool("frontend", "notifybysound", self.checkBox_notifyBySound.isChecked()) app.settings.setbool("frontend", "showmonitorwindow", self.checkBox_showMonitorWindow.isChecked()) app.settings.setint("frontend", "monitorfullspeed", self.spinBox_monitorFullSpeed.value()) app.settings.setbool("frontend", "watchclipboard", self.checkBox_watchClipboard.isChecked()) # app.settings.set("frontend", "watchpattern", # self.plaintext_watchPattern.toPlainText()) if self.group_etmStartWhen.isEnabled(): startEtmWhen = self.btngrp_etmStartWhen.id(self.btngrp_etmStartWhen.checkedButton()) try: callXwaredInterface("setStartEtmWhen", startEtmWhen) except SocketDoesntExist: QMessageBox.warning(None, "Xware Desktop", "选项未能成功设置:{}。".format(self.group_etmStartWhen.title()), QMessageBox.Ok, QMessageBox.Ok) app.settings.save() app.mountsFaker.mounts = self.newMounts app.settings.applySettings.emit() super().accept() @property def newMounts(self): return list(map(lambda row: self.table_mounts.item(row, 0).text(), range(self.table_mounts.rowCount()))) @pyqtSlot() def setupETM(self): # fill values lcPort = app.xwaredpy.lcPort self.lineEdit_lcport.setText(str(lcPort) if lcPort else "不可用") etmSettings = app.etmpy.getSettings() if etmSettings: self.spinBox_dSpeedLimit.setValue(etmSettings.dLimit) self.spinBox_uSpeedLimit.setValue(etmSettings.uLimit) self.spinBox_maxRunningTasksNum.setValue(etmSettings.maxRunningTasksNum) # connect signals self.accepted.connect(self.saveETM) else: self.spinBox_dSpeedLimit.setEnabled(False) self.spinBox_uSpeedLimit.setEnabled(False) self.spinBox_maxRunningTasksNum.setEnabled(False) @pyqtSlot() def saveETM(self): newsettings = EtmSetting(dLimit = self.spinBox_dSpeedLimit.value(), uLimit = self.spinBox_uSpeedLimit.value(), maxRunningTasksNum = self.spinBox_maxRunningTasksNum.value()) app.etmpy.saveSettings(newsettings)
class SettingsDialog(QDialog, Ui_Dialog): def __init__(self, parent): super().__init__(parent) self.setWindowModality(Qt.WindowModal) self.setAttribute(Qt.WA_DeleteOnClose) self.mainWin = parent self.setupUi(self) self.lineEdit_loginUsername.setText(self.settings.get("account", "username")) self.lineEdit_loginPassword.setText(self.settings.get("account", "password")) self.checkBox_autoLogin.setChecked(self.settings.getbool("account", "autologin")) self.checkBox_enableDevelopersTools.setChecked( self.settings.getbool("frontend", "enabledeveloperstools")) self.checkBox_allowFlash.setChecked(self.settings.getbool("frontend", "allowflash")) self.checkBox_minimizeToSystray.setChecked(self.settings.getbool("frontend", "minimizetosystray")) self.checkBox_closeToMinimize.setChecked(self.settings.getbool("frontend", "closetominimize")) self.checkBox_popNotifications.setChecked(self.settings.getbool("frontend", "popnotifications")) self.checkBox_notifyBySound.setChecked(self.settings.getbool("frontend", "notifybysound")) self.checkBox_showMonitorWindow.setChecked(self.settings.getbool("frontend", "showmonitorwindow")) self.spinBox_monitorFullSpeed.setValue(self.settings.getint("frontend", "monitorfullspeed")) # clipboard related self.checkBox_watchClipboard.stateChanged.connect(self.slotWatchClipboardToggled) self.checkBox_watchClipboard.setChecked(self.settings.getbool("frontend", "watchclipboard")) self.slotWatchClipboardToggled(self.checkBox_watchClipboard.checkState()) self.plaintext_watchPattern.setPlainText(self.settings.get("frontend", "watchpattern")) from PyQt5.QtWidgets import QButtonGroup self.btngrp_etmStartWhen = QButtonGroup() self.btngrp_etmStartWhen.addButton(self.radio_backendStartWhen1, 1) self.btngrp_etmStartWhen.addButton(self.radio_backendStartWhen2, 2) self.btngrp_etmStartWhen.addButton(self.radio_backendStartWhen3, 3) self.btngrp_etmStartWhen.button(self.settings.getint("xwared", "startetmwhen")).setChecked(True) self.accepted.connect(self.writeSettings) self.btn_addMount.clicked.connect(self.slotAddMount) self.btn_removeMount.clicked.connect(self.slotRemoveMount) self.btn_refreshMount.clicked.connect(self.setupMounts) # Mounts self.setupMounts() # backend setting is a different thing! self.setupETM() # shorthand @property def settings(self): return self.mainWin.settings # shorthand ends @staticmethod def permissionCheck(): import re ansiEscape = re.compile(r'\x1b[^m]*m') import subprocess with subprocess.Popen([constants.PERMISSIONCHECK], stdout = subprocess.PIPE, stderr = subprocess.PIPE) as proc: output = proc.stdout.read().decode("utf-8") output = ansiEscape.sub('', output) lines = output.split("\n") prevLine = None currMount = None result = {} for line in lines: if len(line.strip()) == 0: continue if all(map(lambda c: c == '=', line)): if currMount: result[currMount] = result[currMount][:-1] result[prevLine] = [] currMount = prevLine continue if currMount: if line != "正常。": result[currMount].append(line) prevLine = line return result @pyqtSlot(int) def slotWatchClipboardToggled(self, state): # disable pattern settings, before # 1. complete patterns # 2. test glib key file compatibility self.plaintext_watchPattern.setReadOnly(True) self.plaintext_watchPattern.setEnabled(state) @pyqtSlot() def setupMounts(self): self.table_mounts.setRowCount(0) self.table_mounts.clearContents() PermissionError = self.permissionCheck() mountsMapping = self.mainWin.mountsFaker.getMountsMapping() for i, mount in enumerate(self.mainWin.mountsFaker.mounts): # mounts = ['/path/to/1', 'path/to/2', ...] self.table_mounts.insertRow(i) self.table_mounts.setItem(i, 0, QTableWidgetItem(mount)) drive1 = chr(ord('C') + i) + ":" # the drive letter it should map to, by alphabetical order self.table_mounts.setItem(i, 1, QTableWidgetItem(drive1)) drive2 = mountsMapping.get(mount, "无") # the drive letter it actually is assigned to # check 1: permission errors = PermissionError.get(mount, ["无法获得检测权限。运行/opt/xware_desktop/permissioncheck查看原因。"]) # check 2: mapping if drive1 != drive2: errors.append("警告:盘符映射在'{actual}',而不是'{should}'。需要重启后端修复。".format(actual = drive2, should = drive1)) from PyQt5.Qt import Qt from PyQt5.QtGui import QBrush brush = QBrush() if errors: brush.setColor(Qt.red) errString = "\n".join(errors) else: brush.setColor(Qt.darkGreen) errString = "正常" errWidget = QTableWidgetItem(errString) errWidget.setForeground(brush) self.table_mounts.setItem(i, 2, errWidget) del brush, errWidget self.table_mounts.resizeColumnsToContents() @pyqtSlot() def slotAddMount(self): import os from PyQt5.QtWidgets import QFileDialog from PyQt5.Qt import Qt fileDialog = QFileDialog(self, Qt.Dialog) fileDialog.setFileMode(QFileDialog.Directory) fileDialog.setOption(QFileDialog.ShowDirsOnly, True) fileDialog.setViewMode(QFileDialog.List) fileDialog.setDirectory(os.environ["HOME"]) if (fileDialog.exec()): selected = fileDialog.selectedFiles()[0] if selected in self.newMounts: return row = self.table_mounts.rowCount() self.table_mounts.insertRow(row) self.table_mounts.setItem(row, 0, QTableWidgetItem(selected)) self.table_mounts.setItem(row, 1, QTableWidgetItem("新近添加")) self.table_mounts.setItem(row, 2, QTableWidgetItem("新近添加")) @pyqtSlot() def slotRemoveMount(self): row = self.table_mounts.currentRow() self.table_mounts.removeRow(row) @pyqtSlot() def writeSettings(self): self.settings.set("account", "username", self.lineEdit_loginUsername.text()) self.settings.set("account", "password", self.lineEdit_loginPassword.text()) self.settings.setbool("account", "autologin", self.checkBox_autoLogin.isChecked()) self.settings.setbool("frontend", "enabledeveloperstools", self.checkBox_enableDevelopersTools.isChecked()) self.settings.setbool("frontend", "allowflash", self.checkBox_allowFlash.isChecked()) self.settings.setbool("frontend", "minimizetosystray", self.checkBox_minimizeToSystray.isChecked()) # A possible Qt bug # https://bugreports.qt-project.org/browse/QTBUG-37695 self.settings.setbool("frontend", "closetominimize", self.checkBox_closeToMinimize.isChecked()) self.settings.setbool("frontend", "popnotifications", self.checkBox_popNotifications.isChecked()) self.settings.setbool("frontend", "notifybysound", self.checkBox_notifyBySound.isChecked()) self.settings.setbool("frontend", "showmonitorwindow", self.checkBox_showMonitorWindow.isChecked()) self.settings.setint("frontend", "monitorfullspeed", self.spinBox_monitorFullSpeed.value()) self.settings.setbool("frontend", "watchclipboard", self.checkBox_watchClipboard.isChecked()) # self.settings.set("frontend", "watchpattern", # self.plaintext_watchPattern.toPlainText()) self.settings.setint("xwared", "startetmwhen", self.btngrp_etmStartWhen.id(self.btngrp_etmStartWhen.checkedButton())) startETMWhen = self.settings.getint("xwared", "startetmwhen") if startETMWhen == 1: self.settings.setbool("xwared", "startetm", True) self.settings.save() self.mainWin.mountsFaker.setMounts(self.newMounts) self.settings.applySettings.emit() @property def newMounts(self): return list(map(lambda row: self.table_mounts.item(row, 0).text(), range(self.table_mounts.rowCount()))) @pyqtSlot() def setupETM(self): etmpy = self.mainWin.etmpy # fill values self.lineEdit_lcport.setText(etmpy.cfg.get("local_control.listen_port", "不可用")) etmSettings = etmpy.getSettings() if etmSettings: self.spinBox_dSpeedLimit.setValue(etmSettings.dLimit) self.spinBox_uSpeedLimit.setValue(etmSettings.uLimit) self.spinBox_maxRunningTasksNum.setValue(etmSettings.maxRunningTasksNum) # connect signals self.accepted.connect(self.saveETM) else: self.spinBox_dSpeedLimit.setEnabled(False) self.spinBox_uSpeedLimit.setEnabled(False) self.spinBox_maxRunningTasksNum.setEnabled(False) @pyqtSlot() def saveETM(self): import etmpy newsettings = etmpy.EtmSetting(dLimit = self.spinBox_dSpeedLimit.value(), uLimit = self.spinBox_uSpeedLimit.value(), maxRunningTasksNum = self.spinBox_maxRunningTasksNum.value()) self.mainWin.etmpy.saveSettings(newsettings)
class Equal_NotEqual(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent=parent) self.parent = parent #self.setStyleSheet("background-color:#BD0000;") self.build_ui() self.isEffectiveOdds = self.parent.config.get('iseffectiveodds', True) def build_ui(self): #roll equal/notequal self.roll_choice = 0 self.main_grid = QGridLayout() self.buttonGroup = QButtonGroup() btnsize = QSize(85, 70) for i in range(2, 13): button = QPushButton(str(i)) button.setCheckable(True) button.setStyleSheet("background-color: white; color:red;") font = button.font() font.setPointSize(22) font.setBold(True) button.setFont(font) button.setFixedSize(btnsize) self.buttonGroup.addButton(button) self.main_grid.addWidget(button, 0, i) self.buttonGroup.buttonClicked[int].connect(self.roll_selected) self.btn_equal_to = QPushButton("Equal to") self.edit_roll_amount = BTCAmountEdit(self.parent.get_decimal_point) self.edit_roll_amount.setPlaceholderText("Roll Amount (Min 25)") self.edit_roll_amount.setValidator( QDoubleValidator(self.edit_roll_amount)) self.edit_roll_amount.textChanged.connect(self.amountChanged) self.fiat_c = AmountEdit( self.parent.fx.get_currency if self.parent.fx else '') if not self.parent.fx or not self.parent.fx.is_enabled(): self.fiat_c.setVisible(False) self.edit_roll_amount.frozen.connect( lambda: self.fiat_c.setFrozen(self.edit_roll_amount.isReadOnly())) self.btn_not_equal_to = QPushButton("Not Equal to") self.btn_equal_to.setDisabled(True) self.btn_not_equal_to.setDisabled(True) self.btn_equal_to.clicked.connect(lambda: self.do_roll("EQUAL")) self.btn_not_equal_to.clicked.connect(lambda: self.do_roll("NOTEQUAL")) self.roll_control_widget = QWidget() self.roll_control_vbox = QVBoxLayout(self.roll_control_widget) self.roll_control_grid = QGridLayout() self.roll_control_grid.addWidget(self.btn_equal_to, 0, 1) self.roll_control_grid.addWidget(self.edit_roll_amount, 0, 2) self.roll_control_grid.addWidget(self.btn_not_equal_to, 0, 3) self.roll_control_grid.setSpacing(20) self.lbl_pr_equal = QLabel("") self.lbl_pr_equal.setAlignment(Qt.AlignCenter) self.lbl_pr_equal.setStyleSheet("color:black;font-weight:bold;") self.lbl_pr_label = QLabel("") self.lbl_pr_label.setAlignment(Qt.AlignCenter) self.lbl_pr_label.setStyleSheet("color:black;font-weight:bold;") self.lbl_pr_notequal = QLabel("") self.lbl_pr_notequal.setAlignment(Qt.AlignCenter) self.lbl_pr_notequal.setStyleSheet("color:black;font-weight:bold;") self.roll_control_grid.addWidget(self.lbl_pr_equal, 1, 1) self.roll_control_grid.addWidget(self.lbl_pr_label, 1, 2) self.roll_control_grid.addWidget(self.lbl_pr_notequal, 1, 3) self.roll_control_vbox.addLayout(self.roll_control_grid) self.main_grid.addWidget(self.roll_control_widget, 2, 5, 1, 5) self.main_grid.setSpacing(10) self.setLayout(self.main_grid) def reset_button_group(self): checked = self.buttonGroup.checkedButton() if checked: self.buttonGroup.setExclusive(False) checked.setChecked(False) self.buttonGroup.setExclusive(True) def roll_selected(self, id): self.roll_choice = abs(id) self.amountChanged() ##recalculate PR. def do_roll(self, side): self.side = side self.outcome = int(self.roll_choice) self.amount = int(self.edit_roll_amount.get_amount()) self.parent.do_roll(self, "dice") def amountChanged(self): rollAmtInWgr = (self.edit_roll_amount.get_amount() or 0) / COIN if rollAmtInWgr >= MIN_ROLL_AMT and rollAmtInWgr <= MAX_ROLL_AMT and self.roll_choice != 0: self.btn_equal_to.setDisabled(False) self.btn_not_equal_to.setDisabled(False) else: self.btn_equal_to.setDisabled(True) self.btn_not_equal_to.setDisabled(True) return bb = float(0) if not self.edit_roll_amount.text() == "": bb = float(self.edit_roll_amount.text()) pr_equal = calculate_potential_return(bb, self.roll_choice, "equal") pr_not_equal = calculate_potential_return(bb, self.roll_choice, "notequal") if not self.isEffectiveOdds: #calculate onchain odds pr_equal = (pr_equal - 1) / 0.99 + 1 pr_not_equal = (pr_not_equal - 1) / 0.99 + 1 pr_equal_str = format_amount(pr_equal) pr_not_equal_str = format_amount(pr_not_equal) self.lbl_pr_equal.setText(pr_equal_str) self.lbl_pr_label.setText("<-- Potential Return -->") self.lbl_pr_notequal.setText(pr_not_equal_str)
class MainWindow(QDialog, window1.Ui_PyDialog): def __init__(self, parent=None): global arguments, return_keyword self.event_entered = False self.event2_entered = False super(MainWindow, self).__init__(parent) self.setupUi(self) self.label.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)) self.word_wrap() self.button_ids = ["details_button", "ok_button", "yes_button", "no_button", "continue_button", "save_button", "cancel_button"] self.button_names = { "details_button":_("Details"), "ok_button":_("Ok"), "yes_button":_("Yes"), "no_button":_("No"), "continue_button":_("Continue"), "save_button":_("Save"), "cancel_button":_("Cancel") } self.button_values = {} self.create_elements() def word_wrap(self): if self.label.sizeHint().width() > 600: self.label.setWordWrap(True) self.label.setMinimumWidth(600) def create_elements(self): self.active_buttons = dict((e, False) for e in self.button_names) self.progressbar_cancelled = False self.hide_unused_elements() self.init_conf() self.create_buttons() self.set_button_labels() noab = len(list(filter(lambda x: self.active_buttons[x], self.active_buttons))) self.reject_value = noab - 1 def hide_unused_elements(self): """ Hide the unused elements """ global arguments if not arguments.forkedprogressbar: self.progressBar.hide() if not arguments.slider: self.horizontalSlider.hide() if not arguments.combobox: self.comboBox.hide() if not arguments.inputbox and not arguments.password: self.lineEdit.hide() if not arguments.combobox and not arguments.password: self.label_2.hide() def init_conf(self): """ Initial configurations (buttons and labels) """ global arguments if arguments.title: self.setWindowTitle(arguments.title) if arguments.icon: from PyQt5.QtGui import QIcon icon = QIcon(arguments.icon) self.setWindowIcon(icon) if arguments.yesno or arguments.warningyesno: self.enable_buttons(["yes_button", "no_button"]) if arguments.yesno: self.label.setText(arguments.yesno) else: self.label.setText(arguments.warningyesno) elif arguments.yesnocancel or arguments.warningyesnocancel: self.enable_buttons(["yes_button", "no_button", "cancel_button"]) if arguments.yesnocancel: self.label.setText(arguments.yesnocancel) else: self.label.setText(arguments.warningyesnocancel) elif arguments.sorry or arguments.error or arguments.msgbox: self.enable_buttons(["ok_button"]) if arguments.sorry: self.label.setText(arguments.sorry) elif arguments.error: self.label.setText(arguments.error) else: self.label.setText(arguments.msgbox) elif arguments.detailedsorry or arguments.detailederror: self.enable_buttons(["details_button", "ok_button"]) if arguments.detailedsorry: self.label.setText(arguments.detailedsorry[0]) self.details = arguments.detailedsorry[1] else: self.label.setText(arguments.detailederror[0]) self.details = arguments.detailederror[1] elif arguments.warningcontinuecancel: self.enable_buttons(["continue_button", "cancel_button"]) self.label.setText(arguments.warningcontinuecancel) elif arguments.forkedprogressbar: self.label.setText(arguments.forkedprogressbar[0]) if len(arguments.forkedprogressbar) > 1: self.progressBar.setMaximum(int(arguments.forkedprogressbar[1])) elif arguments.slider: self.enable_buttons(["ok_button", "cancel_button"]) self.label.setText(arguments.slider[0]) if len(arguments.slider) > 1: self.horizontalSlider.setMinimum(int(arguments.slider[1])) if len(arguments.slider) > 2: self.horizontalSlider.setMaximum(int(arguments.slider[2])) if len(arguments.slider) > 3: self.horizontalSlider.setSingleStep(int(arguments.slider[3])) self.horizontalSlider.setPageStep(int(arguments.slider[3])) elif arguments.inputbox: self.enable_buttons(["ok_button", "cancel_button"]) self.label.setText(arguments.inputbox[0]) if len(arguments.inputbox) > 1: self.lineEdit.setText(arguments.inputbox[1]) elif arguments.password: self.enable_buttons(["ok_button", "cancel_button"]) self.lineEdit.setEchoMode(2) self.label.setText(arguments.password[0]) self.label_2.setText(_("Password:"******"ok_button", "cancel_button"]) def add_checkboxes(self): from PyQt5.QtWidgets import QCheckBox self.checkboxes = [] i = 1 while i < len(arguments.checklist): checkbox = QCheckBox(arguments.checklist[i+1]) if arguments.checklist[i+2].lower() == "true": checkbox.setCheckState(2) self.checkboxes.append({"box":checkbox, "result":arguments.checklist[i]}) self.scrollLayout.addWidget(checkbox) i += 3 def add_radiobuttons(self): from PyQt5.QtWidgets import QRadioButton, QButtonGroup self.buttonGroup = QButtonGroup() self.buttongroup_results = {} i = 1 while i < len(arguments.radiolist): radiobutton = QRadioButton(arguments.radiolist[i+1]) self.buttongroup_results[radiobutton] = arguments.radiolist[i] if arguments.radiolist[i+2].lower() == "true": radiobutton.setChecked(True) self.scrollLayout.addWidget(radiobutton) self.buttonGroup.addButton(radiobutton) i += 3 def set_button_labels(self): """Set the button labels""" global arguments if arguments.yeslabel and self.active_buttons["yes_button"]: self.buttons["yes_button"].setText(arguments.yeslabel) if arguments.nolabel and self.active_buttons["no_button"]: self.buttons["no_button"].setText(arguments.nolabel) if arguments.cancellabel and self.active_buttons["cancel_button"]: self.buttons["cancel_button"].setText(arguments.cancellabel) if arguments.continuelabel and self.active_buttons["continue_button"]: self.buttons["continue_button"].setText(arguments.continuelabel) def create_buttons(self): global arguments self.buttons = {} i = 0 for button_id in self.button_ids: if self.active_buttons[button_id]: self.buttons[button_id] = QPushButton(self.button_names[button_id]) self.horizontalLayout.addWidget(self.buttons[button_id]) if button_id == "details_button": self.buttons["details_button"].clicked.connect(self.details_button_clicked) elif button_id == "cancel_button": self.buttons[button_id].clicked.connect(self.reject) else: self.button_values[button_id] = i exec("self.buttons[button_id].clicked.connect(self."+button_id+"_clicked)") i += 1 def print_checkboxes(self): for e in self.checkboxes: if e["box"].isChecked(): print("%r " % e["result"], end="") def get_checked_radiobutton(self): radiobutton_name = self.buttonGroup.checkedButton() print("%r" % self.buttongroup_results[radiobutton_name]) def ok_button_clicked(self): if arguments.slider: print(self.horizontalSlider.value()) elif arguments.inputbox or arguments.password: print(self.lineEdit.text()) elif arguments.checklist: self.print_checkboxes() elif arguments.radiolist: self.get_checked_radiobutton() print(return_keyword+str(self.button_values["ok_button"])+">") self.done(0) def yes_button_clicked(self): print(return_keyword+str(self.button_values["yes_button"])+">") self.done(0) def no_button_clicked(self): print(return_keyword+str(self.button_values["no_button"])+">") self.done(0) def continue_button_clicked(self): print(return_keyword+str(self.button_values["continue_button"])+">") self.done(0) def save_button_clicked(self): print(return_keyword+str(self.button_values["save_button"])+">") self.done(0) def reject(self): print(return_keyword+str(self.reject_value)+">") self.done(0) def enable_buttons (self, button_list): for button in button_list: self.active_buttons[button] = True def details_button_clicked (self): self.label.setText(self.label.text() + '\n\n' + self.details) self.buttons["details_button"].setDisabled(True) def progressbar_cancel_clicked(self): self.progressbar_cancelled = True def showCancelButton(self): if not "cancel_button" in self.buttons: self.buttons["cancel_button"] = QPushButton(self.button_names["cancel_button"]) self.buttons["cancel_button"].clicked.connect(self.progressbar_cancel_clicked) self.horizontalLayout.addWidget(self.buttons["cancel_button"]) self.progressbar_cancelled = False self.buttons["cancel_button"].show()
class App(QWidget): def __init__(self, bk, prefs): super().__init__() self.bk = bk self.prefs = prefs self.update = False self._ok_to_close = False self.FTYPE_MAP = { 'smap': { 'title': _translate('App', 'Select custom style-map file'), 'defaultextension': '.txt', 'filetypes': 'Text Files (*.txt);;All files (*.*)', }, 'css': { 'title': _translate('App', 'Select custom CSS file'), 'defaultextension': '.css', 'filetypes': 'CSS Files (*.css)', }, 'docx': { 'title': _translate('App', 'Select DOCX file'), 'defaultextension': '.docx', 'filetypes': 'DOCX Files (*.docx)', }, } # Check online github files for newer version if self.prefs['check_for_updates']: self.update, self.newversion = self.check_for_update() self.initUI() def initUI(self): main_layout = QVBoxLayout(self) self.upd_layout = QVBoxLayout() self.update_label = QLabel() self.update_label.setAlignment(Qt.AlignCenter) self.upd_layout.addWidget(self.update_label) self.get_update_button = QPushButton() self.get_update_button.clicked.connect(self.get_update) self.upd_layout.addWidget(self.get_update_button) main_layout.addLayout(self.upd_layout) if not self.update: self.update_label.hide() self.get_update_button.hide() self.details_grid = QGridLayout() self.epub2_select = QRadioButton() self.epub2_select.setText('EPUB2') self.epubType = QButtonGroup() self.epubType.addButton(self.epub2_select) self.details_grid.addWidget(self.epub2_select, 0, 0, 1, 1) self.checkbox_get_updates = QCheckBox() self.details_grid.addWidget(self.checkbox_get_updates, 0, 1, 1, 1) self.epub3_select = QRadioButton() self.epub3_select.setText('EPUB3') self.epubType.addButton(self.epub3_select) self.details_grid.addWidget(self.epub3_select, 1, 0, 1, 1) main_layout.addLayout(self.details_grid) self.checkbox_get_updates.setChecked(self.prefs['check_for_updates']) if self.prefs['epub_version'] == '2.0': self.epub2_select.setChecked(True) elif self.prefs['epub_version'] == '3.0': self.epub3_select.setChecked(True) else: self.epub2_select.setChecked(True) self.groupBox = QGroupBox() self.groupBox.setTitle('') self.verticalLayout_2 = QVBoxLayout(self.groupBox) self.docx_grid = QGridLayout() self.docx_label = QLabel() self.docx_grid.addWidget(self.docx_label, 0, 0, 1, 1) self.docx_path = QLineEdit() self.docx_grid.addWidget(self.docx_path, 1, 0, 1, 1) self.choose_docx_button = QPushButton() self.choose_docx_button.setText('...') self.docx_grid.addWidget(self.choose_docx_button, 1, 1, 1, 1) self.verticalLayout_2.addLayout(self.docx_grid) self.choose_docx_button.clicked.connect( lambda: self.fileChooser('docx', self.docx_path)) if len(self.prefs['lastDocxPath']): self.docx_path.setText(self.prefs['lastDocxPath']) self.docx_path.setEnabled(False) self.smap_grid = QGridLayout() self.checkbox_smap = QCheckBox(self.groupBox) self.smap_grid.addWidget(self.checkbox_smap, 0, 0, 1, 1) self.cust_smap_path = QLineEdit(self.groupBox) self.smap_grid.addWidget(self.cust_smap_path, 1, 0, 1, 1) self.choose_smap_button = QPushButton(self.groupBox) self.choose_smap_button.setText('...') self.smap_grid.addWidget(self.choose_smap_button, 1, 1, 1, 1) self.verticalLayout_2.addLayout(self.smap_grid) self.checkbox_smap.setChecked(self.prefs['useSmap']) self.checkbox_smap.stateChanged.connect(lambda: self.chkBoxActions( self.checkbox_smap, self.choose_smap_button)) self.choose_smap_button.clicked.connect( lambda: self.fileChooser('smap', self.cust_smap_path, self. checkbox_smap, self.choose_smap_button)) if len(self.prefs['useSmapPath']): self.cust_smap_path.setText(self.prefs['useSmapPath']) self.cust_smap_path.setEnabled(False) self.chkBoxActions(self.checkbox_smap, self.choose_smap_button) self.css_grid = QGridLayout() self.checkbox_css = QCheckBox(self.groupBox) self.css_grid.addWidget(self.checkbox_css, 0, 0, 1, 1) self.cust_css_path = QLineEdit(self.groupBox) self.css_grid.addWidget(self.cust_css_path, 1, 0, 1, 1) self.choose_css_button = QPushButton(self.groupBox) self.choose_css_button.setText('...') self.css_grid.addWidget(self.choose_css_button, 1, 1, 1, 1) self.verticalLayout_2.addLayout(self.css_grid) self.checkbox_css.setChecked(self.prefs['useCss']) self.checkbox_css.stateChanged.connect(lambda: self.chkBoxActions( self.checkbox_css, self.choose_css_button)) self.choose_css_button.clicked.connect( lambda: self.fileChooser('css', self.cust_css_path, self. checkbox_css, self.choose_css_button)) if len(self.prefs['useCssPath']): self.cust_css_path.setText(self.prefs['useCssPath']) self.cust_css_path.setEnabled(False) self.chkBoxActions(self.checkbox_css, self.choose_css_button) main_layout.addWidget(self.groupBox) self.checkbox_debug = QCheckBox() main_layout.addWidget(self.checkbox_debug) self.checkbox_debug.setChecked(self.prefs['debug']) spacerItem = QSpacerItem(20, 15, QSizePolicy.Minimum, QSizePolicy.Expanding) main_layout.addItem(spacerItem) button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) button_box.accepted.connect(self._ok_clicked) button_box.rejected.connect(self._cancel_clicked) main_layout.addWidget(button_box) self.retranslateUi(self) if self.prefs['qt_geometry'] is not None: self.restoreGeometry( binascii.a2b_base64(self.prefs['qt_geometry'].encode('ascii'))) self.show() def retranslateUi(self, App): # No translation currently taking place, but it doesn't hurt to get a head start. self.setWindowTitle(_translate('App', 'DOCXImport')) self.update_label.setText(_translate('App', 'Plugin Update Available')) self.get_update_button.setText(_translate('App', 'Go to download page')) self.checkbox_get_updates.setText( _translate('App', 'Check for plugin updates')) self.docx_label.setText(_translate('App', 'DOCX File to import')) self.checkbox_smap.setText(_translate('App', 'Use Custom Style Map')) self.checkbox_css.setText(_translate('App', 'Use Custom CSS')) self.checkbox_debug.setText( _translate('App', 'Debug Mode (change takes effect next plugin run)')) def fileChooser(self, ftype, qlineedit, qcheck=None, qbutton=None): _translate = QCoreApplication.translate options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog title = self.FTYPE_MAP[ftype]['title'] startfolder = self.prefs['lastDir'][ftype] ffilter = self.FTYPE_MAP[ftype]['filetypes'] inpath, _ = QFileDialog.getOpenFileName(self, _translate('APP', title), startfolder, ffilter, options=options) if len(inpath): qlineedit.setEnabled(True) qlineedit.setText(os.path.normpath(inpath)) self.prefs['lastDir'][ftype] = os.path.dirname(inpath) qlineedit.setEnabled(False) else: if qcheck is not None: qcheck.setChecked(False) if qbutton is not None: qbutton.setEnabled(False) def chkBoxActions(self, chk, btn): btn.setEnabled(chk.isChecked()) def cmdDo(self): global _DETAILS self.prefs['qt_geometry'] = binascii.b2a_base64( self.saveGeometry()).decode('ascii') self.prefs['check_for_updates'] = self.checkbox_get_updates.isChecked() self.prefs['epub_version'] = self.epubType.checkedButton().text( )[-1] + '.0' self.prefs['debug'] = self.checkbox_debug.isChecked() _DETAILS['vers'] = self.epubType.checkedButton().text()[-1] + '.0' self.prefs['useSmap'] = self.checkbox_smap.isChecked() if self.checkbox_smap.isChecked(): if len(self.cust_smap_path.text()): self.prefs['useSmapPath'] = self.cust_smap_path.text() _DETAILS['smap'] = (self.checkbox_smap.isChecked(), self.cust_smap_path.text()) else: # Message box that no file is selected return self.prefs['useCss'] = self.checkbox_css.isChecked() if self.checkbox_css.isChecked(): if len(self.cust_css_path.text()): self.prefs['useCssPath'] = self.cust_css_path.text() _DETAILS['css'] = (self.checkbox_css.isChecked(), self.cust_css_path.text()) else: # Message box that no file is selected return if len(self.docx_path.text()): self.prefs['lastDocxPath'] = self.docx_path.text() _DETAILS['docx'] = self.docx_path.text() else: # Message box that no file is selected return def check_for_update(self): '''Use updatecheck.py to check for newer versions of the plugin''' chk = UpdateChecker(self.prefs['last_time_checked'], self.bk._w) update_available, online_version, time = chk.update_info() # update preferences with latest date/time/version self.prefs['last_time_checked'] = time if online_version is not None: self.prefs['last_online_version'] = online_version if update_available: return (True, online_version) return (False, online_version) def get_update(self): url = DOWNLOAD_PAGE if self.update: latest = '/tag/v{}'.format(self.newversion) url = url + latest webbrowser.open_new_tab(url) @pyqtSlot() def _ok_clicked(self): self._ok_to_close = True self.cmdDo() self.bk.savePrefs(self.prefs) QCoreApplication.instance().quit() @pyqtSlot() def _cancel_clicked(self): self._ok_to_close = True '''Close aborting any changes''' self.prefs['qt_geometry'] = binascii.b2a_base64( self.saveGeometry()).decode('ascii') self.prefs['check_for_updates'] = self.checkbox_get_updates.isChecked() self.prefs['debug'] = self.checkbox_debug.isChecked() self.bk.savePrefs(self.prefs) QCoreApplication.instance().quit() def closeEvent(self, event): if self._ok_to_close: event.accept() # let the window close else: self._cancel_clicked()
class App(QWidget): def __init__(self, bk, prefs): super().__init__() self.bk = bk self.prefs = prefs self.update = False self._ok_to_close = False self.FTYPE_MAP = { 'smap': { 'title' : _translate('App', 'Select custom style-map file'), 'defaultextension' : '.txt', 'filetypes' : 'Text Files (*.txt);;All files (*.*)', }, 'css' : { 'title' : _translate('App', 'Select custom CSS file'), 'defaultextension' : '.css', 'filetypes' : 'CSS Files (*.css)', }, 'docx' : { 'title' : _translate('App', 'Select DOCX file'), 'defaultextension' : '.docx', 'filetypes' : 'DOCX Files (*.docx)', }, } # Check online github files for newer version if self.prefs['check_for_updates']: self.update, self.newversion = self.check_for_update() self.initUI() def initUI(self): main_layout = QVBoxLayout(self) self.upd_layout = QVBoxLayout() self.update_label = QLabel() self.update_label.setAlignment(Qt.AlignCenter) self.upd_layout.addWidget(self.update_label) self.get_update_button = QPushButton() self.get_update_button.clicked.connect(self.get_update) self.upd_layout.addWidget(self.get_update_button) main_layout.addLayout(self.upd_layout) if not self.update: self.update_label.hide() self.get_update_button.hide() self.details_grid = QGridLayout() self.epub2_select = QRadioButton() self.epub2_select.setText('EPUB2') self.epubType = QButtonGroup() self.epubType.addButton(self.epub2_select) self.details_grid.addWidget(self.epub2_select, 0, 0, 1, 1) self.checkbox_get_updates = QCheckBox() self.details_grid.addWidget(self.checkbox_get_updates, 0, 1, 1, 1) self.epub3_select = QRadioButton() self.epub3_select.setText('EPUB3') self.epubType.addButton(self.epub3_select) self.details_grid.addWidget(self.epub3_select, 1, 0, 1, 1) main_layout.addLayout(self.details_grid) self.checkbox_get_updates.setChecked(self.prefs['check_for_updates']) if self.prefs['epub_version'] == '2.0': self.epub2_select.setChecked(True) elif self.prefs['epub_version'] == '3.0': self.epub3_select.setChecked(True) else: self.epub2_select.setChecked(True) self.groupBox = QGroupBox() self.groupBox.setTitle('') self.verticalLayout_2 = QVBoxLayout(self.groupBox) self.docx_grid = QGridLayout() self.docx_label = QLabel() self.docx_grid.addWidget(self.docx_label, 0, 0, 1, 1) self.docx_path = QLineEdit() self.docx_grid.addWidget(self.docx_path, 1, 0, 1, 1) self.choose_docx_button = QPushButton() self.choose_docx_button.setText('...') self.docx_grid.addWidget(self.choose_docx_button, 1, 1, 1, 1) self.verticalLayout_2.addLayout(self.docx_grid) self.choose_docx_button.clicked.connect(lambda: self.fileChooser('docx', self.docx_path)) if len(self.prefs['lastDocxPath']): self.docx_path.setText(self.prefs['lastDocxPath']) self.docx_path.setEnabled(False) self.smap_grid = QGridLayout() self.checkbox_smap = QCheckBox(self.groupBox) self.smap_grid.addWidget(self.checkbox_smap, 0, 0, 1, 1) self.cust_smap_path = QLineEdit(self.groupBox) self.smap_grid.addWidget(self.cust_smap_path, 1, 0, 1, 1) self.choose_smap_button = QPushButton(self.groupBox) self.choose_smap_button.setText('...') self.smap_grid.addWidget(self.choose_smap_button, 1, 1, 1, 1) self.verticalLayout_2.addLayout(self.smap_grid) self.checkbox_smap.setChecked(self.prefs['useSmap']) self.checkbox_smap.stateChanged.connect(lambda: self.chkBoxActions(self.checkbox_smap, self.choose_smap_button)) self.choose_smap_button.clicked.connect(lambda: self.fileChooser('smap', self.cust_smap_path, self.checkbox_smap, self.choose_smap_button)) if len(self.prefs['useSmapPath']): self.cust_smap_path.setText(self.prefs['useSmapPath']) self.cust_smap_path.setEnabled(False) self.chkBoxActions(self.checkbox_smap, self.choose_smap_button) self.css_grid = QGridLayout() self.checkbox_css = QCheckBox(self.groupBox) self.css_grid.addWidget(self.checkbox_css, 0, 0, 1, 1) self.cust_css_path = QLineEdit(self.groupBox) self.css_grid.addWidget(self.cust_css_path, 1, 0, 1, 1) self.choose_css_button = QPushButton(self.groupBox) self.choose_css_button.setText('...') self.css_grid.addWidget(self.choose_css_button, 1, 1, 1, 1) self.verticalLayout_2.addLayout(self.css_grid) self.checkbox_css.setChecked(self.prefs['useCss']) self.checkbox_css.stateChanged.connect(lambda: self.chkBoxActions(self.checkbox_css, self.choose_css_button)) self.choose_css_button.clicked.connect(lambda: self.fileChooser('css', self.cust_css_path, self.checkbox_css, self.choose_css_button)) if len(self.prefs['useCssPath']): self.cust_css_path.setText(self.prefs['useCssPath']) self.cust_css_path.setEnabled(False) self.chkBoxActions(self.checkbox_css, self.choose_css_button) main_layout.addWidget(self.groupBox) self.checkbox_debug = QCheckBox() main_layout.addWidget(self.checkbox_debug) self.checkbox_debug.setChecked(self.prefs['debug']) spacerItem = QSpacerItem(20, 15, QSizePolicy.Minimum, QSizePolicy.Expanding) main_layout.addItem(spacerItem) button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) button_box.accepted.connect(self._ok_clicked) button_box.rejected.connect(self._cancel_clicked) main_layout.addWidget(button_box) self.retranslateUi(self) if self.prefs['qt_geometry'] is not None: self.restoreGeometry(binascii.a2b_base64(self.prefs['qt_geometry'].encode('ascii'))) self.show() def retranslateUi(self, App): # No translation currently taking place, but it doesn't hurt to get a head start. self.setWindowTitle(_translate('App', 'DOCXImport')) self.update_label.setText(_translate('App', 'Plugin Update Available')) self.get_update_button.setText(_translate('App', 'Go to download page')) self.checkbox_get_updates.setText(_translate('App', 'Check for plugin updates')) self.docx_label.setText(_translate('App', 'DOCX File to import')) self.checkbox_smap.setText(_translate('App', 'Use Custom Style Map')) self.checkbox_css.setText(_translate('App', 'Use Custom CSS')) self.checkbox_debug.setText(_translate('App', 'Debug Mode (change takes effect next plugin run)')) def fileChooser(self, ftype, qlineedit, qcheck=None, qbutton=None): _translate = QCoreApplication.translate options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog title = self.FTYPE_MAP[ftype]['title'] startfolder = self.prefs['lastDir'][ftype] ffilter = self.FTYPE_MAP[ftype]['filetypes'] inpath, _ = QFileDialog.getOpenFileName(self, _translate('APP', title), startfolder, ffilter, options=options) if len(inpath): qlineedit.setEnabled(True) qlineedit.setText(os.path.normpath(inpath)) self.prefs['lastDir'][ftype] = os.path.dirname(inpath) qlineedit.setEnabled(False) else: if qcheck is not None: qcheck.setChecked(False) if qbutton is not None: qbutton.setEnabled(False) def chkBoxActions(self, chk, btn): btn.setEnabled(chk.isChecked()) def cmdDo(self): global _DETAILS self.prefs['qt_geometry'] = binascii.b2a_base64(self.saveGeometry()).decode('ascii') self.prefs['check_for_updates'] = self.checkbox_get_updates.isChecked() self.prefs['epub_version'] = self.epubType.checkedButton().text()[-1] + '.0' self.prefs['debug'] = self.checkbox_debug.isChecked() _DETAILS['vers'] = self.epubType.checkedButton().text()[-1] + '.0' self.prefs['useSmap'] = self.checkbox_smap.isChecked() if self.checkbox_smap.isChecked(): if len(self.cust_smap_path.text()): self.prefs['useSmapPath'] = self.cust_smap_path.text() _DETAILS['smap'] = (self.checkbox_smap.isChecked(), self.cust_smap_path.text()) else: # Message box that no file is selected return self.prefs['useCss'] = self.checkbox_css.isChecked() if self.checkbox_css.isChecked(): if len(self.cust_css_path.text()): self.prefs['useCssPath'] = self.cust_css_path.text() _DETAILS['css'] = (self.checkbox_css.isChecked(), self.cust_css_path.text()) else: # Message box that no file is selected return if len(self.docx_path.text()): self.prefs['lastDocxPath'] = self.docx_path.text() _DETAILS['docx'] = self.docx_path.text() else: # Message box that no file is selected return def check_for_update(self): '''Use updatecheck.py to check for newer versions of the plugin''' chk = UpdateChecker(self.prefs['last_time_checked'], self.bk._w) update_available, online_version, time = chk.update_info() # update preferences with latest date/time/version self.prefs['last_time_checked'] = time if online_version is not None: self.prefs['last_online_version'] = online_version if update_available: return (True, online_version) return (False, online_version) def get_update(self): url = DOWNLOAD_PAGE if self.update: latest = '/tag/v{}'.format(self.newversion) url = url + latest webbrowser.open_new_tab(url) @pyqtSlot() def _ok_clicked(self): self._ok_to_close = True self.cmdDo() self.bk.savePrefs(self.prefs) QCoreApplication.instance().quit() @pyqtSlot() def _cancel_clicked(self): self._ok_to_close = True '''Close aborting any changes''' self.prefs['qt_geometry'] = binascii.b2a_base64(self.saveGeometry()).decode('ascii') self.prefs['check_for_updates'] = self.checkbox_get_updates.isChecked() self.prefs['debug'] = self.checkbox_debug.isChecked() self.bk.savePrefs(self.prefs) QCoreApplication.instance().quit() def closeEvent(self, event): if self._ok_to_close: event.accept() # let the window close else: self._cancel_clicked()
class FileDialogWizardDialog(QDialog, Ui_FileDialogWizardDialog): """ Class implementing the color dialog wizard dialog. It displays a dialog for entering the parameters for the QFileDialog code generator. """ def __init__(self, pyqtVariant, parent=None): """ Constructor @param pyqtVariant variant of PyQt (integer; 0, 4 or 5) @param parent parent widget (QWidget) """ super(FileDialogWizardDialog, self).__init__(parent) self.setupUi(self) self.eStartWithCompleter = E5FileCompleter(self.eStartWith) self.eWorkDirCompleter = E5DirCompleter(self.eWorkDir) self.__pyqtVariant = pyqtVariant self.__typeButtonsGroup = QButtonGroup(self) self.__typeButtonsGroup.setExclusive(True) self.__typeButtonsGroup.addButton(self.rOpenFile, 1) self.__typeButtonsGroup.addButton(self.rOpenFiles, 2) self.__typeButtonsGroup.addButton(self.rSaveFile, 3) self.__typeButtonsGroup.addButton(self.rfOpenFile, 11) self.__typeButtonsGroup.addButton(self.rfOpenFiles, 12) self.__typeButtonsGroup.addButton(self.rfSaveFile, 13) self.__typeButtonsGroup.addButton(self.rDirectory, 20) self.__typeButtonsGroup.buttonClicked[int].connect( self.__toggleInitialFilterAndResult) self.__toggleInitialFilterAndResult(1) self.pyqtComboBox.addItems(["PyQt4", "PyQt5"]) if self.__pyqtVariant == 5: self.pyqtComboBox.setCurrentIndex(1) else: self.pyqtComboBox.setCurrentIndex(0) self.rSaveFile.toggled[bool].connect(self.__toggleConfirmCheckBox) self.rfSaveFile.toggled[bool].connect(self.__toggleConfirmCheckBox) self.rDirectory.toggled[bool].connect(self.__toggleGroupsAndTest) self.cStartWith.toggled[bool].connect(self.__toggleGroupsAndTest) self.cWorkDir.toggled[bool].connect(self.__toggleGroupsAndTest) self.cFilters.toggled[bool].connect(self.__toggleGroupsAndTest) self.bTest = self.buttonBox.addButton(self.tr("Test"), QDialogButtonBox.ActionRole) msh = self.minimumSizeHint() self.resize(max(self.width(), msh.width()), msh.height()) def __adjustOptions(self, options): """ Private method to adjust the file dialog options. @param options file dialog options (QFileDialog.Options) @return modified options (QFileDialog.Options) """ if Globals.isLinuxPlatform(): options |= QFileDialog.DontUseNativeDialog return options @pyqtSlot(str) def on_pyqtComboBox_currentIndexChanged(self, txt): """ Private slot to setup the dialog for the selected PyQt variant. @param txt text of the selected combo box entry (string) """ self.rfOpenFile.setEnabled(txt == "PyQt5") self.rfOpenFiles.setEnabled(txt == "PyQt5") self.rfSaveFile.setEnabled(txt == "PyQt5") if txt == "PyQt5": if self.rfOpenFile.isChecked(): self.rOpenFile.setChecked(True) elif self.rfOpenFiles.isChecked(): self.rOpenFiles.setChecked(True) elif self.rfSaveFile.isChecked(): self.rSaveFile.setChecked(True) self.__pyqtVariant = 5 if txt == "PyQt5" else 4 self.__toggleInitialFilterAndResult( self.__typeButtonsGroup.checkedId()) def on_buttonBox_clicked(self, button): """ Private slot called by a button of the button box clicked. @param button button that was clicked (QAbstractButton) """ if button == self.bTest: self.on_bTest_clicked() @pyqtSlot() def on_bTest_clicked(self): """ Private method to test the selected options. """ if self.rOpenFile.isChecked() or self.rfOpenFile.isChecked(): if not self.cSymlinks.isChecked(): options = QFileDialog.Options(QFileDialog.DontResolveSymlinks) else: options = QFileDialog.Options() options = self.__adjustOptions(options) if self.rOpenFile.isChecked() and self.__pyqtVariant == 4: QFileDialog.getOpenFileName(None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), options) else: QFileDialog.getOpenFileNameAndFilter( None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), self.eInitialFilter.text(), options) elif self.rOpenFiles.isChecked() or self.rfOpenFiles.isChecked(): if not self.cSymlinks.isChecked(): options = QFileDialog.Options(QFileDialog.DontResolveSymlinks) else: options = QFileDialog.Options() options = self.__adjustOptions(options) if self.rOpenFiles.isChecked() and self.__pyqtVariant == 4: QFileDialog.getOpenFileNames(None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), options) else: QFileDialog.getOpenFileNamesAndFilter( None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), self.eInitialFilter.text(), options) elif self.rSaveFile.isChecked() or self.rfSaveFile.isChecked(): if not self.cSymlinks.isChecked(): options = QFileDialog.Options(QFileDialog.DontResolveSymlinks) else: options = QFileDialog.Options() options = self.__adjustOptions(options) if self.rSaveFile.isChecked() and self.__pyqtVariant == 4: QFileDialog.getSaveFileName(None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), options) else: QFileDialog.getSaveFileNameAndFilter( None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), self.eInitialFilter.text(), options) elif self.rDirectory.isChecked(): options = QFileDialog.Options() if not self.cSymlinks.isChecked(): options |= QFileDialog.Options(QFileDialog.DontResolveSymlinks) if self.cDirOnly.isChecked(): options |= QFileDialog.Options(QFileDialog.ShowDirsOnly) else: options |= QFileDialog.Options(QFileDialog.Option(0)) options = self.__adjustOptions(options) QFileDialog.getExistingDirectory(None, self.eCaption.text(), self.eWorkDir.text(), options) def __toggleConfirmCheckBox(self): """ Private slot to enable/disable the confirmation check box. """ self.cConfirmOverwrite.setEnabled(self.rSaveFile.isChecked() or self.rfSaveFile.isChecked()) def __toggleGroupsAndTest(self): """ Private slot to enable/disable certain groups and the test button. """ if self.rDirectory.isChecked(): self.filePropertiesGroup.setEnabled(False) self.dirPropertiesGroup.setEnabled(True) self.bTest.setDisabled(self.cWorkDir.isChecked()) else: self.filePropertiesGroup.setEnabled(True) self.dirPropertiesGroup.setEnabled(False) self.bTest.setDisabled(self.cStartWith.isChecked() or self.cFilters.isChecked()) def __toggleInitialFilterAndResult(self, id): """ Private slot to enable/disable the initial filter elements and the results entries. @param id id of the clicked button (integer) """ if (self.__pyqtVariant == 4 and id in [11, 12, 13]) or \ (self.__pyqtVariant == 5 and id in [1, 2, 3]): enable = True else: enable = False self.lInitialFilter.setEnabled(enable) self.eInitialFilter.setEnabled(enable) self.cInitialFilter.setEnabled(enable) self.lFilterVariable.setEnabled(enable) self.eFilterVariable.setEnabled(enable) def getCode(self, indLevel, indString): """ Public method to get the source code for Qt4 and Qt5. @param indLevel indentation level (int) @param indString string used for indentation (space or tab) (string) @return generated code (string) """ # calculate our indentation level and the indentation string il = indLevel + 1 istring = il * indString estring = os.linesep + indLevel * indString # now generate the code if self.parentSelf.isChecked(): parent = "self" elif self.parentNone.isChecked(): parent = "None" elif self.parentOther.isChecked(): parent = self.parentEdit.text() if parent == "": parent = "None" # prepare the result variables nameVariable = self.eNameVariable.text() if not nameVariable: if self.__typeButtonsGroup.checkedButton() in [ self.rOpenFile, self.rfOpenFile, self.rSaveFile, self.rfSaveFile ]: nameVariable = "fileName" elif self.__typeButtonsGroup.checkedButton() in [ self.rOpenFiles, self.rfOpenFiles ]: nameVariable = "fileNames" elif self.__typeButtonsGroup.checkedButton() == self.rDirectory: nameVariable = "dirName" else: nameVariable = "res" filterVariable = self.eFilterVariable.text() if not filterVariable: if (self.__pyqtVariant == 4 and self.__typeButtonsGroup.checkedButton() in [ self.rfOpenFile, self.rfOpenFiles, self.rfSaveFile]) or \ (self.__pyqtVariant == 5 and self.__typeButtonsGroup.checkedButton() in [ self.rOpenFile, self.rOpenFiles, self.rSaveFile]): filterVariable = ", selectedFilter" else: filterVariable = "" code = '{0}{1} = QFileDialog.'.format(nameVariable, filterVariable) if self.rOpenFile.isChecked() or self.rfOpenFile.isChecked(): if self.rOpenFile.isChecked(): code += 'getOpenFileName({0}{1}'.format(os.linesep, istring) else: code += 'getOpenFileNameAndFilter({0}{1}'.format( os.linesep, istring) code += '{0},{1}{2}'.format(parent, os.linesep, istring) if not self.eCaption.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: code += 'self.tr("{0}"),{1}{2}'.format(self.eCaption.text(), os.linesep, istring) if not self.eStartWith.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: if self.cStartWith.isChecked(): fmt = '{0},{1}{2}' else: fmt = 'self.tr("{0}"),{1}{2}' code += fmt.format(self.eStartWith.text(), os.linesep, istring) if self.eFilters.text() == "": code += '""' else: if self.cFilters.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' code += fmt.format(self.eFilters.text()) if self.rfOpenFile.isChecked() or self.__pyqtVariant == 5: if self.eInitialFilter.text() == "": filter = "None" else: if self.cInitialFilter.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' filter = fmt.format(self.eInitialFilter.text()) code += ',{0}{1}{2}'.format(os.linesep, istring, filter) if not self.cSymlinks.isChecked(): code += \ ',{0}{1}QFileDialog.Options(' \ 'QFileDialog.DontResolveSymlinks)' \ .format(os.linesep, istring) code += '){0}'.format(estring) elif self.rOpenFiles.isChecked() or self.rfOpenFiles.isChecked(): if self.rOpenFiles.isChecked(): code += 'getOpenFileNames({0}{1}'.format(os.linesep, istring) else: code += 'getOpenFileNamesAndFilter({0}{1}'.format( os.linesep, istring) code += '{0},{1}{2}'.format(parent, os.linesep, istring) if not self.eCaption.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: code += 'self.tr("{0}"),{1}{2}'.format(self.eCaption.text(), os.linesep, istring) if not self.eStartWith.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: if self.cStartWith.isChecked(): fmt = '{0},{1}{2}' else: fmt = 'self.tr("{0}"),{1}{2}' code += fmt.format(self.eStartWith.text(), os.linesep, istring) if not self.eFilters.text(): code += '""' else: if self.cFilters.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' code += fmt.format(self.eFilters.text()) if self.rfOpenFiles.isChecked() or self.__pyqtVariant == 5: if self.eInitialFilter.text() == "": filter = "None" else: if self.cInitialFilter.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' filter = fmt.format(self.eInitialFilter.text()) code += ',{0}{1}{2}'.format(os.linesep, istring, filter) if not self.cSymlinks.isChecked(): code += \ ',{0}{1}QFileDialog.Options(' \ 'QFileDialog.DontResolveSymlinks)' \ .format(os.linesep, istring) code += '){0}'.format(estring) elif self.rSaveFile.isChecked() or self.rfSaveFile.isChecked(): if self.rSaveFile.isChecked(): code += 'getSaveFileName({0}{1}'.format(os.linesep, istring) else: code += 'getSaveFileNameAndFilter({0}{1}'.format( os.linesep, istring) code += '{0},{1}{2}'.format(parent, os.linesep, istring) if not self.eCaption.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: code += 'self.tr("{0}"),{1}{2}'.format(self.eCaption.text(), os.linesep, istring) if not self.eStartWith.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: if self.cStartWith.isChecked(): fmt = '{0},{1}{2}' else: fmt = 'self.tr("{0}"),{1}{2}' code += fmt.format(self.eStartWith.text(), os.linesep, istring) if not self.eFilters.text(): code += '""' else: if self.cFilters.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' code += fmt.format(self.eFilters.text()) if self.rfSaveFile.isChecked() or self.__pyqtVariant == 5: if self.eInitialFilter.text() == "": filter = "None" else: if self.cInitialFilter.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' filter = fmt.format(self.eInitialFilter.text()) code += ',{0}{1}{2}'.format(os.linesep, istring, filter) if (not self.cSymlinks.isChecked()) or \ (not self.cConfirmOverwrite.isChecked()): code += ',{0}{1}QFileDialog.Options('.format( os.linesep, istring) if not self.cSymlinks.isChecked(): code += 'QFileDialog.DontResolveSymlinks' if (not self.cSymlinks.isChecked()) and \ (not self.cConfirmOverwrite.isChecked()): code += ' | ' if not self.cConfirmOverwrite.isChecked(): code += 'QFileDialog.DontConfirmOverwrite' code += ')' code += '){0}'.format(estring) elif self.rDirectory.isChecked(): code += 'getExistingDirectory({0}{1}'.format(os.linesep, istring) code += '{0},{1}{2}'.format(parent, os.linesep, istring) if not self.eCaption.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: code += 'self.tr("{0}"),{1}{2}'.format(self.eCaption.text(), os.linesep, istring) if not self.eWorkDir.text(): code += '""' else: if self.cWorkDir.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' code += fmt.format(self.eWorkDir.text()) code += ',{0}{1}QFileDialog.Options('.format(os.linesep, istring) if not self.cSymlinks.isChecked(): code += 'QFileDialog.DontResolveSymlinks | ' if self.cDirOnly.isChecked(): code += 'QFileDialog.ShowDirsOnly' else: code += 'QFileDialog.Option(0)' code += ')){0}'.format(estring) return code
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(717, 541) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget) self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 0, 701, 491)) self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setSizeConstraint( QtWidgets.QLayout.SetNoConstraint) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.excerciseTitle = QtWidgets.QLabel(self.verticalLayoutWidget) self.excerciseTitle.setMinimumSize(QtCore.QSize(0, 50)) self.excerciseTitle.setMaximumSize(QtCore.QSize(16777215, 50)) font = QtGui.QFont() font.setPointSize(20) self.excerciseTitle.setFont(font) self.excerciseTitle.setAlignment(QtCore.Qt.AlignCenter) self.excerciseTitle.setObjectName("excerciseTitle") self.verticalLayout.addWidget(self.excerciseTitle) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setSizeConstraint( QtWidgets.QLayout.SetMinimumSize) self.verticalLayout_2.setObjectName("verticalLayout_2") self.testFilesListWidget = QtWidgets.QListWidget( self.verticalLayoutWidget) self.testFilesListWidget.setMaximumSize(QtCore.QSize(150, 16777215)) self.testFilesListWidget.setObjectName("testFilesListWidget") files = listdir("./") mytxt = list(filter(lambda x: x.endswith('.txt'), files)) for i in mytxt: item = QtWidgets.QListWidgetItem(i) self.testFilesListWidget.addItem(item) self.verticalLayout_2.addWidget(self.testFilesListWidget) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.selectButton = QtWidgets.QPushButton(self.verticalLayoutWidget) self.selectButton.setMaximumSize(QtCore.QSize(80, 16777215)) self.selectButton.setObjectName("selectButton") self.selectButton.clicked.connect(self.selectExercise) self.horizontalLayout_3.addWidget(self.selectButton) self.exitButton = QtWidgets.QPushButton(self.verticalLayoutWidget) self.exitButton.setMaximumSize(QtCore.QSize(70, 16777215)) self.exitButton.setObjectName("exitButton") self.exitButton.clicked.connect(QCoreApplication.instance().quit) self.horizontalLayout_3.addWidget(self.exitButton) self.verticalLayout_2.addLayout(self.horizontalLayout_3) self.horizontalLayout_2.addLayout(self.verticalLayout_2) self.groupBox = QtWidgets.QGroupBox(self.verticalLayoutWidget) self.groupBox.setMinimumSize(QtCore.QSize(500, 0)) self.groupBox.setTitle("") self.groupBox.setObjectName("groupBox") self.verticalLayoutWidget_3 = QtWidgets.QWidget(self.groupBox) self.verticalLayoutWidget_3.setGeometry(QtCore.QRect(10, 10, 481, 411)) self.verticalLayoutWidget_3.setObjectName("verticalLayoutWidget_3") self.verticalLayout_4 = QtWidgets.QVBoxLayout( self.verticalLayoutWidget_3) self.verticalLayout_4.setContentsMargins(0, 0, 0, 0) self.verticalLayout_4.setSpacing(8) self.verticalLayout_4.setObjectName("verticalLayout_4") self.excerciseQuestionLabel = QtWidgets.QLabel( self.verticalLayoutWidget_3) font = QtGui.QFont() font.setPointSize(18) self.excerciseQuestionLabel.setFont(font) self.excerciseQuestionLabel.setAlignment(QtCore.Qt.AlignCenter) self.excerciseQuestionLabel.setObjectName("excerciseQuestionLabel") self.verticalLayout_4.addWidget(self.excerciseQuestionLabel) self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.answerButtonOne = QtWidgets.QPushButton( self.verticalLayoutWidget_3) self.answerButtonOne.setObjectName("answerButtonOne") self.horizontalLayout_4.addWidget(self.answerButtonOne) self.answerButtonTwo = QtWidgets.QPushButton( self.verticalLayoutWidget_3) self.answerButtonTwo.setObjectName("answerButtonTwo") self.horizontalLayout_4.addWidget(self.answerButtonTwo) self.answerButtonGroup = QButtonGroup() self.answerButtonGroup.addButton(self.answerButtonOne) self.answerButtonGroup.addButton(self.answerButtonTwo) self.answerButtonGroup.buttonClicked.connect(self.selectAnswer) self.verticalLayout_4.addLayout(self.horizontalLayout_4) self.horizontalLayout_2.addWidget(self.groupBox) self.verticalLayout.addLayout(self.horizontalLayout_2) self.verticalLayoutWidget.raise_() self.excerciseQuestionLabel.raise_() MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 717, 22)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.excerciseTitle.setText( _translate("MainWindow", "Безударные Гласные 1")) self.selectButton.setText(_translate("MainWindow", "Выбрать")) self.exitButton.setText(_translate("MainWindow", "Выход")) self.excerciseQuestionLabel.setText( _translate("MainWindow", "Зав_вать локоны")) self.answerButtonOne.setText(_translate("MainWindow", "И")) self.answerButtonTwo.setText(_translate("MainWindow", "Е")) def selectExercise(self): global name global exerciseLines global rightAnswer exerciseHeader = "" name = self.testFilesListWidget.selectedIndexes()[0].data() with open(name, 'r', encoding='utf-8') as exerciseFile: exerciseHeader = exerciseFile.readline() exerciseLines = exerciseFile.readlines() print(exerciseHeader) exercise = exerciseLines[0] exerciseQuestion = exercise.split(";")[0].strip() exerciseAnswerOne = exercise.split(";")[1].strip() exerciseAnswerTwo = exercise.split(";")[2].strip() rightAnswer = exercise.split(";")[3].strip() self.excerciseTitle.setText(exerciseHeader) self.excerciseQuestionLabel.setText(exerciseQuestion) self.answerButtonOne.setText(exerciseAnswerOne) self.answerButtonTwo.setText(exerciseAnswerTwo) def selectAnswer(self, answerButtonGroup): global lineNumber global rightAnswer global exerciseLines global rightAnswerCount global wrongAnswerCount button_clicked = self.answerButtonGroup.checkedButton() print("Right answer: " + rightAnswer, "Your answer: " + button_clicked.text()) if button_clicked.text() == rightAnswer: print("Right!") rightAnswerCount = rightAnswerCount + 1 else: print("Wrong(") wrongAnswerCount = wrongAnswerCount + 1 questionShuffle = [1, 2] exercise = exerciseLines[lineNumber] exerciseQuestion = exercise.split(";")[0].strip() x = random.choice(questionShuffle) exerciseAnswerOne = exercise.split(";")[x].strip() questionShuffle.remove(x) exerciseAnswerTwo = exercise.split(";")[random.choice( questionShuffle)].strip() rightAnswer = exercise.split(";")[3].strip() self.excerciseQuestionLabel.setText(exerciseQuestion) self.answerButtonOne.setText(exerciseAnswerOne) self.answerButtonTwo.setText(exerciseAnswerTwo) lineNumber = lineNumber + 1 print(lineNumber, len(exerciseLines)) if lineNumber == len(exerciseLines): print("Test") app.infoBox( "Результаты", "Правильных: {} \n Неправильных: {}".format( rightAnswerCount, wrongAnswerCount))
class TypeOfTask(Content): def __init__(self, parent=None, button_func=None, params=None): super().__init__(parent, 'Task', params) self.button_func = button_func path = os.path.abspath(os.path.dirname(__file__)) + '/static/' # Text for machine learning tasks path1 = path + 'task' text = self.get_text(path1) if self.params.lang == 'en': self.set_paragraph('Type of task', text=text, img=path1) else: self.set_paragraph('分析タスク', text=text, img=path1) # Text for supervised learning path2 = path + 'supervised_learning' text = self.get_text(path2) if self.params.lang == 'en': self.set_paragraph('Supervised learning', text=text, img=path2) else: self.set_paragraph('教師あり学習', text=text, img=path2) if params.lang == 'jp': self.set_paragraph( 'タスクの選択', text='あなたの機械学習のタスクを選択してください。') else: self.set_paragraph( 'Task selection', text='Choose your machine learning task.') vbox1 = QVBoxLayout() vbox1.setContentsMargins(10, 10, 10, 10) vbox1.setSpacing(10) rbtn_cls = QRadioButton('Classification', self.inner) rbtn_cls.setStyleSheet('QRadioButton{font: 15pt;};') rbtn_cls.clicked.connect(self.rbtn_clicked) rbtn_reg = QRadioButton('Regression', self.inner) rbtn_reg.setStyleSheet('QRadioButton{font: 15pt;};') rbtn_reg.clicked.connect(self.rbtn_clicked) if params.task == 'Classification': rbtn_cls.setChecked(True) elif params.task == 'Regression': rbtn_reg.setChecked(True) self.btn_group = QButtonGroup() self.btn_group.addButton(rbtn_cls, 1) self.btn_group.addButton(rbtn_reg, 1) vbox1.addWidget(rbtn_cls) vbox1.addWidget(rbtn_reg) vbox1.addStretch(1) self.vbox.addLayout(vbox1) self.vbox.addStretch(1) self.btn = QPushButton('Next', self.inner) self.btn.setStyleSheet('QPushButton{font: bold; font-size: 15pt; background-color: white;};') if self.params.lang == 'en': self.btn.clicked.connect(lambda: self.button_func('Input data')) else: self.btn.clicked.connect(lambda: self.button_func('入力データ')) if params.task is None: self.btn.setEnabled(False) self.vbox.addWidget(self.btn) def rbtn_clicked(self): self.params.task = self.btn_group.checkedButton().text() self.btn.setEnabled(True)
class MainWindow(QDialog): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.createCategorySelectionGroupBox() self.createTextEditLayout() self.createButtonLayout() mainLayout = QGridLayout() mainLayout.addLayout(self.categorySelectionLayout, 0, 0) mainLayout.addLayout(self.textEditLayout, 1, 0) mainLayout.addLayout(self.buttonLayout, 2, 0) self.setLayout(mainLayout) QApplication.setStyle(QStyleFactory.create("cleanlooks")) self.setWindowTitle("FK-tiedotin") self.setWindowIcon(QtGui.QIcon('templates/fi.png')) # Always-on-top mode. Currently does not work on Windows. #alwaysOnTopShortcut = QShortcut(QtGui.QKeySequence("Ctrl+O"), self) #alwaysOnTopShortcut.activated.connect(lambda: # super(MainWindow, self).__init__(parent, QtCore.Qt.WindowStaysOnTopHint)) def createCategorySelectionGroupBox(self): self.languageCheckBox = QCheckBox("Text in English", self) self.languageCheckBox.stateChanged.connect( self.languageCheckBoxClicked) self.toBothBulletinsCheckBox = QCheckBox("Add to both versions", self) categorySelectionGroupBox = QGroupBox("Category") self.categorySelectionButtonGroup = QButtonGroup() self.radioButton1 = QRadioButton("Killan tapahtumat") self.radioButton2 = QRadioButton("Muut tapahtumat") self.radioButton3 = QRadioButton("Yleistä") self.radioButton4 = QRadioButton("Opinnot") self.radioButton1.setChecked(True) self.categorySelectionButtonGroup.addButton(self.radioButton1) self.categorySelectionButtonGroup.addButton(self.radioButton2) self.categorySelectionButtonGroup.addButton(self.radioButton3) self.categorySelectionButtonGroup.addButton(self.radioButton4) buttonLayout = QVBoxLayout() buttonLayout.addWidget(self.radioButton1) buttonLayout.addWidget(self.radioButton2) buttonLayout.addWidget(self.radioButton3) buttonLayout.addWidget(self.radioButton4) categorySelectionGroupBox.setLayout(buttonLayout) self.dateEdit = QDateEdit() self.dateEdit.setDateTime(QDateTime.currentDateTime()) self.dateEdit.setCalendarPopup(True) dateLabel = QLabel("Date") dateLabel.setBuddy(self.dateEdit) self.categorySelectionLayout = QVBoxLayout() self.categorySelectionLayout.addWidget(self.languageCheckBox) self.categorySelectionLayout.addWidget(self.toBothBulletinsCheckBox) self.categorySelectionLayout.addWidget(categorySelectionGroupBox) self.categorySelectionLayout.addWidget(dateLabel) self.categorySelectionLayout.addWidget(self.dateEdit) def otherLanguageText(self, text): # convert to dictionary if (text == "Guild's events"): return "Killan tapahtumat" elif (text == "Killan tapahtumat"): return "Guild's events" elif (text == "Other events"): return "Muut tapahtumat" elif (text == "Muut tapahtumat"): return "Other events" elif (text == "General"): return "Yleistä" elif (text == "Yleistä"): return "General" elif (text == "Studies"): return "Opinnot" elif (text == "Opinnot"): return "Studies" else: raise Exception("Wrong value for otherLanguageText") """ categoriesDict_en = { "Guild's events":"Killan tapahtumat", "Other events":"Muut tapahtumat", "General":"Yleistä", "Studies":"Opinnot" } categoriesDict_fi = dict(reversed(item) for item in categoriesDict_en.items()) categoriesDict = dict(categoriesDict_en, categoriesDict_fi) try: return categoriesDict(text) except ValueError: raise Exception("Wrong value for otherLanguageText") """ def languageCheckBoxClicked(self, state): if state == QtCore.Qt.Checked: self.radioButton1.setText("Guild's events") self.radioButton2.setText("Other events") self.radioButton3.setText("General") self.radioButton4.setText("Studies") else: self.radioButton1.setText("Killan tapahtumat") self.radioButton2.setText("Muut tapahtumat") self.radioButton3.setText("Yleistä") self.radioButton4.setText("Opinnot") #def hide(self): # self.headerLineEdit.hide() # self.textBrowser = QTextBrowser() # self.textBrowser.setGeometry(QtCore.QRect(390, 10, 531, 681)) # self.textBrowser.setObjectName("textBrowser") # self.textBrowser.show() def createTextEditLayout(self): self.textEditLayout = QVBoxLayout() self.additionalWeeksEdit = QLineEdit() self.additionalWeeksEdit.setText("0") # default self.headerLineEdit = QLineEdit() self.imageUrl = QLineEdit() self.contentTextEdit = QTextEdit() addWeeksLabel = QLabel("Additional weeks") addWeeksLabel.setBuddy(self.additionalWeeksEdit) headerLabel = QLabel("Header") headerLabel.setBuddy(self.headerLineEdit) imageUrlLabel = QLabel("Image URL") imageUrlLabel.setBuddy(self.imageUrl) contentLabel = QLabel("Content") contentLabel.setBuddy(self.contentTextEdit) self.textEditLayout.addWidget(addWeeksLabel) self.textEditLayout.addWidget(self.additionalWeeksEdit) self.textEditLayout.addWidget(headerLabel) self.textEditLayout.addWidget(self.headerLineEdit) self.textEditLayout.addWidget(imageUrlLabel) self.textEditLayout.addWidget(self.imageUrl) self.textEditLayout.addWidget(contentLabel) self.textEditLayout.addWidget(self.contentTextEdit) def createButtonLayout(self): self.buttonLayout = QHBoxLayout() savePushButton = QPushButton("Save") savePushButton.clicked.connect(self.save) clearPushButton = QPushButton("Clear") clearPushButton.clicked.connect(self.clear) self.buttonLayout.addWidget(clearPushButton) self.buttonLayout.addStretch(1) self.buttonLayout.addWidget(savePushButton) def save(self): category = self.categorySelectionButtonGroup.checkedButton().text() date = [ self.dateEdit.date().day(), self.dateEdit.date().month(), self.dateEdit.date().year() ] weeks = int(self.additionalWeeksEdit.text()) header = self.headerLineEdit.text().strip() image = self.imageUrl.text() content = self.contentTextEdit.toPlainText() save_entry( { 'category': category, 'date': date, 'header': header, 'image': image, 'content': content }, self.languageCheckBox.isChecked(), weeks) if self.toBothBulletinsCheckBox.isChecked(): save_entry( { 'category': self.otherLanguageText( category), # both languages fix here 'date': date, 'header': header, 'image': image, 'content': content }, not self.languageCheckBox.isChecked(), weeks) self.clear() def clear(self): self.headerLineEdit.clear() self.imageUrl.clear() self.contentTextEdit.clear() self.languageCheckBox.setCheckState(0) self.toBothBulletinsCheckBox.setCheckState(0) self.dateEdit.setDateTime(QDateTime.currentDateTime())
class ciphering_app(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): QToolTip.setFont(QFont('SansSerif', 10)) encipher_btn = QPushButton('Encipher', self) encipher_btn.setToolTip('Enciphers the message.') decipher_btn = QPushButton('Decipher', self) decipher_btn.setToolTip('Deciphers the message.') encipher_btn.clicked.connect(self.encipher) decipher_btn.clicked.connect(self.decipher) hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(encipher_btn) hbox.addWidget(decipher_btn) vbox = QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox) self.setLayout(vbox) ceasar = QRadioButton('Ceasar Cipher', self) ceasar.move(20, 100) self.combo_box = QComboBox(self) self.combo_box.addItem('Key') for i in range(1, 26): self.combo_box.addItem(str(i)) self.combo_box.resize(45, 20) self.combo_box.move(40, 125) ceasar.setChecked(True) vigenere = QRadioButton('Vigenere Cipher', self) vigenere.move(130, 100) self.vigenere_key = QLineEdit(self) self.vigenere_key.resize(100, 20) self.vigenere_key.move(150, 125) self.vigenere_key.setPlaceholderText('Key') playfair = QRadioButton('Playfair Cipher', self) playfair.move(290, 100) self.playfair_key = QLineEdit(self) self.playfair_key.resize(100, 20) self.playfair_key.move(310, 125) self.playfair_key.setPlaceholderText('Key') railfence = QRadioButton('Railfence Cipher', self) railfence.move(450, 100) self.railfence_rows = QLineEdit(self) self.railfence_rows.setValidator(QIntValidator()) self.railfence_rows.resize(100, 20) self.railfence_rows.move(470, 125) self.railfence_rows.setPlaceholderText('Rows') self.radio_group = QButtonGroup() self.radio_group.addButton(ceasar) self.radio_group.addButton(vigenere) self.radio_group.addButton(playfair) self.radio_group.addButton(railfence) self.message_edit = QTextEdit(self) self.message_edit.setPlaceholderText('Message here') self.message_edit.zoomIn(3) self.message_edit.resize(580, 80) self.message_edit.move(10, 10) self.log = QTextEdit(self) self.log.setToolTip('Ctrl + scroll to zoom in and out') self.log.setFontFamily('Consolas') self.log.setPlainText('Console') self.log.setStyleSheet( 'background-color: rgb(12, 12, 12); color: rgb(204, 204, 204);') self.log.zoomIn(3) self.log.setReadOnly(True) self.log.resize(580, 400) self.log.move(10, 160) self.setGeometry(600, 600, 600, 600) self.setFixedSize(self.size()) self.setWindowTitle(app_name) self.setWindowIcon(QIcon(icon)) self.center() self.show() def center(self): fg = self.frameGeometry() ce = QDesktopWidget().availableGeometry().center() fg.moveCenter(ce) self.move(fg.topLeft()) def ceasar_function(self, m, msg): new_msg = '' key = self.combo_box.currentIndex() if key == 0: QMessageBox.about(self, 'Error', 'No key chosen.') return if m == 0: method = 'Encipher' else: method = 'Decipher' c_log = 'Method: Ceasar Cipher - ' + method + '\nKey: ' + str( key) + '\n\n' for i in msg: num_value = ord(i) if num_value == 32: new_msg += ' ' c_log += '\n' continue if m == 0: num_value += key elif m == 1: num_value -= key if i.istitle(): if num_value < 65: num_value += 26 if num_value > 90: num_value -= 26 else: if num_value < 97: num_value += 26 if num_value > 122: num_value -= 26 new_msg += chr(num_value) c_log += str(i) + ' => ' + chr(num_value) + '\n' self.log.setPlainText(c_log) self.message_edit.setPlainText(new_msg) def vigenere_function(self, m, msg): new_msg = '' key = self.vigenere_key.text().replace(' ', '').lower() if len(key) == 0: QMessageBox.about(self, 'Oops', 'It seems you forgot to set the key!') return if not all(i.isalpha() or i.isspace() for i in key): QMessageBox.about( self, 'Oops', 'Vigenere Cipher key cannot contain special characters or numbers!' ) return if m == 0: method = 'Encipher' else: method = 'Decipher' c_log = 'Method: Vigenere Cipher - ' + method + '\nKey: ' + key + '\n\n' # ik_subtract is for shifting index when white space is found on message ik_subtract = 0 for i in range(0, len(msg)): if msg[i] == ' ': new_msg += ' ' ik_subtract += 1 c_log += '\n' continue if i >= len(key): ik = (i % len(key)) - ik_subtract else: ik = i - ik_subtract num_value_key = ord(key[ik]) - 96 num_value_char = ord(msg[i]) if m == 0: new_value = num_value_char + num_value_key elif m == 1: new_value = num_value_char - num_value_key if msg[i].istitle(): if new_value < 65: new_value += 26 if new_value > 90: new_value -= 26 else: if new_value < 97: new_value += 26 if new_value > 122: new_value -= 26 new_msg += chr(new_value) c_log += msg[i] + ' + key:' + key[ik] + ' => ' + chr( new_value) + '\n' self.log.setPlainText(c_log) self.message_edit.setPlainText(new_msg) def playfair_function(self, m, msg): new_msg = '' key = self.playfair_key.text().replace(' ', '').lower() if len(key) == 0: QMessageBox.about(self, 'Oops', 'It seems you forgot to set the key!') return if not all(i.isalpha() or i.isspace() for i in key): QMessageBox.about( self, 'Oops', 'Playfair Cipher key cannot contain special characters or numbers!' ) return if m == 0: method = 'Encipher' else: method = 'Decipher' c_log = 'Method: Playfair Cipher - ' + method + '\nKey: ' + key + '\n' c_log += '<!> Spaces will be removed when using Playfair Cipher\n\n' key = list(dict.fromkeys(key)) if 'j' in key and 'i' not in key: c_log += '<!> "j" found in key, please note that "i" is also "j" in the table.\n\n' remove_i = True elif 'j' in key and 'i' in key: key.remove('j') c_log += '<!> "j" found in key, please note that "i" is also "j" in the table.\n\n' remove_i = False else: remove_i = False for char in string.ascii_lowercase: if remove_i: if char == 'i': continue else: if char == 'j': continue if char not in key: key.append(char) grid = [[x for x in key[5 * y:(5 * y) + 5]] for y in range(5)] for i in grid: for x in i: c_log += x + ' ' c_log += '\n' no_space_msg = msg.replace(' ', '') split_msg = [ no_space_msg[i:i + 2] for i in range(0, len(no_space_msg), 2) ] if len(split_msg[-1]) == 1: split_msg[-1] += 'x' c_log += '\n' # index_1, index_2 = None, None # grid_index_1, grid_index_2 = None, None for i in split_msg: letter_1 = i[0] letter_2 = i[1] in_li = False for li in grid: if remove_i: if letter_1 == 'i': letter_1 = 'j' if letter_2 == 'i': letter_2 = 'j' else: if letter_1 == 'j': letter_1 = 'i' if letter_2 == 'j': letter_2 = 'i' if letter_1 in li and letter_2 in li and not letter_1 == letter_2: if m == 0: index_1 = li.index(letter_1) + 1 index_2 = li.index(letter_2) + 1 if index_1 > 4: index_1 = 0 if index_2 > 4: index_2 = 0 else: index_1 = li.index(letter_1) - 1 index_2 = li.index(letter_2) - 1 if index_1 < 0: index_1 = 4 if index_2 < 0: index_2 = 4 letter_1 = li[index_1] letter_2 = li[index_2] new_msg += letter_1 + letter_2 in_li = True continue else: if letter_1 in li: index_1 = li.index(letter_1) grid_index_1 = grid.index(li) if letter_2 in li: index_2 = li.index(letter_2) grid_index_2 = grid.index(li) # Unknown bug occurs sometimes... try: if index_1 == index_2: if m == 0: grid_index_1 += 1 grid_index_2 += 1 if grid_index_1 > 4: grid_index_1 = 0 if grid_index_2 > 4: grid_index_2 = 0 if grid_index_1 == grid_index_2: index_1 += 1 index_2 += 1 if index_1 > 4: index_1 = 0 if index_2 > 4: index_2 = 0 else: grid_index_1 -= 1 grid_index_2 -= 1 if grid_index_1 < 0: grid_index_1 = 4 if grid_index_2 < 0: grid_index_2 = 4 if grid_index_1 == grid_index_2: index_1 -= 1 index_2 -= 1 if index_1 < 0: index_1 = 4 if index_2 < 0: index_2 = 4 letter_1 = grid[grid_index_1][index_1] letter_2 = grid[grid_index_2][index_2] new_msg += letter_1 + letter_2 else: if not in_li: letter_1 = grid[grid_index_1][index_2] letter_2 = grid[grid_index_2][index_1] new_msg += letter_1 + letter_2 except: QMessageBox.about( self, 'Oh no', 'A bug just flew by, causing an error D: Please try again!' ) return c_log += i + ' => ' + letter_1 + letter_2 + '\n' self.log.setPlainText(c_log) self.message_edit.setPlainText(new_msg) def railfence_function(self, m, msg): new_msg = '' try: rows = int(self.railfence_rows.text()) if rows < 2: QMessageBox.about(self, 'Oops', 'Number of rows should be more than one!') return except: QMessageBox.about(self, 'Oops', 'It seems you forgot to set the key!') return if m == 0: method = 'Encipher' else: method = 'Decipher' c_log = 'Method: Railfence Cipher - ' + method + '\nRows: ' + str( rows) + '\n\n' grid = [[] for i in range(0, rows)] grid_index = 0 down = True for i in msg: if m == 0: grid[grid_index].append(i) c_log += (' ' * grid_index) + i + '\n' else: grid[grid_index].append(' ') if grid_index == rows - 1: down = False elif grid_index == 0: down = True if down: grid_index += 1 else: grid_index -= 1 if m == 0: for row in grid: for i in row: new_msg += i for i in range(rows): c_log += '\nRow ' + str(i + 1) + ': ' + re.sub( '\[|\]', '', str(grid[i])) else: index = 0 for row in grid: for i in range(0, len(row)): row[i] = msg[index] index += 1 for i in range(rows): c_log += '\nRow ' + str(i + 1) + ': ' + re.sub( '\[|\]', '', str(grid[i])) down = True row_ind, col_ind = 0, 0 for l in range(len(msg)): char = '*' col_ind = 0 for i in grid[row_ind]: if not i == '*': new_msg += i grid[row_ind][grid[row_ind].index(i)] = '*' break if row_ind == rows - 1: down = False elif row_ind == 0: down = True if down: row_ind += 1 else: row_ind -= 1 self.log.setPlainText(c_log) self.message_edit.setPlainText(new_msg) def encipher(self): msg = self.message_edit.toPlainText() if not self.valid_input(msg): return rbtn_name = self.radio_group.checkedButton().text() if rbtn_name == 'Ceasar Cipher': self.ceasar_function(0, msg) elif rbtn_name == 'Vigenere Cipher': self.vigenere_function(0, msg) elif rbtn_name == 'Playfair Cipher': self.playfair_function(0, msg) elif rbtn_name == 'Railfence Cipher': self.railfence_function(0, msg) def decipher(self): msg = self.message_edit.toPlainText() if not self.valid_input(msg): return rbtn_name = self.radio_group.checkedButton().text() if rbtn_name == 'Ceasar Cipher': self.ceasar_function(1, msg) elif rbtn_name == 'Vigenere Cipher': self.vigenere_function(1, msg) elif rbtn_name == 'Playfair Cipher': self.playfair_function(1, msg) elif rbtn_name == 'Railfence Cipher': self.railfence_function(1, msg) def valid_input(self, msg): if len(msg.strip()) == 0: QMessageBox.about(self, 'Oops', 'Empty message!') self.message_edit.setPlainText('') return False if self.radio_group.checkedButton().text() == "Railfence Cipher": return True if not all(i.isalpha() or i.isspace() for i in msg): QMessageBox.about( self, 'Oops', 'Message cannot contain special characters or numbers!') return False return True
class DyStockSelectIndexMaKChartStatsDlg(QDialog): def __init__(self, data, parent=None): super().__init__(parent) self._data = data self._initUi() def _initUi(self): self.setWindowTitle('指数均线K线图统计') # 控件 startDateLable = QLabel('开始日期') self._startDateLineEdit = QLineEdit(datetime.now().strftime("%Y-%m-%d")) endDateLable = QLabel('结束日期') self._endDateLineEdit = QLineEdit(datetime.now().strftime("%Y-%m-%d")) # 指数和股票代码 shIndexRadioButton = QRadioButton('上证指数'); shIndexRadioButton.setChecked(True) szIndexRadioButton = QRadioButton('深证成指') cybIndexRadioButton = QRadioButton('创业板指') zxbIndexRadioButton = QRadioButton('中小板指') hs300IndexRadioButton = QRadioButton('沪深300') zz500IndexRadioButton = QRadioButton('中证500') # 添加到QButtonGroup self._stocksButtonGroup = QButtonGroup() self._stocksButtonGroup.addButton(shIndexRadioButton, 1); self._stocksButtonGroup.addButton(szIndexRadioButton, 2) self._stocksButtonGroup.addButton(cybIndexRadioButton, 3) self._stocksButtonGroup.addButton(zxbIndexRadioButton, 4) self._stocksButtonGroup.addButton(hs300IndexRadioButton, 4) self._stocksButtonGroup.addButton(zz500IndexRadioButton, 4) cancelPushButton = QPushButton('Cancel') okPushButton = QPushButton('OK') cancelPushButton.clicked.connect(self._cancel) okPushButton.clicked.connect(self._ok) # 布局 grid = QGridLayout() grid.setSpacing(10) grid.addWidget(startDateLable, 0, 0) grid.addWidget(self._startDateLineEdit, 1, 0) grid.addWidget(endDateLable, 0, 1) grid.addWidget(self._endDateLineEdit, 1, 1) grid.addWidget(shIndexRadioButton, 2, 0) grid.addWidget(szIndexRadioButton, 2, 1) grid.addWidget(cybIndexRadioButton, 3, 0) grid.addWidget(zxbIndexRadioButton, 3, 1) grid.addWidget(hs300IndexRadioButton, 4, 0) grid.addWidget(zz500IndexRadioButton, 4, 1) grid.addWidget(okPushButton, 5, 1) grid.addWidget(cancelPushButton, 5, 0) self.setLayout(grid) def _getStockCode(self): checkedButton = self._stocksButtonGroup.checkedButton() text = checkedButton.text() return DyStockCommon.getIndexSectorByName(text) def _ok(self): self._data['startDate'] = self._startDateLineEdit.text() self._data['endDate'] = self._endDateLineEdit.text() self._data['index'] = self._getStockCode() self.accept() def _cancel(self): self.reject()
class DataCheck(Content): def __init__(self, parent=None, button_func=None, params=None): super().__init__(parent, 'Data check', params) self.button_func = button_func path = os.path.abspath(os.path.dirname(__file__)) + '/static/' # nr = min(5, data.shape[0]) nr = len(self.params.data5) if params.lang == 'jp': text = ('データの読み込み結果(先頭{n}行)を以下に示します.\n' 'データを正しく読み込めていることを確認してください.'.format(n=nr)) self.set_paragraph( 'データ読み込み結果の確認', text=text) else: text = ('First {n} rows of your data are shown below.\n' 'Confirm that the data was read correctly.'.format(n=nr)) self.set_paragraph( 'Check data', text=text) table = NonScrollTable(self.inner) table.setRowCount(nr) table.setColumnCount(len(self.params.columns)) table.setHorizontalHeaderLabels(self.params.columns) for r in range(nr): for c in range(len(self.params.columns)): item = QTableWidgetItem(str(self.params.data5.iat[r, c])) item.setFlags(Qt.ItemIsEnabled) table.setItem(r, c, item) table.setNonScroll() self.vbox.addWidget(table) # Text for type checking and objective variable setting path1 = path + 'categorical' text = self.get_text(path1) if self.params.lang == 'en': self.set_paragraph( 'Check type of variables and set objective variable', text=text) else: self.set_paragraph('変数タイプの確認と目的変数の設定', text=text) # htable = QTableWidget(self.inner) htable = NonScrollTable(self.inner) htable.setRowCount(len(self.params.columns)) htable.setColumnCount(4) htable.setHorizontalHeaderLabels( ['columns', 'categorical', 'numerical', 'target']) self.lst_cat = [] self.lst_num = [] self.lst_obj = [] self.obj_group = QButtonGroup(self.inner) for c in range(len(self.params.columns)): # col 1 item = QTableWidgetItem(self.params.columns[c]) item.setFlags(Qt.ItemIsEnabled) htable.setItem(c, 0, item) group = QButtonGroup(self.inner) # col 2 htable.setCellWidget( c, 1, self.__make_cell(c, 'cat', self.params.col_types[c], self.params.col_types_def[c])) group.addButton(self.lst_cat[-1]) # col 3 htable.setCellWidget( c, 2, self.__make_cell(c, 'num', self.params.col_types[c], self.params.col_types_def[c])) group.addButton(self.lst_num[-1]) # col 4 htable.setCellWidget( c, 3, self.__make_cell(c, 'obj', self.params.col_types[c], self.params.col_types_def[c])) self.obj_group.addButton(self.lst_obj[-1]) self.obj_group.setId(self.lst_obj[-1], c) htable.setNonScroll() self.vbox.addWidget(htable) if self.params.lang == 'jp': self.txt_cnf = ('<font color="red">目的変数を1つ選択し,' 'targetの列にチェックをいれてください。') if self.params.task.lower() == 'classification': self.txt_cnf += '<br>目的変数はカテゴリ変数である必要があります。</font>' else: self.txt_cnf += '<br>目的変数は量的変数である必要があります。</font>' else: self.txt_cnf = ('<font color="red">Select one variable as target variable,' 'then set the column of "target" of the variable checked.') if self.params.task.lower() == 'classification': self.txt_cnf += '<br>Target variable must be a categorical variable.</font>' else: self.txt_cnf += '<br>Target variable must be a numerical variable.</font>' self.lbl_cnf = QLabel(self.txt_cnf, self.inner) self.vbox.addWidget(self.lbl_cnf) self.vbox.addStretch(1) self.btn = QPushButton('Next', self.inner) self.btn.setStyleSheet('QPushButton{font: bold; font-size: 15pt; background-color: white;};') if self.params.lang == 'en': self.btn.clicked.connect(lambda: self.button_func('Overfitting')) else: self.btn.clicked.connect(lambda: self.button_func('過学習')) if self.obj_group.checkedButton() is None: self.btn.setEnabled(False) else: self.lbl_cnf.setText('<br>') self.btn.setEnabled(True) self.vbox.addWidget(self.btn) def __make_cell(self, c, name, col_type, col_type_def): cell = QWidget(self.inner) rbtn = QRadioButton('', cell) rbtn.toggled.connect(lambda: self.rbtn_clicked(name + '_' + str(c))) hbl = QHBoxLayout(cell) hbl.addWidget(rbtn) hbl.setContentsMargins(0, 0, 0, 0) hbl.setAlignment(Qt.AlignCenter) cell.setLayout(hbl) if name == 'cat': if col_type == 'object': rbtn.setChecked(True) self.lst_cat.append(rbtn) elif name == 'num': if col_type != 'object': rbtn.setChecked(True) if col_type_def == 'object': rbtn.setEnabled(False) self.lst_num.append(rbtn) elif name == 'obj': if col_type == 'object' and self.params.task == 'Regression': rbtn.setEnabled(False) elif col_type != 'object' and self.params.task == 'Classification': rbtn.setEnabled(False) if self.params.columns[c] == self.params.objective: rbtn.setChecked(True) self.lst_obj.append(rbtn) return cell def rbtn_clicked(self, text): name, idx = text.split('_') idx = int(idx) if len(self.lst_obj) <= idx: return if self.lst_num[idx].isChecked(): if self.params.task == 'Classification': self.obj_group.setExclusive(False) self.lst_obj[idx].setChecked(False) self.obj_group.setExclusive(True) self.lst_obj[idx].setEnabled(False) elif self.params.task == 'Regression': self.lst_obj[idx].setEnabled(True) self.params.col_types[idx] = self.params.col_types_def[idx] elif self.lst_cat[idx].isChecked(): if self.params.task == 'Classification': self.lst_obj[idx].setEnabled(True) elif self.params.task == 'Regression': self.obj_group.setExclusive(False) self.lst_obj[idx].setChecked(False) self.obj_group.setExclusive(True) self.lst_obj[idx].setEnabled(False) self.params.col_types[idx] = 'object' if self.obj_group.checkedButton() is None: self.params.objective = None self.lbl_cnf.setText(self.txt_cnf) self.btn.setEnabled(False) else: self.params.objective =\ self.params.columns[self.obj_group.checkedId()] self.lbl_cnf.setText('<br>') self.btn.setEnabled(True) self.params.col_types_changed = True
class Windows(QWidget): def __init__(self): super().__init__() self.urlEdit = QLineEdit() self.bodyEdit = QTextEdit() self.nameEdit = QLineEdit() self.secretEdit = QLineEdit() self.methodGroup = QButtonGroup() self.getButton = QRadioButton("GET") self.postButton = QRadioButton("POST") self.postButton.setChecked(True) self.methodGroup.addButton(self.getButton) self.methodGroup.addButton(self.postButton) self.responseEdit = QTextEdit() self.initUi() # Custom output stream. wallet_rpc.logger.handlers[1].stream = Stream( newText=self.onUpdateText) sys.stderr = Stream(newText=self.onUpdateText) def __del__(self): # Restore sys.stdout sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ def onUpdateText(self, text): """Write console output to text widget.""" cursor = self.responseEdit.textCursor() cursor.movePosition(QTextCursor.End) cursor.insertText(text) self.responseEdit.setTextCursor(cursor) self.responseEdit.ensureCursorVisible() def initUi(self): urlLabel = QLabel('Url') bodyLabel = QLabel('Body') nameLabel = QLabel('UserName') secretLabel = QLabel('Secret') methodLable = QLabel('Method') responseLabel = QLabel('Response') callButton = QPushButton("CALL") callButton.clicked.connect(self.buttonClick) grid = QGridLayout() grid.setSpacing(10) grid.addWidget(urlLabel, 1, 0) grid.addWidget(self.urlEdit, 1, 1) grid.addWidget(bodyLabel, 2, 0) grid.addWidget(self.bodyEdit, 2, 1) grid.addWidget(nameLabel, 3, 0) grid.addWidget(self.nameEdit, 3, 1) grid.addWidget(secretLabel, 4, 0) grid.addWidget(self.secretEdit, 4, 1) grid.addWidget(methodLable, 5, 0) box = QHBoxLayout() box.addWidget(self.getButton) box.addWidget(self.postButton) grid.addLayout(box, 5, 1) hBox = QHBoxLayout() hBox.addStretch(1) hBox.addWidget(callButton) grid.addLayout(hBox, 6, 1) grid.addWidget(responseLabel, 7, 0) grid.addWidget(self.responseEdit, 7, 1) self.setLayout(grid) self.setGeometry(500, 600, 1000, 800) self.center() self.setWindowTitle('Call Kong Service') self.show() def center(self): # 获得窗口 qr = self.frameGeometry() # 获得屏幕中心点 cp = QDesktopWidget().availableGeometry().center() # 显示到屏幕中心 qr.moveCenter(cp) self.move(qr.topLeft()) def buttonClick(self): wallet_rpc.call(self.urlEdit.text(), self.nameEdit.text(), self.secretEdit.text(), self.bodyEdit.toPlainText(), self.methodGroup.checkedButton().text())
class PreferencesWidget(QDialog): def __init__(self): super(PreferencesWidget, self).__init__() # 个性化 self.personalise_stack = QScrollArea() self.personalise_stack.setWidgetResizable(True) # 播放器 self.player_stack = QScrollArea() self.player_stack.setWidgetResizable(True) # 快捷键 self.hot_key_stack = QScrollArea() self.hot_key_stack.setWidgetResizable(True) self.h_line_1 = QFrame() self.h_line_1.setFrameShape(QFrame.HLine) self.h_line_1.setFrameShadow(QFrame.Sunken) self.h_line_2 = QFrame() self.h_line_2.setFrameShape(QFrame.HLine) self.h_line_2.setFrameShadow(QFrame.Sunken) self.h_line_3 = QFrame() self.h_line_3.setFrameShape(QFrame.HLine) self.h_line_3.setFrameShadow(QFrame.Sunken) self.h_line_4 = QFrame() self.h_line_4.setFrameShape(QFrame.HLine) self.h_line_4.setFrameShadow(QFrame.Sunken) self.language_label = QLabel("界面语言") self.language_btn_group = QButtonGroup() self.simplified_chinese_btn = PreferencesQRadioButton("简体中文") self.traditional_chinese_btn = PreferencesQRadioButton("繁体中文") self.english_btn = PreferencesQRadioButton("English") self.language_btn_group.addButton(self.simplified_chinese_btn) self.language_btn_group.addButton(self.traditional_chinese_btn) self.language_btn_group.addButton(self.english_btn) self.skin_label = QLabel("界面皮肤(!弃用 被界面主题代替)") self.skin_btn_group = QButtonGroup() self.dark_skin_btn = PreferencesQRadioButton("暗黑模式") self.dark_skin_btn.setDisabled(True) self.white_skin_btn = PreferencesQRadioButton("纯白模式") self.white_skin_btn.setDisabled(True) self.blue_skin_btn = PreferencesQRadioButton("浅蓝模式") self.blue_skin_btn.setDisabled(True) self.skin_btn_group.addButton(self.dark_skin_btn) self.skin_btn_group.addButton(self.white_skin_btn) self.skin_btn_group.addButton(self.blue_skin_btn) self.theme_label = QLabel("界面主题") self.current_theme_label = QLabel(f"当前主题:{get_value(transform_dict, get_theme())}") self.light_theme_label = QLabel("选择主题:") self.theme_combobox = QComboBox() self.theme_combobox.addItems(sorted(list(transform_dict.values()))) self.theme_combobox.setCurrentText(get_value(transform_dict, get_theme())) self.font_label = QLabel("界面字体") self.font_btn = QPushButton("点击设置") self.font_btn.clicked.connect(self.answer_font_btn_clicked) self.tool_bar_label = QLabel("工具栏") self.tool_bar_group = QButtonGroup() self.tool_bar_hide = PreferencesQRadioButton("默认隐藏") self.tool_bar_show = PreferencesQRadioButton("默认显示") self.tool_bar_group.addButton(self.tool_bar_hide) self.tool_bar_group.addButton(self.tool_bar_show) self.tool_bar_pos_group = QButtonGroup() self.tool_bar_pos_left = PreferencesQRadioButton("显示在左边") self.tool_bar_pos_right = PreferencesQRadioButton("显示在右边") self.tool_bar_pos_top = PreferencesQRadioButton("显示在上边") self.tool_bar_pos_bottom = PreferencesQRadioButton("显示在下边") self.tool_bar_pos_group.addButton(self.tool_bar_pos_left) self.tool_bar_pos_group.addButton(self.tool_bar_pos_right) self.tool_bar_pos_group.addButton(self.tool_bar_pos_top) self.tool_bar_pos_group.addButton(self.tool_bar_pos_bottom) self.personalise_stack_ui() self.player_stack_ui() self.hot_key_stack_ui() self._stack = QStackedWidget() self._stack.addWidget(self.personalise_stack) self._stack.addWidget(self.player_stack) self._stack.addWidget(self.hot_key_stack) self._btn_left_list = QListWidget() _personalise_item = QListWidgetItem('个性化') _personalise_item.setTextAlignment(Qt.AlignCenter) _personalise_item.setSizeHint(QSize(100, 50)) self._btn_left_list.insertItem(0, _personalise_item) _player_item = QListWidgetItem('播放器') _player_item.setTextAlignment(Qt.AlignCenter) _player_item.setSizeHint(QSize(100, 50)) self._btn_left_list.insertItem(1, _player_item) _hot_key_item = QListWidgetItem('快捷键') _hot_key_item.setTextAlignment(Qt.AlignCenter) _hot_key_item.setSizeHint(QSize(100, 50)) self._btn_left_list.insertItem(2, _hot_key_item) self._btn_left_list.setCurrentRow(0) self._btn_left_list.setMinimumWidth(102) self._btn_left_list.setMaximumWidth(120) self._btn_left_list.currentRowChanged.connect(self.widget_display) self.preferences_cancel_btn = QPushButton("取消") self.preferences_cancel_btn.clicked.connect(self.on_preferences_cancel_btn_clicked) self.preferences_ok_btn = QPushButton("应用") self.preferences_ok_btn.clicked.connect(self.on_preferences_ok_btn_clicked) cancel_ok_btn_layout = QHBoxLayout() cancel_ok_btn_layout.setContentsMargins(0, 5, 5, 5) cancel_ok_btn_layout.setSpacing(5) cancel_ok_btn_layout.addStretch() cancel_ok_btn_layout.addWidget(self.preferences_cancel_btn) cancel_ok_btn_layout.addWidget(self.preferences_ok_btn) self._main_layout = QVBoxLayout() self._main_layout.setContentsMargins(0, 0, 0, 0) self._main_layout.setSpacing(0) self._h_layout = QHBoxLayout() self._h_layout.setContentsMargins(0, 0, 0, 0) self._h_layout.setSpacing(0) self._h_layout.addWidget(self._btn_left_list) self._h_layout.addWidget(self._stack) self._main_layout.addLayout(self._h_layout) self._main_layout.addWidget(self.h_line_4) self._main_layout.addLayout(cancel_ok_btn_layout) self.setLayout(self._main_layout) self.setWindowTitle("偏好设置") self.setMinimumSize(550, 600) self.setWindowIcon(QIcon(PathHelper.get_img_path("*****@*****.**"))) self.setWindowFlags(Qt.WindowCloseButtonHint) self.update_all_stack_ui() def personalise_stack_ui(self): """ :return: """ language_btn_layout = QHBoxLayout() language_btn_layout.setContentsMargins(0, 5, 5, 5) language_btn_layout.setSpacing(5) language_btn_layout.addWidget(self.simplified_chinese_btn) language_btn_layout.addWidget(self.traditional_chinese_btn) language_btn_layout.addWidget(self.english_btn) skin_btn_layout = QHBoxLayout() skin_btn_layout.setContentsMargins(0, 5, 5, 5) skin_btn_layout.setSpacing(5) skin_btn_layout.addWidget(self.dark_skin_btn) skin_btn_layout.addWidget(self.white_skin_btn) skin_btn_layout.addWidget(self.blue_skin_btn) theme_btn_layout = QHBoxLayout() theme_btn_layout.setContentsMargins(0, 5, 5, 5) theme_btn_layout.setSpacing(5) theme_btn_layout.addWidget(self.current_theme_label) theme_btn_layout.addStretch() theme_btn_layout.addWidget(self.light_theme_label) theme_btn_layout.addWidget(self.theme_combobox) theme_btn_layout.addStretch() font_btn_layout = QHBoxLayout() font_btn_layout.setContentsMargins(0, 5, 5, 5) font_btn_layout.setSpacing(5) font_btn_layout.addWidget(self.font_btn) tool_bar_visibility_btn_layout = QHBoxLayout() tool_bar_visibility_btn_layout.setContentsMargins(0, 5, 5, 5) tool_bar_visibility_btn_layout.setSpacing(5) tool_bar_visibility_btn_layout.addWidget(self.tool_bar_hide) tool_bar_visibility_btn_layout.addWidget(self.tool_bar_show) tool_bar_pos_btn_layout = QHBoxLayout() tool_bar_pos_btn_layout.setContentsMargins(0, 5, 5, 5) tool_bar_pos_btn_layout.setSpacing(5) tool_bar_pos_btn_layout.addWidget(self.tool_bar_pos_left) tool_bar_pos_btn_layout.addWidget(self.tool_bar_pos_right) tool_bar_pos_btn_layout.addWidget(self.tool_bar_pos_top) tool_bar_pos_btn_layout.addWidget(self.tool_bar_pos_bottom) widget = QWidget() main_layout = QVBoxLayout(widget) main_layout.setContentsMargins(5, 5, 5, 5) main_layout.setSpacing(5) main_layout.addWidget(self.language_label) main_layout.addLayout(language_btn_layout) main_layout.addWidget(self.h_line_1) main_layout.addWidget(self.skin_label) main_layout.addLayout(skin_btn_layout) main_layout.addWidget(self.theme_label) main_layout.addLayout(theme_btn_layout) main_layout.addWidget(self.h_line_2) main_layout.addWidget(self.font_label) main_layout.addLayout(font_btn_layout) main_layout.addWidget(self.h_line_3) main_layout.addWidget(self.tool_bar_label) main_layout.addLayout(tool_bar_visibility_btn_layout) main_layout.addLayout(tool_bar_pos_btn_layout) self.personalise_stack.setWidget(widget) def player_stack_ui(self): """ :return: """ pass def hot_key_stack_ui(self): """ :return: """ pass def update_all_stack_ui(self): """ :return: """ _language = get_language() if _language == CommonEnum.LanguageZN: self.simplified_chinese_btn.setChecked(True) elif _language == CommonEnum.LanguageTN: self.traditional_chinese_btn.setChecked(True) elif _language == CommonEnum.LanguageEN: self.english_btn.setChecked(True) else: self.simplified_chinese_btn.setChecked(True) _skin = get_skin() if _skin == CommonEnum.SKinDark: self.dark_skin_btn.setChecked(True) elif _skin == CommonEnum.SkinWhite: self.white_skin_btn.setChecked(True) elif _skin == CommonEnum.SkinBlue: self.blue_skin_btn.setChecked(True) else: self.blue_skin_btn.setChecked(True) _tool_bar_visible = get_tool_bar_visible() if _tool_bar_visible: self.tool_bar_show.setChecked(True) else: self.tool_bar_hide.setChecked(True) _tool_bar_pos = get_tool_bar_pos() if _tool_bar_pos == CommonEnum.ToolBarPosLeft: self.tool_bar_pos_left.setChecked(True) elif _tool_bar_pos == CommonEnum.ToolBarPosRight: self.tool_bar_pos_right.setChecked(True) elif _tool_bar_pos == CommonEnum.ToolBarPosTop: self.tool_bar_pos_top.setChecked(True) elif _tool_bar_pos == CommonEnum.ToolBarPosBottom: self.tool_bar_pos_bottom.setChecked(True) else: self.tool_bar_pos_top.setChecked(True) def widget_display(self, i): """ 控制显示的页面 :param i: :return: """ self._stack.setCurrentIndex(i) def answer_font_btn_clicked(self, checked): """ :param checked: :return: """ set_font(self, False) def on_preferences_ok_btn_clicked(self): """ 点击应用按钮,更新设置(需要重启应用) :return: """ _box = PromptBox(1, "设置成功,重启软件后生效!\n确定立即重启吗?", 2) width, height = get_window_center_point(_box) _box.move(width, height) _flag = _box.exec_() _app_info = get_app_info() _app_type = _app_info["app_type"] # 确认重启且处于 release 状态,则自动重启 if _flag: _language_checkedButton = self.language_btn_group.checkedButton() if _language_checkedButton == self.simplified_chinese_btn: set_language(CommonEnum.LanguageZN, False) elif _language_checkedButton == self.traditional_chinese_btn: set_language(CommonEnum.LanguageTN, False) elif _language_checkedButton == self.english_btn: set_language(CommonEnum.LanguageEN, False) else: set_language(CommonEnum.LanguageZN, False) _skin_checkedButton = self.skin_btn_group.checkedButton() if _skin_checkedButton == self.dark_skin_btn: set_skin(CommonEnum.SKinDark, False) elif _skin_checkedButton == self.white_skin_btn: set_skin(CommonEnum.SkinWhite, False) elif _skin_checkedButton == self.blue_skin_btn: set_skin(CommonEnum.SkinBlue, False) else: set_skin(CommonEnum.SKinDark, False) _theme_checkedText = self.theme_combobox.currentText() set_theme(_theme_checkedText, False) _tool_bar_checkedButton = self.tool_bar_group.checkedButton() if _tool_bar_checkedButton == self.tool_bar_hide: set_tool_bar_visible(0) elif _tool_bar_checkedButton == self.tool_bar_show: set_tool_bar_visible(1) else: set_tool_bar_visible(1) _ool_bar_pos_checkedButton = self.tool_bar_pos_group.checkedButton() if _ool_bar_pos_checkedButton == self.tool_bar_pos_left: set_tool_bar_pos(CommonEnum.ToolBarPosLeft) elif _ool_bar_pos_checkedButton == self.tool_bar_pos_right: set_tool_bar_pos(CommonEnum.ToolBarPosRight) elif _ool_bar_pos_checkedButton == self.tool_bar_pos_top: set_tool_bar_pos(CommonEnum.ToolBarPosTop) elif _ool_bar_pos_checkedButton == self.tool_bar_pos_bottom: set_tool_bar_pos(CommonEnum.ToolBarPosBottom) else: set_tool_bar_pos(CommonEnum.ToolBarPosTop) if _app_type == CommonEnum.AppType.value[1]: restart_real_live() else: _box = PromptBox(0, "debug 状态请手动重启!", 1) width, height = get_window_center_point(_box) _box.move(width, height) _box.exec_() self.close() def on_preferences_cancel_btn_clicked(self): """ 点击取消按钮 :return: """ self.close()
class ChoiceOptionItem(StringOptionItem): """Class to store and control a radio button choice config option entry. Stores the name, value, category and description, provides validation, config file output and dialog controls. """ def __init__(self, optionDict, name, value, choices, category='', columnNum=0): """Set the parameters and initial value and add to optionDict. Raises a ValueError if initial validation fails. Arguments: optionDict -- a dictionary to add this option item to name -- the string key for the option value -- the string value choices -- a list of acceptable entries category -- a string for the option group this belongs to columnNum -- the column position for this control in the dialog """ self.choices = choices super().__init__(optionDict, name, value, False, False, category, '', columnNum) def setValue(self, value): """Sets the value and validates, returns True if OK. Returns False if validation fails but the old value is OK, or if the value is unchanged. Raises a ValueError if validation fails without an old value. Arguments: value -- the string value to set """ value = str(value) if value in self.choices and value != self.value: self.value = value return True if self.value == None: raise ValueError return False def addDialogControl(self, groupBox): """Add the labels and controls to a dialog box for this option item. Arguments: groupBox -- the current group box """ rowLayout.addWidget(groupBox) QGridLayout(groupBox) gridLayout = groupBox.layout() self.dialogControl = QButtonGroup(groupBox) row = 0 for choice in self.choices: button = QRadioButton(choice, groupBox) self.dialogControl.addButton(button) gridLayout.addWidget(button, row, 0, 1, 2) row += 1 def updateFromDialog(self): """Set the value of this item from the dialog contents. Return True if successfully set. """ return self.setValue(self.dialogControl.checkedButton().text())
class SettingsDialog(QDialog, Ui_Dialog): def __init__(self, parent): super().__init__(parent) self.setAttribute(Qt.WA_DeleteOnClose) self.setupUi(self) self.lineEdit_loginUsername.setText(app.settings.get("adapter-legacy", "username")) self.lineEdit_loginPassword.setText(app.settings.get("adapter-legacy", "password")) self.checkBox_autoLogin.setChecked(app.settings.getbool("legacy", "autologin")) self.checkBox_autoStartFrontend.setChecked(app.autoStart) if sys.platform == "linux": self.checkBox_autoStartFrontend.setEnabled(True) adapter = app.adapterManager[0] # Xwared Management managedBySystemd = adapter.daemonManagedBySystemd managedByUpstart = adapter.daemonManagedByUpstart managedByAutostart = adapter.daemonManagedByAutostart self.radio_managedBySystemd.setChecked(managedBySystemd) self.radio_managedByUpstart.setChecked(managedByUpstart) self.radio_managedByAutostart.setChecked(managedByAutostart) self.radio_managedByNothing.setChecked( not (managedBySystemd or managedByUpstart or managedByAutostart)) initType = getInitType() self.radio_managedBySystemd.setEnabled(initType == InitType.SYSTEMD) self.radio_managedByUpstart.setEnabled(initType == InitType.UPSTART) if not adapter.useXwared: self.group_etmStartWhen.setEnabled(False) self.group_initManaged.setEnabled(False) self.btngrp_etmStartWhen = QButtonGroup() self.btngrp_etmStartWhen.addButton(self.radio_backendStartWhen1, 1) self.btngrp_etmStartWhen.addButton(self.radio_backendStartWhen2, 2) self.btngrp_etmStartWhen.addButton(self.radio_backendStartWhen3, 3) if adapter.useXwared: startEtmWhen = adapter.startEtmWhen self.btngrp_etmStartWhen.button(startEtmWhen).setChecked(True) # frontend self.checkBox_enableDevelopersTools.setChecked( app.settings.getbool("legacy", "enabledeveloperstools")) self.checkBox_allowFlash.setChecked(app.settings.getbool("legacy", "allowflash")) self.checkBox_minimizeToSystray.setChecked( app.settings.getbool("frontend", "minimizetosystray")) self.checkBox_closeToMinimize.setChecked( app.settings.getbool("frontend", "closetominimize")) self.checkBox_popNotifications.setChecked( app.settings.getbool("frontend", "popnotifications")) self.checkBox_notifyBySound.setChecked( app.settings.getbool("frontend", "notifybysound")) self.checkBox_showMonitorWindow.setChecked( app.settings.getbool("frontend", "showmonitorwindow")) self.spinBox_monitorFullSpeed.setValue( app.settings.getint("frontend", "monitorfullspeed")) # clipboard related self.checkBox_watchClipboard.stateChanged.connect(self.slotWatchClipboardToggled) self.checkBox_watchClipboard.setChecked(app.settings.getbool("frontend", "watchclipboard")) self.slotWatchClipboardToggled(self.checkBox_watchClipboard.checkState()) self.plaintext_watchPattern.setPlainText(app.settings.get("frontend", "watchpattern")) self.btn_addMount.clicked.connect(self.slotAddMount) self.btn_removeMount.clicked.connect(self.slotRemoveMount) # Mounts self.setupMounts() # backend setting is a different thing! self.setupETM() @pyqtSlot(int) def slotWatchClipboardToggled(self, state): self.plaintext_watchPattern.setEnabled(state) @pyqtSlot() def setupMounts(self): adapter = app.adapterManager[0] if not adapter.useXwared: self.tab_mount.setEnabled(False) return self.table_mounts.setRowCount(0) self.table_mounts.clearContents() mountsMapping = app.adapterManager[0].mountsFaker.getMountsMapping() for i, mount in enumerate(app.adapterManager[0].mountsFaker.mounts): self.table_mounts.insertRow(i) # drive1: the drive letter it should map to, by alphabetical order drive1 = app.adapterManager[0].mountsFaker.driveIndexToLetter(i) self.table_mounts.setItem(i, 0, QTableWidgetItem(drive1 + "\\TDDOWNLOAD")) # mounts = ['/path/to/1', 'path/to/2', ...] self.table_mounts.setItem(i, 1, QTableWidgetItem(mount)) # drive2: the drive letter it actually is assigned to drive2 = mountsMapping.get(mount, "无") errors = [] # check: mapping if drive1 != drive2: errors.append( "错误:盘符映射在'{actual}',而不是'{should}'。\n" "如果这是个新挂载的文件夹,请尝试稍等,或重启后端,可能会修复此问题。" .format(actual = drive2, should = drive1)) brush = QBrush() if errors: brush.setColor(Qt.red) errString = "\n".join(errors) else: brush.setColor(Qt.darkGreen) errString = "正常" errWidget = QTableWidgetItem(errString) errWidget.setForeground(brush) self.table_mounts.setItem(i, 2, errWidget) del brush, errWidget self.table_mounts.resizeColumnsToContents() @pyqtSlot() def slotAddMount(self): fileDialog = QFileDialog(self, Qt.Dialog) fileDialog.setFileMode(QFileDialog.Directory) fileDialog.setOption(QFileDialog.ShowDirsOnly, True) fileDialog.setViewMode(QFileDialog.List) fileDialog.setDirectory(os.environ["HOME"]) if fileDialog.exec(): selected = fileDialog.selectedFiles()[0] if selected in self.newMounts: return row = self.table_mounts.rowCount() self.table_mounts.insertRow(row) self.table_mounts.setItem( row, 0, QTableWidgetItem(app.adapterManager[0].mountsFaker.driveIndexToLetter(row) + "\\TDDOWNLOAD")) self.table_mounts.setItem(row, 1, QTableWidgetItem(selected)) self.table_mounts.setItem(row, 2, QTableWidgetItem("新近添加")) @pyqtSlot() def slotRemoveMount(self): row = self.table_mounts.currentRow() self.table_mounts.removeRow(row) @pyqtSlot() def accept(self): app.settings.set("adapter-legacy", "username", self.lineEdit_loginUsername.text()) app.settings.set("adapter-legacy", "password", self.lineEdit_loginPassword.text()) app.settings.setbool("legacy", "autologin", self.checkBox_autoLogin.isChecked()) app.autoStart = self.checkBox_autoStartFrontend.isChecked() app.adapterManager[0].daemonManagedBySystemd = self.radio_managedBySystemd.isChecked() app.adapterManager[0].daemonManagedByUpstart = self.radio_managedByUpstart.isChecked() app.adapterManager[0].daemonManagedByAutostart = self.radio_managedByAutostart.isChecked() app.settings.setbool("legacy", "enabledeveloperstools", self.checkBox_enableDevelopersTools.isChecked()) app.settings.setbool("legacy", "allowflash", self.checkBox_allowFlash.isChecked()) app.settings.setbool("frontend", "minimizetosystray", self.checkBox_minimizeToSystray.isChecked()) # A possible Qt bug # https://bugreports.qt-project.org/browse/QTBUG-37695 app.settings.setbool("frontend", "closetominimize", self.checkBox_closeToMinimize.isChecked()) app.settings.setbool("frontend", "popnotifications", self.checkBox_popNotifications.isChecked()) app.settings.setbool("frontend", "notifybysound", self.checkBox_notifyBySound.isChecked()) app.settings.setbool("frontend", "showmonitorwindow", self.checkBox_showMonitorWindow.isChecked()) app.settings.setint("frontend", "monitorfullspeed", self.spinBox_monitorFullSpeed.value()) app.settings.setbool("frontend", "watchclipboard", self.checkBox_watchClipboard.isChecked()) app.settings.set("frontend", "watchpattern", self.plaintext_watchPattern.toPlainText()) if self.group_etmStartWhen.isEnabled(): startEtmWhen = self.btngrp_etmStartWhen.id(self.btngrp_etmStartWhen.checkedButton()) app.adapterManager[0].startEtmWhen = startEtmWhen app.settings.save() if self.tab_mount.isEnabled(): app.adapterManager[0].mountsFaker.mounts = self.newMounts app.applySettings.emit() super().accept() @property def newMounts(self): return list(map(lambda row: self.table_mounts.item(row, 1).text(), range(self.table_mounts.rowCount()))) @pyqtSlot() def setupETM(self): # fill values adapter = app.adapterManager[0] settings = adapter.backendSettings etmRunning = adapter.etmPid != 0 if etmRunning and settings.initialized: self.spinBox_dSpeedLimit.setValue(settings.downloadSpeedLimit) self.spinBox_uSpeedLimit.setValue(settings.uploadSpeedLimit) self.spinBox_maxRunningTasksNum.setValue(settings.maxRunTaskNumber) # connect signals self.accepted.connect(self.saveETM) else: self.spinBox_dSpeedLimit.setEnabled(False) self.spinBox_uSpeedLimit.setEnabled(False) self.spinBox_maxRunningTasksNum.setEnabled(False) @pyqtSlot() def saveETM(self): adapter = app.adapterManager[0] adapter.do_applySettings({ "downloadSpeedLimit": self.spinBox_dSpeedLimit.value(), "uploadSpeedLimit": self.spinBox_uSpeedLimit.value(), "maxRunTaskNumber": self.spinBox_maxRunningTasksNum.value(), })
class DataCheck(Content): def __init__(self, parent=None, button_func=None, params=None): super().__init__(parent, 'Data check', params) self.button_func = button_func path = os.path.abspath(os.path.dirname(__file__)) + '/static/' # nr = min(5, data.shape[0]) nr = len(self.params.data5) if params.lang == 'jp': text = ('データの読み込み結果(先頭{n}行)を以下に示します.\n' 'データを正しく読み込めていることを確認してください.'.format(n=nr)) self.set_paragraph( 'データ読み込み結果の確認', text=text) else: text = ('First {n} rows of your data are shown below.\n' 'Confirm that the data was read correctly.'.format(n=nr)) self.set_paragraph( 'Check data', text=text) table = NonScrollTable(self.inner) table.setRowCount(nr) table.setColumnCount(len(self.params.columns)) table.setHorizontalHeaderLabels(self.params.columns) for r in range(nr): for c in range(len(self.params.columns)): item = QTableWidgetItem(str(self.params.data5.iat[r, c])) item.setFlags(Qt.ItemIsEnabled) table.setItem(r, c, item) table.setNonScroll() self.vbox.addWidget(table) # Text for type checking and objective variable setting path1 = path + 'categorical' text = self.get_text(path1) if self.params.lang == 'en': self.set_paragraph( 'Check type of variables and set objective variable', text=text) else: self.set_paragraph('変数タイプの確認と目的変数の設定', text=text) # htable = QTableWidget(self.inner) htable = NonScrollTable(self.inner) htable.setRowCount(len(self.params.columns)) htable.setColumnCount(4) htable.setHorizontalHeaderLabels( ['columns', 'categorical', 'numerical', 'target']) self.lst_cat = [] self.lst_num = [] self.lst_obj = [] self.obj_group = QButtonGroup(self.inner) for c in range(len(self.params.columns)): # col 1 item = QTableWidgetItem(self.params.columns[c]) item.setFlags(Qt.ItemIsEnabled) htable.setItem(c, 0, item) group = QButtonGroup(self.inner) # col 2 htable.setCellWidget( c, 1, self.__make_cell(c, 'cat', self.params.col_types[c], self.params.col_types_def[c])) group.addButton(self.lst_cat[-1]) # col 3 htable.setCellWidget( c, 2, self.__make_cell(c, 'num', self.params.col_types[c], self.params.col_types_def[c])) group.addButton(self.lst_num[-1]) # col 4 htable.setCellWidget( c, 3, self.__make_cell(c, 'obj', self.params.col_types[c], self.params.col_types_def[c])) self.obj_group.addButton(self.lst_obj[-1]) self.obj_group.setId(self.lst_obj[-1], c) htable.setNonScroll() self.vbox.addWidget(htable) if self.params.lang == 'jp': self.txt_cnf = ('<font color="red">目的変数を1つ選択し,' 'targetの列にチェックをいれてください。') if self.params.task.lower() == 'classification': self.txt_cnf += '<br>目的変数はカテゴリ変数である必要があります。</font>' else: self.txt_cnf += '<br>目的変数は量的変数である必要があります。</font>' else: self.txt_cnf = ('<font color="red">Select one variable as target variable,' 'then set the column of "target" of the variable checked.') if self.params.task.lower() == 'classification': self.txt_cnf += '<br>Target variable must be a categorical variable.</font>' else: self.txt_cnf += '<br>Target variable must be a numerical variable.</font>' self.lbl_cnf = QLabel(self.txt_cnf, self.inner) self.vbox.addWidget(self.lbl_cnf) self.vbox.addStretch(1) self.btn = QPushButton('Next', self.inner) self.btn.setStyleSheet('QPushButton{font: bold; font-size: 15pt; background-color: white;};') if self.params.lang == 'en': self.btn.clicked.connect(lambda: self.button_func('Overfitting')) else: self.btn.clicked.connect(lambda: self.button_func('過学習')) if self.obj_group.checkedButton() is None: self.btn.setEnabled(False) else: self.btn.setEnabled(True) self.vbox.addWidget(self.btn) def __make_cell(self, c, name, col_type, col_type_def): cell = QWidget(self.inner) rbtn = QRadioButton('', cell) rbtn.toggled.connect(lambda: self.rbtn_clicked(name + '_' + str(c))) hbl = QHBoxLayout(cell) hbl.addWidget(rbtn) hbl.setContentsMargins(0, 0, 0, 0) hbl.setAlignment(Qt.AlignCenter) cell.setLayout(hbl) if name == 'cat': if col_type == 'object': rbtn.setChecked(True) self.lst_cat.append(rbtn) elif name == 'num': if col_type != 'object': rbtn.setChecked(True) if col_type_def == 'object': rbtn.setEnabled(False) self.lst_num.append(rbtn) elif name == 'obj': if col_type == 'object' and self.params.task == 'Regression': rbtn.setEnabled(False) elif col_type != 'object' and self.params.task == 'Classification': rbtn.setEnabled(False) if self.params.columns[c] == self.params.objective: rbtn.setChecked(True) self.lst_obj.append(rbtn) return cell def rbtn_clicked(self, text): name, idx = text.split('_') idx = int(idx) if len(self.lst_obj) <= idx: return if self.lst_num[idx].isChecked(): if self.params.task == 'Classification': self.obj_group.setExclusive(False) self.lst_obj[idx].setChecked(False) self.obj_group.setExclusive(True) self.lst_obj[idx].setEnabled(False) elif self.params.task == 'Regression': self.lst_obj[idx].setEnabled(True) self.params.col_types[idx] = self.params.col_types_def[idx] elif self.lst_cat[idx].isChecked(): if self.params.task == 'Classification': self.lst_obj[idx].setEnabled(True) elif self.params.task == 'Regression': self.obj_group.setExclusive(False) self.lst_obj[idx].setChecked(False) self.obj_group.setExclusive(True) self.lst_obj[idx].setEnabled(False) self.params.col_types[idx] = 'object' if self.obj_group.checkedButton() is None: self.params.objective = None self.lbl_cnf.setText(self.txt_cnf) self.btn.setEnabled(False) else: self.params.objective =\ self.params.columns[self.obj_group.checkedId()] self.lbl_cnf.setText('<br>') self.btn.setEnabled(True) self.params.col_types_changed = True
class SettingsDialog(QDialog, Ui_Dialog): def __init__(self, parent): super().__init__(parent) self.setAttribute(Qt.WA_DeleteOnClose) self.setupUi(self) self.lineEdit_loginUsername.setText( app.settings.get("account", "username")) self.lineEdit_loginPassword.setText( app.settings.get("account", "password")) self.checkBox_autoLogin.setChecked( app.settings.getbool("account", "autologin")) self.checkBox_autoStartFrontend.setChecked(app.autoStart) # Xwared Management managedBySystemd = app.xwaredpy.managedBySystemd managedByUpstart = app.xwaredpy.managedByUpstart managedByAutostart = app.xwaredpy.managedByAutostart self.radio_managedBySystemd.setChecked(managedBySystemd) self.radio_managedByUpstart.setChecked(managedByUpstart) self.radio_managedByAutostart.setChecked(managedByAutostart) self.radio_managedByNothing.setChecked(not ( managedBySystemd or managedByUpstart or managedByAutostart)) initType = getInitType() self.radio_managedBySystemd.setEnabled(initType == InitType.SYSTEMD) self.radio_managedByUpstart.setEnabled(initType == InitType.UPSTART) # frontend self.checkBox_enableDevelopersTools.setChecked( app.settings.getbool("frontend", "enabledeveloperstools")) self.checkBox_allowFlash.setChecked( app.settings.getbool("frontend", "allowflash")) self.checkBox_minimizeToSystray.setChecked( app.settings.getbool("frontend", "minimizetosystray")) self.checkBox_closeToMinimize.setChecked( app.settings.getbool("frontend", "closetominimize")) self.checkBox_popNotifications.setChecked( app.settings.getbool("frontend", "popnotifications")) self.checkBox_notifyBySound.setChecked( app.settings.getbool("frontend", "notifybysound")) self.checkBox_showMonitorWindow.setChecked( app.settings.getbool("frontend", "showmonitorwindow")) self.spinBox_monitorFullSpeed.setValue( app.settings.getint("frontend", "monitorfullspeed")) # clipboard related self.checkBox_watchClipboard.stateChanged.connect( self.slotWatchClipboardToggled) self.checkBox_watchClipboard.setChecked( app.settings.getbool("frontend", "watchclipboard")) self.slotWatchClipboardToggled( self.checkBox_watchClipboard.checkState()) self.plaintext_watchPattern.setPlainText( app.settings.get("frontend", "watchpattern")) self.btngrp_etmStartWhen = QButtonGroup() self.btngrp_etmStartWhen.addButton(self.radio_backendStartWhen1, 1) self.btngrp_etmStartWhen.addButton(self.radio_backendStartWhen2, 2) self.btngrp_etmStartWhen.addButton(self.radio_backendStartWhen3, 3) startEtmWhen = app.xwaredpy.startEtmWhen if startEtmWhen: self.btngrp_etmStartWhen.button(startEtmWhen).setChecked(True) else: self.group_etmStartWhen.setEnabled(False) self.btn_addMount.clicked.connect(self.slotAddMount) self.btn_removeMount.clicked.connect(self.slotRemoveMount) # Mounts self.setupMounts() # backend setting is a different thing! self.setupETM() @pyqtSlot(int) def slotWatchClipboardToggled(self, state): self.plaintext_watchPattern.setEnabled(state) @pyqtSlot() def setupMounts(self): self.table_mounts.setRowCount(0) self.table_mounts.clearContents() mountsMapping = app.mountsFaker.getMountsMapping() for i, mount in enumerate(app.mountsFaker.mounts): self.table_mounts.insertRow(i) # drive1: the drive letter it should map to, by alphabetical order drive1 = app.mountsFaker.driveIndexToLetter(i) self.table_mounts.setItem( i, 0, QTableWidgetItem(drive1 + "\\TDDOWNLOAD")) # mounts = ['/path/to/1', 'path/to/2', ...] self.table_mounts.setItem(i, 1, QTableWidgetItem(mount)) # drive2: the drive letter it actually is assigned to drive2 = mountsMapping.get(mount, "无") errors = [] # check: mapping if drive1 != drive2: errors.append("错误:盘符映射在'{actual}',而不是'{should}'。\n" "如果这是个新挂载的文件夹,请尝试稍等,或重启后端,可能会修复此问题。".format( actual=drive2, should=drive1)) brush = QBrush() if errors: brush.setColor(Qt.red) errString = "\n".join(errors) else: brush.setColor(Qt.darkGreen) errString = "正常" errWidget = QTableWidgetItem(errString) errWidget.setForeground(brush) self.table_mounts.setItem(i, 2, errWidget) del brush, errWidget self.table_mounts.resizeColumnsToContents() @pyqtSlot() def slotAddMount(self): fileDialog = QFileDialog(self, Qt.Dialog) fileDialog.setFileMode(QFileDialog.Directory) fileDialog.setOption(QFileDialog.ShowDirsOnly, True) fileDialog.setViewMode(QFileDialog.List) fileDialog.setDirectory(os.environ["HOME"]) if fileDialog.exec(): selected = fileDialog.selectedFiles()[0] if selected in self.newMounts: return row = self.table_mounts.rowCount() self.table_mounts.insertRow(row) self.table_mounts.setItem( row, 0, QTableWidgetItem( app.mountsFaker.driveIndexToLetter(row) + "\\TDDOWNLOAD")) self.table_mounts.setItem(row, 1, QTableWidgetItem(selected)) self.table_mounts.setItem(row, 2, QTableWidgetItem("新近添加")) @pyqtSlot() def slotRemoveMount(self): row = self.table_mounts.currentRow() self.table_mounts.removeRow(row) @pyqtSlot() def accept(self): app.settings.set("account", "username", self.lineEdit_loginUsername.text()) app.settings.set("account", "password", self.lineEdit_loginPassword.text()) app.settings.setbool("account", "autologin", self.checkBox_autoLogin.isChecked()) app.autoStart = self.checkBox_autoStartFrontend.isChecked() app.xwaredpy.managedBySystemd = self.radio_managedBySystemd.isChecked() app.xwaredpy.managedByUpstart = self.radio_managedByUpstart.isChecked() app.xwaredpy.managedByAutostart = self.radio_managedByAutostart.isChecked( ) app.settings.setbool("frontend", "enabledeveloperstools", self.checkBox_enableDevelopersTools.isChecked()) app.settings.setbool("frontend", "allowflash", self.checkBox_allowFlash.isChecked()) app.settings.setbool("frontend", "minimizetosystray", self.checkBox_minimizeToSystray.isChecked()) # A possible Qt bug # https://bugreports.qt-project.org/browse/QTBUG-37695 app.settings.setbool("frontend", "closetominimize", self.checkBox_closeToMinimize.isChecked()) app.settings.setbool("frontend", "popnotifications", self.checkBox_popNotifications.isChecked()) app.settings.setbool("frontend", "notifybysound", self.checkBox_notifyBySound.isChecked()) app.settings.setbool("frontend", "showmonitorwindow", self.checkBox_showMonitorWindow.isChecked()) app.settings.setint("frontend", "monitorfullspeed", self.spinBox_monitorFullSpeed.value()) app.settings.setbool("frontend", "watchclipboard", self.checkBox_watchClipboard.isChecked()) app.settings.set("frontend", "watchpattern", self.plaintext_watchPattern.toPlainText()) if self.group_etmStartWhen.isEnabled(): startEtmWhen = self.btngrp_etmStartWhen.id( self.btngrp_etmStartWhen.checkedButton()) try: app.xwaredpy.startEtmWhen = startEtmWhen except InvalidSocket: QMessageBox.warning( None, "Xware Desktop", "选项未能成功设置:{}。".format(self.group_etmStartWhen.title()), QMessageBox.Ok, QMessageBox.Ok) app.settings.save() app.mountsFaker.mounts = self.newMounts app.settings.applySettings.emit() super().accept() @property def newMounts(self): return list( map(lambda row: self.table_mounts.item(row, 1).text(), range(self.table_mounts.rowCount()))) @pyqtSlot() def setupETM(self): # fill values lcPort = app.xwaredpy.lcPort self.lineEdit_lcport.setText(str(lcPort) if lcPort else "不可用") etmSettings = app.etmpy.getSettings() if etmSettings: self.spinBox_dSpeedLimit.setValue(etmSettings.dLimit) self.spinBox_uSpeedLimit.setValue(etmSettings.uLimit) self.spinBox_maxRunningTasksNum.setValue( etmSettings.maxRunningTasksNum) # connect signals self.accepted.connect(self.saveETM) else: self.spinBox_dSpeedLimit.setEnabled(False) self.spinBox_uSpeedLimit.setEnabled(False) self.spinBox_maxRunningTasksNum.setEnabled(False) @pyqtSlot() def saveETM(self): newsettings = EtmSetting( dLimit=self.spinBox_dSpeedLimit.value(), uLimit=self.spinBox_uSpeedLimit.value(), maxRunningTasksNum=self.spinBox_maxRunningTasksNum.value()) app.etmpy.saveSettings(newsettings)
class FileDialogWizardDialog(QDialog, Ui_FileDialogWizardDialog): """ Class implementing the color dialog wizard dialog. It displays a dialog for entering the parameters for the E5FileDialog or QFileDialog code generator. """ def __init__(self, dialogVariant, parent=None): """ Constructor @param dialogVariant variant of the file dialog to be generated (-1 = E5FileDialog, 0 = unknown, 4 = PyQt4, 5 = PyQt5) @type int @param parent parent widget @type QWidget """ super(FileDialogWizardDialog, self).__init__(parent) self.setupUi(self) self.eStartWithCompleter = E5FileCompleter(self.eStartWith) self.eWorkDirCompleter = E5DirCompleter(self.eWorkDir) self.__dialogVariant = dialogVariant self.__typeButtonsGroup = QButtonGroup(self) self.__typeButtonsGroup.setExclusive(True) self.__typeButtonsGroup.addButton(self.rOpenFile, 1) self.__typeButtonsGroup.addButton(self.rOpenFiles, 2) self.__typeButtonsGroup.addButton(self.rSaveFile, 3) self.__typeButtonsGroup.addButton(self.rfOpenFile, 11) self.__typeButtonsGroup.addButton(self.rfOpenFiles, 12) self.__typeButtonsGroup.addButton(self.rfSaveFile, 13) self.__typeButtonsGroup.addButton(self.rOpenFileUrl, 21) self.__typeButtonsGroup.addButton(self.rOpenFileUrls, 22) self.__typeButtonsGroup.addButton(self.rSaveFileUrl, 23) self.__typeButtonsGroup.addButton(self.rDirectory, 30) self.__typeButtonsGroup.addButton(self.rDirectoryUrl, 31) self.__typeButtonsGroup.buttonClicked[int].connect( self.__toggleInitialFilterAndResult) self.__toggleInitialFilterAndResult(1) self.__dialogVariant = dialogVariant if self.__dialogVariant == -1: self.pyqtComboBox.addItems(["eric"]) self.setWindowTitle(self.tr("E5FileDialog Wizard")) self.pyqtComboBox.setCurrentIndex(0) self.pyqtComboBox.setEnabled(False) else: self.pyqtComboBox.addItems(["PyQt5", "PyQt4"]) self.setWindowTitle(self.tr("QFileDialog Wizard")) if self.__dialogVariant == 5: self.pyqtComboBox.setCurrentIndex(0) elif self.__dialogVariant == 4: self.pyqtComboBox.setCurrentIndex(1) else: self.pyqtComboBox.setCurrentIndex(0) self.rSaveFile.toggled[bool].connect(self.__toggleConfirmCheckBox) self.rfSaveFile.toggled[bool].connect(self.__toggleConfirmCheckBox) self.rSaveFileUrl.toggled[bool].connect(self.__toggleConfirmCheckBox) self.rDirectory.toggled[bool].connect(self.__toggleGroupsAndTest) self.rDirectoryUrl.toggled[bool].connect(self.__toggleGroupsAndTest) self.cStartWith.toggled[bool].connect(self.__toggleGroupsAndTest) self.cWorkDir.toggled[bool].connect(self.__toggleGroupsAndTest) self.cFilters.toggled[bool].connect(self.__toggleGroupsAndTest) self.bTest = self.buttonBox.addButton(self.tr("Test"), QDialogButtonBox.ActionRole) msh = self.minimumSizeHint() self.resize(max(self.width(), msh.width()), msh.height()) def __adjustOptions(self, options): """ Private method to adjust the file dialog options. @param options file dialog options (QFileDialog.Options) @return modified options (QFileDialog.Options) """ if Globals.isLinuxPlatform(): options |= QFileDialog.DontUseNativeDialog return options @pyqtSlot(str) def on_pyqtComboBox_currentIndexChanged(self, txt): """ Private slot to setup the dialog for the selected PyQt variant. @param txt text of the selected combo box entry (string) """ self.rfOpenFile.setEnabled(txt in ("eric", "PyQt4")) self.rfOpenFiles.setEnabled(txt in ("eric", "PyQt4")) self.rfSaveFile.setEnabled(txt in ("eric", "PyQt4")) self.rOpenFileUrl.setEnabled(txt == "PyQt5") self.rOpenFileUrls.setEnabled(txt == "PyQt5") self.rSaveFileUrl.setEnabled(txt == "PyQt5") self.rDirectoryUrl.setEnabled(txt == "PyQt5") if txt == "PyQt5": if self.rfOpenFile.isChecked(): self.rOpenFile.setChecked(True) elif self.rfOpenFiles.isChecked(): self.rOpenFiles.setChecked(True) elif self.rfSaveFile.isChecked(): self.rSaveFile.setChecked(True) else: if self.rOpenFileUrl.isChecked(): self.rOpenFile.setChecked(True) if self.rOpenFileUrls.isChecked(): self.rOpenFiles.setChecked(True) if self.rSaveFileUrl.isChecked(): self.rSaveFile.setChecked(True) if self.rDirectoryUrl.isChecked(): self.rDirectory.setChecked(True) if txt == "eric": self.__dialogVariant = -1 elif txt == "PyQt5": self.__dialogVariant = 5 elif txt == "PyQt4": self.__dialogVariant = 4 else: # default is PyQt5 self.__dialogVariant = 5 self.__toggleInitialFilterAndResult( self.__typeButtonsGroup.checkedId()) def on_buttonBox_clicked(self, button): """ Private slot called by a button of the button box clicked. @param button button that was clicked (QAbstractButton) """ if button == self.bTest: self.on_bTest_clicked() @pyqtSlot() def on_bTest_clicked(self): """ Private method to test the selected options. """ if self.rOpenFile.isChecked() or self.rfOpenFile.isChecked(): if not self.cSymlinks.isChecked(): options = QFileDialog.Options(QFileDialog.DontResolveSymlinks) else: options = QFileDialog.Options() options = self.__adjustOptions(options) QFileDialog.getOpenFileName(None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), self.eInitialFilter.text(), options) elif self.rOpenFileUrl.isChecked(): if not self.cSymlinks.isChecked(): options = QFileDialog.Options(QFileDialog.DontResolveSymlinks) else: options = QFileDialog.Options() options = self.__adjustOptions(options) try: QFileDialog.getOpenFileUrl(None, self.eCaption.text(), QUrl(self.eStartWith.text()), self.eFilters.text(), self.eInitialFilter.text(), options, self.schemesEdit.text().split()) except TypeError: # PyQt5 < 5.13.0 contains an error QFileDialog.getOpenFileUrl(None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), self.eInitialFilter.text(), options, self.schemesEdit.text().split()) elif self.rOpenFiles.isChecked() or self.rfOpenFiles.isChecked(): if not self.cSymlinks.isChecked(): options = QFileDialog.Options(QFileDialog.DontResolveSymlinks) else: options = QFileDialog.Options() options = self.__adjustOptions(options) QFileDialog.getOpenFileNames(None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), self.eInitialFilter.text(), options) elif self.rOpenFileUrls.isChecked(): if not self.cSymlinks.isChecked(): options = QFileDialog.Options(QFileDialog.DontResolveSymlinks) else: options = QFileDialog.Options() options = self.__adjustOptions(options) try: QFileDialog.getOpenFileUrls(None, self.eCaption.text(), QUrl(self.eStartWith.text()), self.eFilters.text(), self.eInitialFilter.text(), options, self.schemesEdit.text().split()) except TypeError: # PyQt5 < 5.13.0 contains an error QFileDialog.getOpenFileUrls(None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), self.eInitialFilter.text(), options, self.schemesEdit.text().split()) elif self.rSaveFile.isChecked() or self.rfSaveFile.isChecked(): if not self.cSymlinks.isChecked(): options = QFileDialog.Options(QFileDialog.DontResolveSymlinks) else: options = QFileDialog.Options() options = self.__adjustOptions(options) QFileDialog.getSaveFileName(None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), self.eInitialFilter.text(), options) elif self.rSaveFileUrl.isChecked(): if not self.cSymlinks.isChecked(): options = QFileDialog.Options(QFileDialog.DontResolveSymlinks) else: options = QFileDialog.Options() options = self.__adjustOptions(options) try: QFileDialog.getSaveFileUrl(None, self.eCaption.text(), QUrl(self.eStartWith.text()), self.eFilters.text(), self.eInitialFilter.text(), options, self.schemesEdit.text().split()) except TypeError: # PyQt5 < 5.13.0 contains an error QFileDialog.getSaveFileUrl(None, self.eCaption.text(), self.eStartWith.text(), self.eFilters.text(), self.eInitialFilter.text(), options, self.schemesEdit.text().split()) elif self.rDirectory.isChecked(): options = QFileDialog.Options() if not self.cSymlinks.isChecked(): options |= QFileDialog.Options(QFileDialog.DontResolveSymlinks) if self.cDirOnly.isChecked(): options |= QFileDialog.Options(QFileDialog.ShowDirsOnly) else: options |= QFileDialog.Options(QFileDialog.Option(0)) options = self.__adjustOptions(options) QFileDialog.getExistingDirectory(None, self.eCaption.text(), self.eWorkDir.text(), options) elif self.rDirectoryUrl.isChecked(): options = QFileDialog.Options() if not self.cSymlinks.isChecked(): options |= QFileDialog.Options(QFileDialog.DontResolveSymlinks) if self.cDirOnly.isChecked(): options |= QFileDialog.Options(QFileDialog.ShowDirsOnly) else: options |= QFileDialog.Options(QFileDialog.Option(0)) options = self.__adjustOptions(options) try: QFileDialog.getExistingDirectoryUrl( None, self.eCaption.text(), QUrl(self.eWorkDir.text()), options, self.schemesEdit.text().split()) except TypeError: # PyQt5 < 5.13.0 contains an error QFileDialog.getExistingDirectoryUrl( None, self.eCaption.text(), self.eWorkDir.text(), options, self.schemesEdit.text().split()) def __toggleConfirmCheckBox(self): """ Private slot to enable/disable the confirmation check box. """ self.cConfirmOverwrite.setEnabled(self.rSaveFile.isChecked() or self.rfSaveFile.isChecked() or self.rSaveFileUrl.isChecked()) def __toggleGroupsAndTest(self): """ Private slot to enable/disable certain groups and the test button. """ if self.rDirectory.isChecked() or self.rDirectoryUrl.isChecked(): self.filePropertiesGroup.setEnabled(False) self.dirPropertiesGroup.setEnabled(True) self.bTest.setDisabled(self.cWorkDir.isChecked()) else: self.filePropertiesGroup.setEnabled(True) self.dirPropertiesGroup.setEnabled(False) self.bTest.setDisabled(self.cStartWith.isChecked() or self.cFilters.isChecked()) def __toggleInitialFilterAndResult(self, checkedId): """ Private slot to enable/disable the initial filter elements and the results entries. @param checkedId id of the clicked button (integer) """ enable = ( (self.__dialogVariant in (-1, 4) and checkedId in [11, 12, 13]) or (self.__dialogVariant == 5 and checkedId in [1, 2, 3, 21, 22, 23])) self.lInitialFilter.setEnabled(enable) self.eInitialFilter.setEnabled(enable) self.cInitialFilter.setEnabled(enable) self.lFilterVariable.setEnabled(enable) self.eFilterVariable.setEnabled(enable) self.urlPropertiesGroup.setEnabled(checkedId in (21, 22, 23, 31)) def getCode(self, indLevel, indString): """ Public method to get the source code for Qt4 and Qt5. @param indLevel indentation level (int) @param indString string used for indentation (space or tab) (string) @return generated code (string) """ # calculate our indentation level and the indentation string il = indLevel + 1 istring = il * indString estring = os.linesep + indLevel * indString # now generate the code if self.parentSelf.isChecked(): parent = "self" elif self.parentNone.isChecked(): parent = "None" elif self.parentOther.isChecked(): parent = self.parentEdit.text() if parent == "": parent = "None" # prepare the result variables nameVariable = self.eNameVariable.text() if not nameVariable: if self.__typeButtonsGroup.checkedButton() in [ self.rOpenFile, self.rfOpenFile, self.rSaveFile, self.rfSaveFile ]: nameVariable = "fileName" elif self.__typeButtonsGroup.checkedButton() in [ self.rOpenFiles, self.rfOpenFiles ]: nameVariable = "fileNames" elif self.__typeButtonsGroup.checkedButton() == self.rDirectory: nameVariable = "dirName" else: nameVariable = "res" filterVariable = self.eFilterVariable.text() if not filterVariable: if ((self.__dialogVariant in (-1, 4) and self.__typeButtonsGroup.checkedButton() in [self.rfOpenFile, self.rfOpenFiles, self.rfSaveFile]) or (self.__dialogVariant == 5 and self.__typeButtonsGroup.checkedButton() in [self.rOpenFile, self.rOpenFiles, self.rSaveFile])): filterVariable = ", selectedFilter" else: filterVariable = "" else: filterVariable = ", " + filterVariable if self.__dialogVariant == -1: dialogType = "E5FileDialog" else: dialogType = "QFileDialog" code = '{0}{1} = {2}.'.format(nameVariable, filterVariable, dialogType) if (self.rOpenFile.isChecked() or self.rfOpenFile.isChecked() or self.rOpenFileUrl.isChecked()): if self.rOpenFile.isChecked(): code += 'getOpenFileName({0}{1}'.format(os.linesep, istring) elif self.rOpenFileUrl.isChecked(): code += 'getOpenFileUrl({0}{1}'.format(os.linesep, istring) else: code += 'getOpenFileNameAndFilter({0}{1}'.format( os.linesep, istring) code += '{0},{1}{2}'.format(parent, os.linesep, istring) if not self.eCaption.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: code += 'self.tr("{0}"),{1}{2}'.format(self.eCaption.text(), os.linesep, istring) if self.rOpenFileUrl.isChecked(): if not self.eStartWith.text(): code += 'QUrl(),{0}{1}'.format(os.linesep, istring) else: if self.cStartWith.isChecked(): fmt = '{0},{1}{2}' else: fmt = 'QUrl("{0}"),{1}{2}' code += fmt.format(self.eStartWith.text(), os.linesep, istring) else: if not self.eStartWith.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: if self.cStartWith.isChecked(): fmt = '{0},{1}{2}' else: fmt = '"{0}",{1}{2}' code += fmt.format(self.eStartWith.text(), os.linesep, istring) if self.eFilters.text() == "": code += '""' else: if self.cFilters.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' code += fmt.format(self.eFilters.text()) if self.rfOpenFile.isChecked() or self.__dialogVariant == 5: if self.eInitialFilter.text() == "": initialFilter = "None" else: if self.cInitialFilter.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' initialFilter = fmt.format(self.eInitialFilter.text()) code += ',{0}{1}{2}'.format(os.linesep, istring, initialFilter) if not self.cSymlinks.isChecked(): code += ',{0}{1}{2}.Options({2}.DontResolveSymlinks)'.format( os.linesep, istring, dialogType) if self.rOpenFileUrl.isChecked() and bool(self.schemesEdit.text()): code += ',{0}{1}{2}'.format(os.linesep, istring, self.__prepareSchemesList()) code += '){0}'.format(estring) elif (self.rOpenFiles.isChecked() or self.rfOpenFiles.isChecked() or self.rOpenFileUrls.isChecked()): if self.rOpenFiles.isChecked(): code += 'getOpenFileNames({0}{1}'.format(os.linesep, istring) elif self.rOpenFileUrls.isChecked(): code += 'getOpenFileUrls({0}{1}'.format(os.linesep, istring) else: code += 'getOpenFileNamesAndFilter({0}{1}'.format( os.linesep, istring) code += '{0},{1}{2}'.format(parent, os.linesep, istring) if not self.eCaption.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: code += 'self.tr("{0}"),{1}{2}'.format(self.eCaption.text(), os.linesep, istring) if self.rOpenFileUrls.isChecked(): if not self.eStartWith.text(): code += 'QUrl(),{0}{1}'.format(os.linesep, istring) else: if self.cStartWith.isChecked(): fmt = '{0},{1}{2}' else: fmt = 'QUrl("{0}"),{1}{2}' code += fmt.format(self.eStartWith.text(), os.linesep, istring) else: if not self.eStartWith.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: if self.cStartWith.isChecked(): fmt = '{0},{1}{2}' else: fmt = '"{0}",{1}{2}' code += fmt.format(self.eStartWith.text(), os.linesep, istring) if not self.eFilters.text(): code += '""' else: if self.cFilters.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' code += fmt.format(self.eFilters.text()) if self.rfOpenFiles.isChecked() or self.__dialogVariant == 5: if self.eInitialFilter.text() == "": initialFilter = "None" else: if self.cInitialFilter.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' initialFilter = fmt.format(self.eInitialFilter.text()) code += ',{0}{1}{2}'.format(os.linesep, istring, initialFilter) if not self.cSymlinks.isChecked(): code += ',{0}{1}{2}.Options({2}.DontResolveSymlinks)'.format( os.linesep, istring, dialogType) if (self.rOpenFileUrls.isChecked() and bool(self.schemesEdit.text())): code += ',{0}{1}{2}'.format(os.linesep, istring, self.__prepareSchemesList()) code += '){0}'.format(estring) elif (self.rSaveFile.isChecked() or self.rfSaveFile.isChecked() or self.rSaveFileUrl.isChecked()): if self.rSaveFile.isChecked(): code += 'getSaveFileName({0}{1}'.format(os.linesep, istring) elif self.rSaveFileUrl.isChecked(): code += 'getSaveFileUrl({0}{1}'.format(os.linesep, istring) else: code += 'getSaveFileNameAndFilter({0}{1}'.format( os.linesep, istring) code += '{0},{1}{2}'.format(parent, os.linesep, istring) if not self.eCaption.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: code += 'self.tr("{0}"),{1}{2}'.format(self.eCaption.text(), os.linesep, istring) if self.rSaveFileUrl.isChecked(): if not self.eStartWith.text(): code += 'QUrl(),{0}{1}'.format(os.linesep, istring) else: if self.cStartWith.isChecked(): fmt = '{0},{1}{2}' else: fmt = 'QUrl("{0}"),{1}{2}' code += fmt.format(self.eStartWith.text(), os.linesep, istring) else: if not self.eStartWith.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: if self.cStartWith.isChecked(): fmt = '{0},{1}{2}' else: fmt = '"{0}",{1}{2}' code += fmt.format(self.eStartWith.text(), os.linesep, istring) if not self.eFilters.text(): code += '""' else: if self.cFilters.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' code += fmt.format(self.eFilters.text()) if self.rfSaveFile.isChecked() or self.__dialogVariant == 5: if self.eInitialFilter.text() == "": initialFilter = "None" else: if self.cInitialFilter.isChecked(): fmt = '{0}' else: fmt = 'self.tr("{0}")' initialFilter = fmt.format(self.eInitialFilter.text()) code += ',{0}{1}{2}'.format(os.linesep, istring, initialFilter) if ((not self.cSymlinks.isChecked()) or (not self.cConfirmOverwrite.isChecked())): code += ',{0}{1}{2}.Options('.format(os.linesep, istring, dialogType) if not self.cSymlinks.isChecked(): code += '{0}.DontResolveSymlinks'.format(dialogType) if ((not self.cSymlinks.isChecked()) and (not self.cConfirmOverwrite.isChecked())): code += ' | ' if not self.cConfirmOverwrite.isChecked(): code += '{0}.DontConfirmOverwrite'.format(dialogType) code += ')' if (self.rSaveFileUrl.isChecked() and bool(self.schemesEdit.text())): code += ',{0}{1}{2}'.format(os.linesep, istring, self.__prepareSchemesList()) code += '){0}'.format(estring) elif self.rDirectory.isChecked() or self.rDirectoryUrl.isChecked(): if self.rDirectory.isChecked(): code += 'getExistingDirectory({0}{1}'.format( os.linesep, istring) else: code += 'getExistingDirectoryUrl({0}{1}'.format( os.linesep, istring) code += '{0},{1}{2}'.format(parent, os.linesep, istring) if not self.eCaption.text(): code += '"",{0}{1}'.format(os.linesep, istring) else: code += 'self.tr("{0}"),{1}{2}'.format(self.eCaption.text(), os.linesep, istring) if self.rDirectoryUrl.isChecked(): if not self.eWorkDir.text(): code += 'QUrl()' else: if self.cWorkDir.isChecked(): fmt = '{0}' else: fmt = 'QUrl("{0}")' code += fmt.format(self.eWorkDir.text()) else: if not self.eWorkDir.text(): code += '""' else: if self.cWorkDir.isChecked(): fmt = '{0}' else: fmt = '"{0}"' code += fmt.format(self.eWorkDir.text()) code += ',{0}{1}{2}.Options('.format(os.linesep, istring, dialogType) if not self.cSymlinks.isChecked(): code += '{0}.DontResolveSymlinks | '.format(dialogType) if self.cDirOnly.isChecked(): code += '{0}.ShowDirsOnly'.format(dialogType) else: code += '{0}.Option(0)'.format(dialogType) code += ')' if self.rDirectoryUrl.isChecked(): code += ',{0}{1}{2}'.format(os.linesep, istring, self.__prepareSchemesList()) code += '){0}'.format(estring) return code def __prepareSchemesList(self): """ Private method to prepare the list of supported schemes. @return string representation of the supported schemes @rtype str """ return repr(self.schemesEdit.text().strip().split())
class TARWindow(QDialog): def __init__(self, resource, size): # Load UI super(TARWindow, self).__init__() uic.loadUi(GUI_FOLDER + 'tarCreation.ui', self) self.resource = cv2.imread(resource) self.h, self.w = self.resource.shape[:2] self.tileSize = size # We'll need a temporal folder self.tmp_dir = tempfile.mkdtemp() # In order to get the tiles we'll define the size self.resourceView.setIconSize(QSize(size, size)) # Defining labels self.comprLabel.setText('Compression:') c = self.getTiles(self.resource, self.h, self.w, self.tileSize) self.columns, self.rows = c self.refreshdir(self.columns, self.rows, self.tileSize) # Radio Buttons in a group self.comprGroup = QButtonGroup() self.comprGroup.addButton(self.tarRadio) self.comprGroup.addButton(self.targzRadio) self.comprGroup.addButton(self.tarbz2Radio) self.comprGroup.addButton(self.tarxzRadio) # We'll define a compression by default self.targzRadio.setChecked(True) # If we don't define blankTile right now it will return an error self.blankTile = str() # Signals self.blankButton.clicked.connect(self.setBlank) self.saveBox.accepted.connect(self.saveTilemap) self.saveBox.rejected.connect(self.cancel) def getTiles(self, resource, h, w, tileSize): # This cuts the resource and put it on the temporary folder. r = 0 for i in range(0, h, tileSize): c = 0 for j in range(0, w, tileSize): box = self.resource[i:i+tileSize, j:j+tileSize] nm = str(c) + '-' + str(r) + '.png' place = os.path.join(self.tmp_dir, nm) cv2.imwrite(place, box) c += 1 r += 1 return(c,r) def hashsum(self, path, hex=True, hash_type=hashlib.md5): # All this function was for deleting the repeated tiles. I won't use # it. hashinst = hash_type() blocksize = hashinst.block_size * 128 with open(path, 'rb') as f: for chunk in iter(lambda: f.read(blocksize), b''): hashinst.update(chunk) return(hashinst.hexdigest() if hex else hashinst.digest()) def refreshdir(self, c, r, size): # This loads the tilemap self.resourceView.setColumnCount(c) self.resourceView.setRowCount(r) for column in range(0, c): self.resourceView.setColumnWidth(column, size) for row in range(0, r): self.resourceView.setRowHeight(row, size) filename = str(column) + '-'+ str(row) + '.png' filedir = os.path.join(self.tmp_dir, filename) icon = QIcon(filedir) item = QTableWidgetItem(icon, None) self.resourceView.setItem(row, column, item) @pyqtSlot() def setBlank(self): # Set the blank tile. When you load a new map, the tilemap will give a # default tile for the blank map. r = str(self.resourceView.currentRow()) c = str(self.resourceView.currentColumn()) file = c + '-' + r pixmap = QPixmap(os.path.join(self.tmp_dir, file + '.png')) pixmapitem = QGraphicsPixmapItem(pixmap) scene = QGraphicsScene() scene.addItem(pixmapitem) self.tileView.setScene(scene) self.blankTile = file def saveTilemap(self): # We have to define c and r from self # Because PyQt Signals are shitty # So I'm using a singals style that can't pass arguments c = self.columns r = self.rows # We'll write the metadata fileplace = os.path.join(self.tmp_dir, 'metafile.ini') # You may be thinking: # "Why did you write this string on such a shitty way?" # And the answer is: "NONE OF YOUR F*****G BUSINESS METADATA = ( "[META]\n" "COLUMNS = {0}\n" "ROWS = {1}\n" "BLANKTILE = {2}\n" "TILESIZE = {3}\n" ).format(c, r, self.blankTile, self.tileSize) with open(fileplace, 'w') as metafile: metafile.write(METADATA) filters = 'TAR (*.tar, *.tar.gz, *.tar.xz, *.tar.bz2)' rawSuffix = self.comprGroup.checkedButton().text() suffix = rawSuffix.split(' ')[1][1:-1] sufParts = suffix.split('.') savefile = QFileDialog().getSaveFileName(filter = filters) if len(sufParts) > 2: openAs = 'w:{0}'.format(sufParts[-1]) else: openAs = 'w' with tarfile.open(savefile[0] + suffix, openAs) as tar: for i in os.listdir(self.tmp_dir): tar.add(os.path.join(self.tmp_dir, i), arcname = i) os.remove(os.path.join(self.tmp_dir, i)) os.removedirs(self.tmp_dir) self.close() def cancel(self): self.close()
class DMSUnitWgt(QWidget): unitTabDataWdg = None decorateTypeWgt: DMSDecorateTypeWgt = None decorateDataWgt: DMSDecorateDataWgt = None currentBuilding: DB_Building = None unitDict: dict = {} def __init__(self, parent=None): super(DMSUnitWgt, self).__init__(parent) self.initUI() self.initTrigger() def initUI(self): self.ui = Ui_UnitWgt() self.ui.setupUi(self) self.ui.verticalLayout.setContentsMargins(0, 0, 0, 0) self.setContentsMargins(0, 0, 0, 0) self.decorateTypeWgt = DMSDecorateTypeWgt(self) self.decorateDataWgt = DMSDecorateDataWgt(self) count = self.ui.verticalLayout.count() self.ui.verticalLayout.addWidget(self.decorateDataWgt) self.groupButton = QButtonGroup(self) def unitChanged(self): # self.decorateDataWgt. pass def initTrigger(self): self.ui.pBtnAddUnit.clicked.connect(self.addUnit) self.ui.pBtnDleleteUnit.clicked.connect(self.deleteUnit) self.groupButton.buttonClicked.connect(self.unitChanged) def setCurrentBuilding(self, building_id): if self.currentBuilding and self.currentBuilding.id == building_id: return self.currentBuilding = None building: DB_Building = dmsDatabase().getRecordById( DB_Building, building_id) if building is None: self.updateUiEnabled() return self.currentBuilding = building self.clearUnit() self.loadUnit() self.updateUiEnabled() def getCurrentUnit(self): pass def addUnit(self): unit = newUnit(self.currentBuilding) unit_tool_btn = self.createToolButton(unit) unit_tool_btn.setChecked(True) def deleteUnit(self): _id = self.groupButton.checkedId() _button = self.groupButton.checkedButton() self.groupButton.removeButton(_button) delete(_button) customDeleteRecord(DB_Building_Unit, _id) self.updateUiEnabled() def createToolButton(self, business_unit) -> QToolButton: if business_unit is None: return unit_tool_btn = QToolButton() unit_tool_btn.setText(business_unit.name) unit_tool_btn.setCheckable(True) count = self.ui.horizontalLayout.count() self.ui.horizontalLayout.insertWidget(count - 3, unit_tool_btn) self.unitDict[business_unit.id] = unit_tool_btn self.groupButton.addButton(unit_tool_btn, business_unit.id) return unit_tool_btn def loadUnit(self): if self.currentBuilding is None: return unit_list = dmsDatabase().getTableList( DB_Building_Unit, "building_id = " + str(self.currentBuilding.id)) if len(unit_list) == 0: return first_item: QToolButton = None for item in unit_list: unit_tool_btn = self.createToolButton(item) if first_item is None: first_item = unit_tool_btn first_item.setChecked(True) def clearUnit(self): if len(self.unitDict) == 0: return tool_btn_list = self.unitDict.values() for var in self.groupButton.buttons(): self.groupButton.removeButton(var) for item in tool_btn_list: self.ui.horizontalLayout.removeWidget(item) delete(item) self.unitDict.clear() def updateUnitDate(self, currentBuildingID, previousBuildingID=None): """ 槽函数 :param currentBuildingID: :param previousBuildingID: :return: """ pass # # Todo 待梳理嵌套关系 # print(currentBuildingID, previousBuildingID) # dateTableWidget = self.unitTabWdg.currentWidget() # dateTableWidget = DMSDecorateDataWgt() # # decorateTaskList: List[DB_Decorate_Type] = dmsProject().getTableList(DB_Decorate_Type, filter_str=currentBuildingID).orderBy( # # DB_Decorate_Type.order) # decorateTaskList: List[DB_Decorate_Type] = dmsDatabase().getTableList(DB_Decorate_Type) # tableHeaderList = [task.name for task in decorateTaskList] # dateTableWidget.setHorizontalHeaderLabels(tableHeaderList) def updateUiEnabled(self): enabled = False if len(self.unitDict) == 0: enabled = False else: enabled = True self.ui.pBtnDleleteUnit.setEnabled(enabled)
class DyStockSelectBBandsStatsDlg(QDialog): def __init__(self, data, parent=None): super(DyStockSelectBBandsStatsDlg, self).__init__(parent) self._data = data self._initUi() self._stocksButtonGroup.buttonClicked.connect(self._radioButtonClicked) def _initUi(self): self.setWindowTitle('股票代码') # 控件 startDateLable = QLabel('开始日期') self._startDateLineEdit = QLineEdit(datetime.now().strftime("%Y-%m-%d")) endDateLable = QLabel('结束日期') self._endDateLineEdit = QLineEdit(datetime.now().strftime("%Y-%m-%d")) # 指数和股票代码 shIndexRadioButton = QRadioButton('上证指数'); shIndexRadioButton.setChecked(True) szIndexRadioButton = QRadioButton('深证成指') cybIndexRadioButton = QRadioButton('创业板指') zxbIndexRadioButton = QRadioButton('中小板指') stockRadioButton = QRadioButton('股票代码') self._stockLineEdit = QLineEdit(); self._stockLineEdit.setEnabled(False) # 添加到QButtonGroup self._stocksButtonGroup = QButtonGroup() self._stocksButtonGroup.addButton(shIndexRadioButton, 1); self._stocksButtonGroup.addButton(szIndexRadioButton, 2) self._stocksButtonGroup.addButton(cybIndexRadioButton, 3) self._stocksButtonGroup.addButton(zxbIndexRadioButton, 4) self._stocksButtonGroup.addButton(stockRadioButton, 5) # 布林周期 bBands1PeriodLabel = QLabel('布林1周期') self._bBands1PeriodLineEdit = QLineEdit('10') bBands2PeriodLabel = QLabel('布林2周期') self._bBands2PeriodLineEdit = QLineEdit('20') cancelPushButton = QPushButton('Cancel') okPushButton = QPushButton('OK') cancelPushButton.clicked.connect(self._cancel) okPushButton.clicked.connect(self._ok) # 布局 grid = QGridLayout() grid.setSpacing(10) grid.addWidget(startDateLable, 0, 0) grid.addWidget(self._startDateLineEdit, 1, 0) grid.addWidget(endDateLable, 0, 1) grid.addWidget(self._endDateLineEdit, 1, 1) grid.addWidget(shIndexRadioButton, 2, 0) grid.addWidget(szIndexRadioButton, 2, 1) grid.addWidget(cybIndexRadioButton, 3, 0) grid.addWidget(zxbIndexRadioButton, 3, 1) grid.addWidget(stockRadioButton, 4, 0) grid.addWidget(self._stockLineEdit, 4, 1) grid.addWidget(bBands1PeriodLabel, 5, 0) grid.addWidget(self._bBands1PeriodLineEdit, 5, 1) grid.addWidget(bBands2PeriodLabel, 6, 0) grid.addWidget(self._bBands2PeriodLineEdit, 6, 1) grid.addWidget(okPushButton, 7, 1) grid.addWidget(cancelPushButton, 7, 0) self.setLayout(grid) def _radioButtonClicked(self, button): if button.text() == '股票代码': self._stockLineEdit.setEnabled(True) else: self._stockLineEdit.setEnabled(False) def _getStockCode(self): checkedButton = self._stocksButtonGroup.checkedButton() text = checkedButton.text() if text == '股票代码': return DyStockCommon.getDyStockCode(self._stockLineEdit.text()) return DyStockCommon.getIndexByName(text) def _ok(self): self._data['startDate'] = self._startDateLineEdit.text() self._data['endDate'] = self._endDateLineEdit.text() self._data['code'] = self._getStockCode() self._data['bBands1Period'] = int(self._bBands1PeriodLineEdit.text()) self._data['bBands2Period'] = int(self._bBands2PeriodLineEdit.text()) self.accept() def _cancel(self): self.reject()