5

我正在尝试创建一个具有默认高度但自定义宽度的文本控件。这是我当前的代码:

tc = wx.TextCtrl(self, -1)
tc.Size.SetWidth(300)

文本控件的宽度保持不变。我也尝试tc.Layout()在更改宽度后调用但没有结果。我不想在类构造函数中输入自定义大小,因为我希望它使用默认高度。我也尝试过更详细,以防tc.GetSize返回对象的深层副本Size

tc = wx.TextCtrl(self, -1, size=(300, 23))

tc_size = tc.Size
tc_size.SetWidth(300)

tc.Size = tc_size
tc.Layout()

也无济于事。为什么我的代码不工作,我该如何让它工作?


在构造函数中设置大小是可行的,因此大小与问题无关。

4

2 回答 2

12

我刚刚注意到我可以(300, -1)作为文本控件的大小传递:

wx.TextCtrl(self, -1, size=(300, -1))

这导致文本控件使用默认高度。这解决了我的问题,但从技术上讲并不能回答我的问题,所以我坚持要一个更好的答案。


编辑:这个答案加上下面的评论回答了我的问题。

于 2013-01-13T18:43:43.357 回答
4

您应该让 sizers 控制控件的大小,而不是显式设置它们。

import wx

class Frm(wx.Frame):
   def __init__(self, *args, **kwargs):
      super(Frm, self).__init__(*args, **kwargs)
      txt = wx.TextCtrl(self)
      s = wx.BoxSizer(wx.HORIZONTAL)
      s.Add(txt, 1)
      self.SetSizer(s)
      self.Layout()


app = wx.PySimpleApp()
frame = Frm(None)
frame.Show()
app.MainLoop()

这可以让控件在您的代码的一般指导下相对于彼此进行布局。因此,例如,在 Mac 和 Windows 上运行相同的代码,仍然应该会产生一个不错的布局。

我意识到这并不能直接回答您的问题,而是想将您推向 sizers,以防您不知道它们。编写和维护你的 UI 布局需要大量的苦差事。

于 2013-01-13T19:51:54.693 回答