我有一个应用程序,我正在开发wxPython。应用程序的一部分在网格中创建大量的textctrl,以便为任意大的人员列表输入一周中的每一天的四个字母的代码。
我已经设法使它工作,但我必须做一些笨拙的事情。具体来说,我还没有找到一个好方法来弄清楚一个文本有多大(以像素为单位),所以我不得不猜测textctrl的大小,以便适合最大的(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的客户端区域添加一点边框;这是我不想直接做的另一件事。
创建wx。字体实例,包含脸型、大小等;创建一个wx.DC;那就打给dc。getextextent("一个文本字符串")获取显示该字符串所需的宽度和高度。在网格中相应地设置行高和列宽。
类似:
font = wx.Font(...)
dc = wx.DC()
dc.SetFont(font)
w,h = dc.GetTextExtent("test string")
不是要否定Paul McNett的答案,但是对于那些不熟悉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)