使用 PyQT5 和 Python 的字符串格式化问题 [重复]

Posted

技术标签:

【中文标题】使用 PyQT5 和 Python 的字符串格式化问题 [重复]【英文标题】:Problems with string formatting using PyQT5 and Python [duplicate] 【发布时间】:2019-08-08 16:49:20 【问题描述】:

我想在文本框中很好地格式化一些文本行。我当然想使用字符串格式,但不幸的是出了点问题,我真的不知道在哪里。

这是我的代码,它创建了一个带有文本框和一些“格式化”行的窗口。

import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import * 
from PyQt5.QtCore import pyqtSlot, QSize, QRect

class PrintWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.title='Print something'
        self.left=10
        self.top=10
        self.width=640
        self.height=480
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left,self.top,self.width,self.height)

        self.statusBar().showMessage('In progress')

        # create textbox
        self.textbox = QTextEdit(self)
        self.textbox.move(50, 210)
        self.textbox.resize(540, 200)
        self.textbox.setReadOnly(True)
        # create textbox done

        self.show()

        data = []
        line1 = 'Some text'
        line2 = 50 * '-'
        line3 = ":<10 :<15 :<25 :<25 :<25".format('Number:', 'City:', 'Some info:', 'Person:', 'Date:')
        line4 = ":<10 :<15 :<25 :<25 :<25".format('1', 'Dublin', 'Yes', 'Gabriella Anderson', 'No date')
        line5 = ":<10 :<15 :<25 :<25 :<25".format('2', 'London', 'No', 'Daniel Wozniak', '2019-08-08')
        data.append(line1)
        data.append(line2)
        data.append(line3)
        data.append(line4)
        data.append(line5)
        self.textbox.setText("\n".join(data))

if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = PrintWindow()
    sys.exit(app.exec_())

不幸的是,正如我在上面写的那样,它不起作用,而且窗口看起来也不好看。

更有趣的是,我在普通 Python 终端中尝试了类似的代码。在那里

data = []
line1 = 'Some text'
line2 = 50 * '-'
line3 = ":<10 :<15 :<25 :<25 :<25".format('Number:', 'City:', 'Some info:', 'Person:', 'Date:')
line4 = ":<10 :<15 :<25 :<25 :<25".format('1', 'Dublin', 'Yes', 'Gabriella Anderson', 'No date')
line5 = ":<10 :<15 :<25 :<25 :<25".format('2', 'London', 'No', 'Daniel Wozniak', '2019-08-08')
data.append(line1)
data.append(line2)
data.append(line3)
data.append(line4)
data.append(line5)

for element in data:
    print(element)

现在打印出来的线条很完美,看起来和我预期的一样。

问题出在哪里?我做错了什么?

【问题讨论】:

Qt 字体是等宽字体吗? 我不知道他是否诚实。我怎样才能检查它?我正在使用 macOS Mojave、Python 3.7.2 和 Visual Studio Code。 【参考方案1】:

您在 QTextEdit 小部件中使用的字体/字体不是等宽的。只有当每个字符都具有相同的宽度时,字符才会很好地排列(只有在字体/字体是等宽字体时才会这样做)。字符在终端中排成一行,因为终端默认使用等宽字体/字体。

【讨论】:

谢谢。能否请教一下如何更改字体类型? 我过去玩过这个。只需搜索“QTextEdit 等宽字体”之类的内容,您就会发现大量线程。似乎有一些不同的解决方案(我似乎记得并非所有解决方案都对我有用)。我相信这是因为没有一种单一的跨平台方式可以做到这一点。至少,您可能必须创建一个 QFont 对象,将其强制为等宽字体(或将等宽字体应用于 QFont 对象),然后通过执行 self.textbox 之类的操作将字体对象应用于您的 QTextEdit 小部件。 setFont(font_object).【参考方案2】:

正如其他人所建议的,您需要一个monospaced 字体,其中每个字符的宽度都相同。您接触的大多数字体都是比例字体(例如 Arial、Times、Calibri、Helvetica),其中字符宽度各不相同。

默认情况下,Qt 将为 GUI 使用比例字体。

要更改字体,您可以对大多数小部件使用setFont() 方法。这里我用的是微软字体Consolas,但是Courier、Deja Vu Sans Mono、Liberation Mono、Lucida Console等也可以。

import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import * 
from PyQt5.QtCore import pyqtSlot, QSize, QRect
from PyQt5.QtGui  import QFont

class PrintWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.title='Print something'
        self.left=10
        self.top=10
        self.width=640
        self.height=480
        self.initUI()


    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left,self.top,self.width,self.height)

        self.statusBar().showMessage('In progress')

        # create textbox
        self.textbox = QTextEdit(self)
        self.textbox.move(50, 210)
        self.textbox.resize(540, 200)
        self.textbox.setReadOnly(True)
        # create textbox done

        font = QFont("Consolas", 6)
        # either of the following lines will set the font comment/uncomment
        self.textbox.setFont(font)  # set font ONLY for textbox
        #self.setFont(font)         # set font for entire QMainWindow which
                                    # will propagate to all widgets

        self.show()

        data = []
        line1 = 'Some text'
        line2 = 50 * '-'
        line3 = ":<10 :<15 :<25 :<25 :<25".format('Number:', 'City:', 'Some info:', 'Person:', 'Date:')
        line4 = ":<10 :<15 :<25 :<25 :<25".format('1', 'Dublin', 'Yes', 'Gabriella Anderson', 'No date')
        line5 = ":<10 :<15 :<25 :<25 :<25".format('2', 'London', 'No', 'Daniel Wozniak', '2019-08-08')
        data.append(line1)
        data.append(line2)
        data.append(line3)
        data.append(line4)
        data.append(line5)
        self.textbox.setText("\n".join(data))

if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = PrintWindow()
    sys.exit(app.exec_())

您也可以使用Qt Style Sheets 来设置字体。在这个示例中,我无法让样式表正常工作。但是,如果您使用 Qt Designer 或 Qt Creator 来创建具有漂亮布局的表单,样式表会非常方便。

【讨论】:

以上是关于使用 PyQT5 和 Python 的字符串格式化问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

pyqt5音频播放

PyQt4和PyQt5中的QFileDialog字符串有区别吗?

pyqt5中怎么判断字符串为空

PyQt4 和 PyQt5 中的 QFileDialog 字符串有区别吗?

使用pyqt5将QT的ui文件转化为py文件

如何在 PyQt5 中将字符串数组传递给 dbus? [复制]