簡體   English   中英

如何在PySide QLabel中編寫指數?

[英]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 )。

因此,要解決所有問題:

  • 如果可能,請使用UTF-8編碼。
  • 如果無法使用UTF-8編碼,請使用顯式Unicode轉義或動態生成字符串來處理文字中缺少的Latin-1字符。
  • 使所有文字都變為Unicode。
  • 在代碼中盡可能使用Unicode字符串。
  • 如果您確實需要在任何地方使用字節字符串,請對其進行顯式編碼/解碼,而不要讓Python / PySide / Qt為您猜測。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM