有没有一种直接的方法可以通过字符而不是像素来设置 wx.TextCtrl 大小?

Is there a direct way to set wx.TextCtrl size by characters rather than pixels?

wx.TextCtrl 的构造函数采用 wx.Size 参数,以像素为单位。通常,我不想以像素为单位指定多行 TextCtrl 的大小,而是指定它可以在不滚动的情况下显示多少个字符。我发现多行 TextCtrl 通常是我 windows 中的主要组成部分,因此不能使用 Sizer 进行拉伸。

wxPython Phoenix 文档 contains a hint 关于如何执行此操作,但是这更适用于单行控件上的短文本。

我已经开始使用这个实用方法:

def _set_textctrl_size_by_chars(self, tc, w, h):
    sz = tc.GetTextExtent('X')
    sz = wx.Size(sz.x * w, sz.y * h)
    tc.SetInitialSize(tc.GetSizeFromTextSize(sz))

连同这样的代码:

tc = wx.TextCtrl(self, style=wx.TE_MULTILINE)
self._set_textctrl_size_by_chars(tc, 80, 20)

这行得通,但我认为它是 hack。我查看了文档,但没有找到任何其他方法。

我知道字体通常不是等宽的,并且使用 'X' 作为代表字符宽度是不准确的,但是对于我的使用来说已经足够好了。不过,似乎应该有一些方法可以直接使用 wx 库来完成此操作。

使用 text.GetSizeFromTextSize(text.GetTextExtent("99999").x) 之类的东西确实是调整文本控件大小以恰好适合 5 位数字(例如某些地区的邮政编码)的最佳方式。请注意,这比您的代码稍好一些,因为 80 "X"s 的宽度不一定与单个 "X" 宽度的 80 倍完全相同。而且我还建议使用 "M" 或 "W",这在某些字体中可能明显比 "X" 宽,但这不会改变很多问题。

我们考虑过添加一个辅助方法来执行此操作,它可能确实有用,但是,同样,这仍然不会让事情变得像您想要的那样简单,因为您确实需要指定您想要的字符使用:"W" 表示字母,“9”表示数字,如果您希望控件足够宽以平均容纳给定的字符数而不是足够宽以保证适合,则可以使用 "x" 之类的东西给定数量的最宽字符,因为差异可能很明显。

我们可以让生活更简单的主要地方是在 XRC 级别,这是值得做的("just" 时间问题...),但对于代码,我真的不认为我们可以让事情变得比现在简单得多。