[英]How can I write exponents in a PySide QLabel?
我正在为计算程序编写Qt接口,我想以单位为单位写一个区域(即LaTex输出m^2
或m²)。
如果我在此代码中使用特殊的²字符: area_label = QtGui.QLabel("m²")
,它将在GUI中显示以下内容: m²
。
我怀疑这可能是编码问题,写我要寻找的平方指数的方法是什么?
另一个问题:是否有一种方法可以输出任何未定义为特殊字符的指数(例如m^8
)?
附加信息:我正在使用PySide 1.1.1和Qt 4.7.4开发python 2.7.2。 在Windows 7 SP1中工作,但是我希望我的代码尽可能跨平台。
另外,当我在Windows上工作并且使用法语口音(例如à
和é
)时,我在文件开头使用了以下编码行: # -*-coding:Latin-1 -*
。
您的编码问题似乎是您传递的是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
,包括在PySide的接口上使用unicode
,那应该没问题。
有没有一种方法可以输出任何指数,任何没有定义为特殊字符的指数(例如m ^ 8)?
好吧,⁸(U + 2078) 被定义为特殊字符,这一点证明了我能够在此处键入的事实。
但是,您将必须编写自己的代码来解析表达式并生成正确的上标字符。
U + 2070至U + 209F中的上标和下标块具有您需要的所有字符,但2和3除外,它们保留在U + 00B2和U + 00B3上与Latin-1兼容的位置。 (某些字体会将U + 2072和U + 2073显示为等效字符,但是这些字体不正确,因此您不应该依赖于此。而且,U + 2071和U + 00B9都显示为1,有些字体可以区分您可能需要打印出整个列表,然后查看哪些列表更适合您。)
将每个数字变成上标的函数如下所示:
def superscript(digit):
if digit in (2, 3):
return unichr(0x00B0 + digit)
else:
return unichr(0x2070 + digit)
因此,一个非常简单的包装将是:
def term(base, exponent):
return base + u''.join(superscript(int(digit)) for digit in exponent)
现在:
>>> print term('x', '123')
xⁱ²³
但是,如果您想要更灵活的东西,则可能要生成HTML而不是纯文本。 Qt的最新版本可以直接在QLabel
使用HTML。
如果可以从表达式中生成MathML,Latex等,则有一些工具可以从这些格式中生成HTML。
但举一个非常简单的例子:
def term(base, exponent):
return u'{}<sup>{}</sup>'.format(base, exponent)
打印出来时,它只会显示x<sup>123</sup>
,但是当卡在QLabel
(或堆栈溢出答案)中时,它将显示为x 123 。
我使用以下编码行:
# -*-coding:Latin-1 -*
。
为什么? 如果您完全可以使用UTF-8编辑文本文件,那将使您的生活变得更加轻松。 一方面,Latin-1没有任何上标字符,但是1、2和3,这意味着您将不得不编写u'm\\2074'
类的东西,而不仅仅是写u'm⁴'
另外,使用几乎(但不是完全)emacs格式的编码声明也有误导性。 可以使用emacs格式(带有最终的连字符和适当的间距):
# -*- coding: Latin-1 -*-
……或者不:
# coding=Latin-1
无论如何,所有编码行所做的就是告诉Python如何解释字符串文字。 如果创建非unicode
文字(不带u
前缀),则仍然必须在某些时候对其进行decode
。 而且,如果您不自己进行解码,PySide将不得不猜测,并且它将猜测您的系统编码(可能是cp1252-上标足够接近Latin-1,但还不够接近UTF-8 )。
因此,要解决所有问题:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.