我正在尝试创建一个具有默认高度但是自定义宽度的文本控件。这是我目前的代码:
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()
也无济于事。为什么我的代码不起作用,如何使其工作?
在构造函数中设置大小有效,因此sizer与问题无关。
答案 0 :(得分:9)
我刚注意到我可以将(300, -1)
作为文本控件的大小传递:
wx.TextCtrl(self, -1, size=(300, -1))
这导致文本控件使用默认高度。这解决了我的问题,但技术上没有回答我的问题,所以我想要一个更好的答案。
编辑:这个答案加上以下评论回答了我的问题。
答案 1 :(得分:4)
您应该让sizer控制控件的大小,而不是显式设置它们。
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上运行相同的代码仍然会产生一个很好的布局。
我意识到这并没有直接回答你的问题,而是想在你不了解它们的情况下轻推你们。编写和维护UI布局需要花费大量的苦差事。