在wxPython中查找文本大小的正确方法

时间:2013-01-11 00:42:26

标签: python wxpython size wxtextctrl

我有一个我在wxPython中开发的应用程序。部分应用程序在网格中创建大量TextCtrls,以便为一个任意大的人员列表输入一周中每一天的四个字母代码。

我已经设法让它发挥作用,但我不得不做一些事情。具体来说,我还没有找到一个很好的方法来确定一些文本的大小(以像素为单位),所以我必须猜测TextCtrls的大小以便恰好适合最大的(4个字母)代码。我担心的是,如果文本的大小要改变,或者应用程序移植到MSW以外的其他东西,我的布局可能会破坏。

我找到的解决方案是创建一个StaticText对象,用4个大字母填充它,得到它的大小,然后是.Destroy()它。这可行,但它看起来真的是一个笨重的解决方案。有没有人有更直接的方法来确定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的客户区域中的一个小边框;这是另一件我不想直接做的事情。)

2 个答案:

答案 0 :(得分:11)

使用面,大小等创建一个wx.Font实例;创建一个wx.DC;然后在其上调用dc.GetTextExtent(“文本字符串”)以获取显示该字符串所需的宽度和高度。相应地在网格中设置行高和列宽。

类似的东西:

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

答案 1 :(得分: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)