[英]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.