【问题标题】:How do I modify the width of a TextCtrl in wxPython?如何在 wxPython 中修改 TextCtrl 的宽度?
【发布时间】:2012-12-27 17:29:13
【问题描述】:

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

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与问题无关。

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

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

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

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


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

    【讨论】:

    • @tom10:我的问题是关于修改文本控件的宽度,而不是在构造函数中传递大小。
    • txt.SetSize((300,-1)) 会发生什么?
    • @PaulMcNett:没什么。文本控件保持其默认大小。
    • 因为在构造函数中设置了since也设置了最小尺寸,并且是sizers优先考虑的最小尺寸。如果您正在使用 sizer 并且想要将大小更改为显式大小,那么最简单的方法是使用 SetMinSize 后跟一个 sizer.Layout()
    • 我认为最近在 2.9.5 中添加了用于尊重 sizer 中项目最大尺寸的代码
    【解决方案2】:

    您应该让 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 布局需要大量繁重的工作。

    【讨论】:

    • +1 我正在使用 sizers 进行布局,但我希望我的文本控件具有特定的宽度,并且我希望对话框与控件所需的一样大,而不是相反。不过感谢您的回答。
    • 在这种情况下,您确实想明确设置宽度但将高度保留为默认值,我知道这样做的方式是您最初的发现 (SetSize((desired_width, -1)))。
    • 但我的问题表明SetSize 对大小没有影响
    猜你喜欢
    • 2010-09-25
    • 2011-10-28
    • 2015-11-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多