class KwFontDataChoicer(QWidget): u''' @version: 0.1.1 ''' fontChanged = pyqtSignal(str, name='fontChanged') font_sizeChanged = pyqtSignal(int, name='font_sizeChanged') def __init__(self, font='', size=10, *args, **kwargs): super(KwFontDataChoicer, self).__init__(*args, **kwargs) self.__fontChoice = QFontComboBox(self) self.__fontChoice.setCurrentFont(QFont(font)) #.setCurrentText(font) self.__fontChoice.currentIndexChanged[str].connect( self.fontChanged.emit) self.__font_sizeEdit = QSpinBox(self) self.__font_sizeEdit.setRange(5, 72) self.__font_sizeEdit.setValue(size) self.__font_sizeEdit.valueChanged[int].connect( self.font_sizeChanged.emit) layout = QHBoxLayout(self) layout.setSpacing(5) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.__fontChoice, 1) layout.addWidget(self.__font_sizeEdit, 0) @property def font_data(self): return self.__fontChoice.currentText(), self.__font_sizeEdit.value() @font_data.setter def font_data(self, font, size): self.__fontChoice.setCurrentText(font) self.__font_sizeEdit.setValue(size) @property def font(self): return self.__fontChoice.currentText() @font.setter def font(self, font): self.__fontChoice.setCurrentText(font) @property def size(self): return self.__font_sizeEdit.value() @size.setter def size(self, size): return self.__font_sizeEdit.setValue(size)
class WritingModeRLDocker(DockWidget): def __init__(self): super().__init__() self.setWindowTitle("Create Vertical Writing") mainWidget = QWidget(self) self.setWidget(mainWidget) convertButtons = QWidget(mainWidget) buttonCopyToClipboard = QPushButton("Copy to Clipboard", convertButtons) buttonCopyToClipboard.clicked.connect(self.copyToClipboard) buttonOutputSVG = QPushButton("Output SVG", convertButtons) buttonOutputSVG.clicked.connect(self.outputSVG) buttonBoth = QPushButton("Both", convertButtons) buttonBoth.clicked.connect(self.both) convertTextLabels = QWidget(mainWidget) inputTextLabel = QLabel("Input Text", convertTextLabels) outputTextLabel = QLabel("Output SVG", convertTextLabels) convertTexts = QWidget(mainWidget) self.inputText = QPlainTextEdit(convertTexts) self.outputText = QPlainTextEdit( "text converted by \"Output SVG\" from left input textarea", convertTexts) self.outputText.setReadOnly(True) fontNames = QWidget(mainWidget) fontSelectorLabel = QLabel("font family", fontNames) self.fontSelector = QFontComboBox(fontNames) fontOptionDatas = QWidget(mainWidget) fontColorParts = QWidget(mainWidget) fontColorParts.setLayout(QHBoxLayout()) fontColorLabel = QLabel("font color", fontColorParts) self.fontColorButton = QPushButton("■", fontColorParts) self.fontColorButton.clicked.connect(self.openTextColorDialog) self.fontColorDialog = QColorDialog(mainWidget) self.fontColorDialog.colorSelected.connect(self.selectedColor) self.fontColorCombo = QComboBox(fontOptionDatas) self.fontColorCombo.setEditable(True) self.fontColorCombo.addItems([ "#000000", "#7f7f7f", "#ffffff", "#ff0000", "#ffff00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff" ]) self.fontColorCombo.editTextChanged.connect(self.colorChanged) self.colorChanged(self.fontColorCombo.currentText()) fontColorParts.layout().addWidget(fontColorLabel) fontColorParts.layout().addWidget(self.fontColorButton) fontSizeLabel = QLabel("font size(pt)", fontOptionDatas) self.fontSizeCombo = QComboBox(fontOptionDatas) self.fontSizeCombo.setEditable(True) self.fontSizeCombo.addItems([ "6", "7", "8", "9", "10", "11", "12", "14", "16", "18", "20", "22", "24", "26", "28", "36", "48", "72" ]) self.fontSizeCombo.setEditText("8") fontNames.setLayout(QHBoxLayout()) fontNames.layout().addWidget(fontSelectorLabel) fontNames.layout().addWidget(self.fontSelector) fontOptionDatas.setLayout(QHBoxLayout()) fontOptionDatas.layout().addWidget(fontColorParts) fontOptionDatas.layout().addWidget(self.fontColorCombo) fontOptionDatas.layout().addWidget(fontSizeLabel) fontOptionDatas.layout().addWidget(self.fontSizeCombo) convertTextLabels.setLayout(QHBoxLayout()) convertTextLabels.layout().addWidget(inputTextLabel) convertTextLabels.layout().addWidget(outputTextLabel) convertTexts.setLayout(QHBoxLayout()) convertTexts.layout().addWidget(self.inputText) convertTexts.layout().addWidget(self.outputText) convertButtons.setLayout(QHBoxLayout()) convertButtons.layout().addWidget(buttonOutputSVG) convertButtons.layout().addWidget(buttonCopyToClipboard) convertButtons.layout().addWidget(buttonBoth) mainWidget.setLayout(QVBoxLayout()) mainWidget.layout().addWidget(fontNames) mainWidget.layout().addWidget(fontOptionDatas) mainWidget.layout().addWidget(convertButtons) mainWidget.layout().addWidget(convertTextLabels) mainWidget.layout().addWidget(convertTexts) def canvasChanged(self, canvas): pass def openTextColorDialog(self): self.fontColorDialog.open() def selectedColor(self, color): self.fontColorCombo.setEditText(color.name()) def colorChanged(self, text): self.fontColorButton.setStyleSheet("color:" + text + ";") def both(self): self.outputSVG() self.copyToClipboard() def copyToClipboard(self): ccText = self.outputText.toPlainText() QApplication.clipboard().setText(ccText) def outputSVG(self): putText = self.__transSVG(self.inputText.toPlainText()) self.outputText.setPlainText(putText) def __transSVG(self, originText): beforeText = copy.deepcopy(originText) width = len(beforeText.split("\n")) editingText = "" outChars = list(beforeText) y = 0 x = (width - 1) * 1.2 for part in outChars: if part == "\n": y = 0 x -= 1.2 else: editedTextX = DefineLocate.getEditedX( part, self.fontSizeCombo.currentText()) editedTextY = DefineLocate.getEditedY( part, self.fontSizeCombo.currentText()) resultX = x + editedTextX resultY = y + editedTextY editingText = editingText + " <tspan x=\"" + \ str(resultX) + "em\" y=\"" + str(resultY) + "em\">" + \ html.escape(part) + "</tspan>\n" y += 1.2 outText = "<text style=\"font-family:" + \ self.fontSelector.currentText() + \ ";font-size:"+self.fontSizeCombo.currentText() + \ ";fill:" + self.fontColorCombo.currentText() + "\">\n" + \ editingText + "</text>" return outText
def create_ui(self): # 1.文字标签 # QLabel(显示的文字, 父标签/放到哪个窗口上) label1 = QLabel('用户名:', self) # 一般不常用的移动坐标 label1.move(50, 10) # 2.按钮 btn1 = QPushButton('登录', self) btn1.move(50, 50) # css语法:选择器{属性1:属性值1; 属性2:属性值2;..} # color - 字体颜色,对应的值:颜色单词, rbg(255, 0, 0) # btn1.setStyleSheet('QPushButton{}') btn2 = QRadioButton('男', self) btn2.move(50, 100) btn3 = QCheckBox('篮球', self) btn3.move(50, 150) btn4 = QCommandLinkButton('hello', 'hellowword', self) btn4.move(50, 200) b1 = QDialogButtonBox.StandardButton.Ok b2 = QDialogButtonBox.StandardButton.Cancel btn5 = QDialogButtonBox(b2, self) btn5.move(50, 300) # 3.输入框 input1 = QLineEdit(self) input1.move(150, 10) input2 = QLineEdit('admin', self) input2.move(150, 50) input1.setText('张三') # 富文本 input3 = QTextEdit('张三', self) input3.move(50, 300) # 设置成只读 input3.setReadOnly(True) # 只能显示纯文本 input4 = QPlainTextEdit(self) input4.move(300, 10) # 输入数值 input5 = QSpinBox(self) input5.move(100, 100) input5.setMinimum(10) input5.setMaximum(20) input5.setValue(15) print(input5.value()) # 获取当前值 # 输入小数 input6 = QDoubleSpinBox(self) input6.move(100, 150) # 下拉菜单 input7 = QComboBox(self) input7.addItems(['item1', 'item2']) input7.move(150, 200) print(input7.currentText()) # 获取当前选中的选项,适用input8 input8 = QFontComboBox(self) input8.move(350, 300) input8.setCurrentIndex(2) print(input8.currentText()) label1.setFont(input8.currentFont()) # 日期选择 input9 = QDateEdit(date.today(), self) input9.move(300, 400) # 选择颜色 input10 = QColorDialog(self) input10.move(400, 400) # input10.show() input11 = QDial(self) input11.move(300, 200) input12 = QSlider(self) input12.move(430, 350) input12.setMaximum(100) input12.setMinimum(-100) input12.setValue(20) input12.setOrientation(Qt.Horizontal) # 设置为水平方向
class SettingsDialog(QDialog): def __init__(self, settings: Settings): super(SettingsDialog, self).__init__() self.settings = settings self.setWindowTitle("Sticky Note - Settings") self.layout = QFormLayout() self.fontSizeBox = QComboBox(self) for i in settings.getAllFontSizes(): self.fontSizeBox.addItem(str(i)) self.fontSizeBox.setCurrentText(str(settings.getFontSize())) self.layout.addRow("Font size", self.fontSizeBox) self.fontSizeBox.currentIndexChanged.connect(self.fontSizeChanged) self.fontFamilyBox = QFontComboBox(self) self.layout.addRow("Font Family", self.fontFamilyBox) self.fontFamilyBox.setCurrentFont(QFont(settings.getFontFamily())) self.fontFamilyBox.currentIndexChanged.connect(self.fontFamilyChanged) self.colorButton = QPushButton('', self) color = QColor(settings.getFontColor()) self.fontColorChanged(color) self.colorButton.clicked.connect(self.showColors) self.layout.addRow("Font Color", self.colorButton) isAutoStartCheckBox = QCheckBox("Enable start on startup", self) #self.layout.addRow("", isAutoStartCheckBox) isAutoStartCheckBox.stateChanged.connect(self.actionEnableAutoStart) isAutoStartCheckBox.setChecked(settings.getStartOnStartup()) QBtn = QDialogButtonBox.Ok | QDialogButtonBox.Cancel self.buttonBox = QDialogButtonBox(QBtn) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) self.layout.addRow(self.buttonBox) self.setLayout(self.layout) self.setWindowFlags(Qt.Window) self.setFixedSize(350, 150) def fontColorChanged(self, color): if (color.isValid()): self.colorButton.setStyleSheet( "background-color: {0};border-color: {0}".format(color.name())) self.settings.setFontColor(color.name()) def showColors(self): colorDialog = QColorDialog() color = colorDialog.getColor() if color: self.fontColorChanged(color) def fontSizeChanged(self): fontSize = str(self.fontSizeBox.currentText()) self.settings.setFontSize(fontSize) def fontFamilyChanged(self): fontFamily = str(self.fontFamilyBox.currentText()) self.settings.setFontFamily(fontFamily) def accept(self): ConfigParser.config_instance.saveSettings(self.settings) self.done(0) StickyNoteManager.sticky_note_manager_instance.updateSettings() def reject(self): self.done(0) def actionEnableAutoStart(self, res): self.settings.setStartOnStartup(bool(res))
class project: projectName = "" paratextFolder = "" audioFolderName = "" textFont = "" textSize = 0 fileType = "" bBook = False currentBook = 1 currentChapter = 1 def project(self): pass def readProject(self, currentProject): try: print("Reading project " + currentProject) refMatcher = re.compile("^CurrentReference=([^ ]+) (\\d+)$") for line in open(currentProject + '.prj'): line = line.strip() mtch = refMatcher.match(line) if mtch: self.currentBook = mtch.group(1) # bk = mtch.group(1) # for i, b in enumerate(data.data.book): # if b.equals(bk): # self.currentBook = i # break self.currentChapter = mtch.group(2) elif line.startswith("ProjectName="): self.projectName = line[len("ProjectName="):] elif line.startswith("VersionName="): self.projectName = line[len("VersionName="):] elif line.startswith("ParatextFolder="): self.paratextFolder = line[len("ParatextFolder="):] elif line.startswith("SoundFolder="): self.audioFolderName = line[len("SoundFolder="):] elif line.startswith("AudioFolder="): self.audioFolderName = line[len("AudioFolder="):] elif line.startswith("Font="): self.textFont = line[len("Font="):] elif line.startswith("FontSize="): self.textSize = int(line[len("FontSize=")]) elif line.startswith("FileType="): self.fileType = line[len("FileType="):] self.bBook = self.fileType == "Book" else: print("Unknown project option: ", line) except FileNotFoundError: print("Failed to open project file") self.writeProject(currentProject) pass except Exception as detail: print("Exception reading project file: ", detail) pass def writeProject(self, currentProject): print("Writing project file") try: fh = open(currentProject + ".prj", "w+") fh.write("CurrentReference=" + self.currentBook + " " + str(self.currentChapter) + "\n") fh.write("ProjectName=" + self.projectName + "\n") fh.write("ParatextFolder=" + self.paratextFolder + "\n") fh.write("AudioFolder=" + self.audioFolderName + "\n") fh.write("Font=" + self.textFont + "\n") fh.write("FontSize=" + str(self.textSize) + "\n") fh.write("FileType=" + self.fileType + "\n") fh.close() except Exception as detail: print("IOException writing project file: ", detail) pass # class Ui_Dialog(object): def setupUi(self, Dialog, proj, newProject): try: self.dialog = Dialog self.proj = proj Dialog.setObjectName("Dialog") Dialog.resize(400, 357) self.buttonBox = QDialogButtonBox(Dialog) self.buttonBox.setGeometry(QRect(30, 310, 341, 32)) self.buttonBox.setOrientation(Qt.Horizontal) self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") self.groupBox = QGroupBox(Dialog) self.groupBox.setGeometry(QRect(10, 0, 381, 61)) self.groupBox.setObjectName("groupBox") self.lineEditProjectName = QLineEdit(self.groupBox) self.lineEditProjectName.setGeometry(QRect(10, 30, 361, 23)) self.lineEditProjectName.setObjectName("lineEditProjectName") self.groupBox_2 = QGroupBox(Dialog) self.groupBox_2.setGeometry(QRect(10, 60, 381, 61)) self.groupBox_2.setObjectName("groupBox_2") self.comboBoxProjectType = QComboBox(self.groupBox_2) self.comboBoxProjectType.setGeometry(QRect(10, 30, 361, 23)) self.comboBoxProjectType.setObjectName("comboBoxProjectType") self.groupBox_3 = QGroupBox(Dialog) self.groupBox_3.setGeometry(QRect(10, 120, 381, 61)) self.groupBox_3.setObjectName("groupBox_3") self.lineEditSourcePath = QLineEdit(self.groupBox_3) self.lineEditSourcePath.setGeometry(QRect(10, 30, 271, 23)) self.lineEditSourcePath.setObjectName("lineEditSourcePath") self.pushButtonBrowseSource = QPushButton(self.groupBox_3) self.pushButtonBrowseSource.setGeometry(QRect(290, 30, 80, 23)) self.pushButtonBrowseSource.setObjectName("pushButtonBrowseSource") self.groupBox_4 = QGroupBox(Dialog) self.groupBox_4.setGeometry(QRect(10, 180, 381, 61)) self.groupBox_4.setObjectName("groupBox_4") self.pushButtonBrowseAudio = QPushButton(self.groupBox_4) self.pushButtonBrowseAudio.setGeometry(QRect(290, 30, 80, 23)) self.pushButtonBrowseAudio.setObjectName("pushButtonBrowseAudio") self.lineEditAudioFilesPath = QLineEdit(self.groupBox_4) self.lineEditAudioFilesPath.setGeometry(QRect(10, 30, 271, 23)) self.lineEditAudioFilesPath.setObjectName("lineEditAudioFilesPath") self.groupBox_5 = QGroupBox(Dialog) self.groupBox_5.setGeometry(QRect(10, 240, 381, 61)) self.groupBox_5.setObjectName("groupBox_5") self.comboBoxFont = QFontComboBox(self.groupBox_5) self.comboBoxFont.setGeometry(QRect(10, 30, 271, 23)) self.comboBoxFont.setObjectName("comboBoxFont") self.lineEditFontSize = QLineEdit(self.groupBox_5) self.lineEditFontSize.setGeometry(QRect(290, 30, 81, 23)) self.lineEditFontSize.setObjectName("lineEditFontSize") # set up fields if newProject: self.projectName = "" self.paratextFolder = "c:\\My Paratext 8 Projects" self.textFont = "Times New Roman" self.textSize = 25 self.fileType = "Paratext" typeList = ("Paratext", "Book", "BART") # self.comboBoxProjectType.clear() for index, i in enumerate(typeList): self.comboBoxProjectType.addItem(i) index = self.comboBoxProjectType.findText(self.fileType, Qt.MatchFixedString) if index >= 0: self.comboBoxProjectType.setCurrentIndex(index) self.lineEditProjectName.setText(self.projectName) self.lineEditSourcePath.setText(self.paratextFolder) self.lineEditAudioFilesPath.setText(self.audioFolderName) index = self.comboBoxFont.findText(self.textFont, Qt.MatchFixedString) if index >= 0: self.comboBoxFont.setCurrentIndex(index) self.lineEditFontSize.setText(str(self.textSize)) self.retranslateUi(Dialog) self.pushButtonBrowseSource.clicked.connect(self.browse_source) self.pushButtonBrowseAudio.clicked.connect(self.browse_audio_path) self.lineEditProjectName.textChanged.connect( self.lineEditProjectName_changed) self.comboBoxProjectType.currentTextChanged.connect( self.comboBoxProjectType_changed) self.comboBoxFont.currentTextChanged.connect( self.comboBoxFont_changed) self.lineEditFontSize.textChanged.connect( self.lineEditFontSize_changed) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) QMetaObject.connectSlotsByName(Dialog) except Exception as detail: print("Exception: " + detail) def retranslateUi(self, Dialog): _translate = QCoreApplication.translate Dialog.setWindowTitle(_translate("Dialog", "Dialog")) self.groupBox.setTitle(_translate("Dialog", "Project name")) self.groupBox_2.setTitle(_translate("Dialog", "Type")) self.groupBox_3.setTitle(_translate("Dialog", "Source")) self.pushButtonBrowseSource.setText(_translate("Dialog", "Browse...")) self.groupBox_4.setTitle(_translate("Dialog", "Audio files folder")) self.pushButtonBrowseAudio.setText(_translate("Dialog", "Browse...")) self.groupBox_5.setTitle(_translate("Dialog", "Font")) def accept(self): self.writeProject(self.projectName) print("Saved project " + self.projectName) self.dialog.close() def reject(self): print("Cancel") self.dialog.close() def comboBoxProjectType_changed(self): self.fileType = self.comboBoxProjectType.currentText() # print("Changing project type to " + self.fileType) self.bBook = True if self.fileType == "Paratext": self.paratextFolder = "c:\\Paratext\\My Paratext 8 Projects\\" + self.lineEditProjectName.text( ) self.bBook = False elif self.fileType == "Book": self.paratextFolder = "" else: self.paratextFolder = "" self.lineEditSourcePath.setText(self.paratextFolder) def lineEditProjectName_changed(self): self.comboBoxProjectType_changed() self.lineEditSourcePath.setText(self.paratextFolder) self.projectName = self.lineEditProjectName.text() def comboBoxFont_changed(self): self.textFont = self.comboBoxFont.currentText() def lineEditFontSize_changed(self): self.textSize = int(self.lineEditFontSize.text()) def browse_source(self): try: my_dir = QFileDialog.getExistingDirectory(self.dialog, "Open a folder", self.paratextFolder, QFileDialog.ShowDirsOnly) if my_dir: self.paratextFolder = my_dir self.lineEditSourcePath.setText(self.paratextFolder) # except TypeError as detail: # print (detail) except Exception: print("Failed choose Paratext folder: ") # + detail) def browse_audio_path(self): try: my_dir = QFileDialog.getExistingDirectory(self.dialog, "Open a folder", self.audioFolderName, QFileDialog.ShowDirsOnly) if my_dir: self.audioFolderName = my_dir self.lineEditAudioFilesPath.setText(self.audioFolderName) # except TypeError as detail: # print (detail) except Exception: print("Failed choose audio folder: ") # + detail)