【问题标题】:The right way to find the size of text in wxPython在 wxPython 中查找文本大小的正确方法
【发布时间】:2013-01-11 00:42:26
【问题描述】:

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

我已经设法让它工作了,但我不得不做一些笨拙的事情。具体来说,我还没有找到一个很好的方法来计算一段文本有多大(以像素为单位),所以我必须猜测 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 的客户区域中的小边框;这是另一件我宁愿不直接做的事情.)

【问题讨论】:

  • 如果这个“笨拙”的解决方案有效,那么 wx 错误地计算了文本度量(或者您根本没有以好的方式对其进行测试)。我可以用一个不同的字母创建一个更高的文本。根据使用的字体,我可以使用不同的字母创建更宽的文本。

标签: python wxpython size wxtextctrl


【解决方案1】:

创建一个 wx.Font 实例,包含面、大小等;创建一个wx.DC;然后调用 dc.GetTextExtent("a text string") 以获取显示该字符串所需的宽度和高度。相应地在网格中设置行高和列宽。

类似:

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

【讨论】:

  • 通用 wx.DC() 不再被允许。只允许使用子类,例如 wx.ScreenDC()。所以改用它。
【解决方案2】:

不要拿走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)

【讨论】:

  • 对于可能包含换行符(多行文本)的任意字符串,您可以使用 GetMultilineTextExtent(),它对多行文本和单行文本都有效。
猜你喜欢
  • 1970-01-01
  • 2015-03-08
  • 2014-10-21
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多