如何在PySide QLabel中编写指数?

时间:2013-06-18 19:00:56

标签: python qt pyside

我正在为计算程序编写一个Qt接口,我想用单位写一个区域(即LaTex输出m^2或m2。)

如果我在此代码中使用特殊的²字符:area_label = QtGui.QLabel("m²"),它将在GUI中显示以下内容:m²

我怀疑这可能是一个编码问题,编写我正在寻找的平方指数的方法是什么?

其他问题:有没有办法输出任何指数,任何未定义为特殊字符的人(比如说m^8)?

其他信息: 我正在使用python 2.7.2,PySide版本1.1.1和Qt 4.7.4。在Windows 7,SP1中工作,但我希望我的代码在可能的情况下是跨平台的。

此外,由于我正在使用Windows并且使用法语口音(例如àé),我在文件的开头使用此编码行:{{1} }。

1 个答案:

答案 0 :(得分:3)

您的编码问题似乎是您正在传递UTF-8字符串,PySide / Qt正在尝试根据您的系统编码来解释,这与Latin-1兼容(如cp1252,传统Windows默认为西方)欧洲语言而不是UTF-8。你可以很容易地看到这个:

>>> print u'm\u00b2'.encode('utf-8').decode('latin-1')
m²

PySide可以在任何地方使用unicode个字符串。所以,如果您只是在unicode处使用str而不是bytes / def superscript(digit): if digit in (2, 3): return unichr(0x00B0 + digit) else: return unichr(0x2070 + digit) ,包括在PySide的接口处,那么您应该没问题。


  

有没有办法输出任何指数,任何一个未定义为特殊字符的指数(比如m ^ 8)?

好吧,⁸(U + 2078) 被定义为一个特殊字符,这可以通过我在这里输入来证明。

但是,您必须编写自己的代码来解析表达式并生成正确的上标字符。

U + 2070到U + 209F的上标和下标块具有您需要的所有字符,除了2和3之外,它们在U + 00B2和U + 00B3处保留在它们的Latin-1兼容位置。 (某些字体会将U + 2072和U + 2073显示为等效字符,但这些字体不正确,所以你不应该依赖它。另外,1显示为U + 2071和U + 00B9,并且有些字体区分你可能想要打印整个列表,看看哪些看起来更适合你。)

将每个数字转换成上标的功能如下所示:

def term(base, exponent):
    return base + u''.join(superscript(int(digit)) for digit in exponent)

所以,一个非常简单的包装器将是:

>>> print term('x', '123')
xⁱ²³

现在:

QLabel

但是,如果你想要更灵活的东西,你可能想要生成HTML而不是纯文本。 Qt的最新版本可以直接在def term(base, exponent): return u'{}<sup>{}</sup>'.format(base, exponent) 中使用HTML。

如果您可以从表达式生成MathML,Latex等,那么有些工具可以从这些格式生成HTML。

但是对于一个非常微不足道的例子:

x<sup>123</sup>

打印出来时,这只显示QLabel,但当卡在# -*-coding:Latin-1 -*(或Stack Overflow答案)时,显示为x 123


  

我使用此编码行:u'm\2074'

为什么呢?如果您可以编辑UTF-8中的文本文件,那将使您的生活更轻松。首先,Latin-1没有任何上标的字符,只有1,2和3,这意味着您必须编写u'm⁴'之类的内容,而不仅仅是写# -*- coding: Latin-1 -*-

此外,使用几乎(但不完全是)emacs格式的编码声明有点误导。使用emacs格式(使用最后的连字符和适当的间距):

# coding=Latin-1

......或不要:

unicode

无论如何,所有的编码行都是告诉Python如何解释你的字符串文字。如果您创建非u文字(没有decode前缀),则在某些时候仍然需要{{1}}。并且,如果你不自己做解码,PySide将不得不猜测,它会猜测你的系统编码(这可能是cp1252-对于上标而言足够接近Latin-1,但是不够接近UTF-8 )。

所以,要解决你所有的问题:

  • 如果可能,请使用UTF-8编码。
  • 如果您不能使用UTF-8编码,请使用显式Unicode转义符或动态生成字符串来处理文字中缺少Latin-1字符。
  • 将所有文字设为Unicode。
  • 在代码中尽可能使用Unicode字符串。
  • 如果您确实需要任何字节字符串,请显式编码/解码它们,而不是让Python / PySide / Qt为您猜测。