2013-01-11 29 views
4

我有一個我在wxPython中開發的應用程序。部分應用程序在網格中創建大量TextCtrls,以便爲任意大的人員列表輸入一週中每天的四個字母代碼。在wxPython中查找文本大小的正確方法

我已經設法使它工作,但我不得不做一些事情。具體來說,我還沒有找到一個很好的方法來找出有多大(以像素爲單位)一些文本,所以我不得不猜測調整TextCtrls的大小以適合最大的(4個字母)代碼。我擔心的是,如果文本的大小發生變化,或者應用程序被移植到MSW以外的其他地方,那麼我的佈局可能會中斷。

我找到的解決方案是創建一個StaticText對象,用4個大號填充它,得到它的大小,然後.Destroy()它。這工作,但它確實像一個klunky解決方案。有沒有人有更直接的方法來確定在TextCtrl中有多大的任意文本字符串?我查看了文檔,一直沒能找到任何東西,而且我還沒有看到任何正在做我想做的事情的例子。

小代碼示例(示出了試驗方法)如下:

# This creates and then immediately destroys a static text control 
    # in order to learn how big four characters are in the current font. 
    testst = wx.StaticText(self, id = wx.ID_ANY, label = "XXXX") 
    self.fourlettertextsize = testst.GetClientSize() + (4,4) 
    testst.Destroy() 

(該+(4,4)的部分是在所述控制加少許更多的空間以容納和光標一點邊界在TextCtrl的客戶區;這是我不想直接做的另一件事。)

+0

如果這個「klunky」解決方案起作用,那麼wx會錯誤地計算文本度量(或者你根本沒有以一種好的方式進行測試)。我可以用一個不同的字母創建一個更高的文本。根據使用的字體,我可以用不同的字母創建更寬的文本。 – mmgp

回答

10

用臉,尺寸等創建一個wx.Font實例;創建一個wx.DC;然後調用dc.GetTextExtent(「文本字符串」)來獲取顯示該字符串所需的寬度和高度。相應地在網格中設置行高和列寬。

喜歡的東西:

font = wx.Font(...) 
dc = wx.DC() 
dc.SetFont(font) 
w,h = dc.GetTextExtent("test string") 
6

不從Paul McNett's answer帶走,但對於那些不那麼熟悉的wxPython這裏有一個簡單的完整的例子:

import wx 

app = wx.PySimpleApp() 

font = wx.Font(pointSize = 10, family = wx.DEFAULT, 
       style = wx.NORMAL, weight = wx.NORMAL, 
       faceName = 'Consolas') 

dc = wx.ScreenDC() 
dc.SetFont(font) 

text = 'text to test' 

# (width, height) in pixels 
print '%r: %s' % (text, dc.GetTextExtent(text)) 

輸出:'text to test': (84, 15)

+1

對於可能包含換行符(多行文本)的任意字符串,可以使用GetMultilineTextExtent(),它對多行文本和單行文本均有效。 – RufusVS

相關問題