动态更改wx.TextCtrl的大小

时间:2018-06-06 11:39:05

标签: python resize wxpython textctrl wx.textctrl

我遇到了wx.TextCtrl的问题。我只是想设置控制盒的大小,但我想动态地做。这无论出于何种原因都无效。

这里有我的源代码。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wx

class Test(wx.Frame):

def __init__(self, parent):
    super().__init__(parent)

    # Panel
    self.panel = wx.Panel(self)

    # Boxes
    self.numbers = wx.StaticBox(self.panel, wx.ID_ANY, "Numbers")

    # Elements
    self.stN1 = wx.StaticText(self.numbers, wx.ID_ANY, "Number 1:")
    self.tcN1 = wx.TextCtrl(self.numbers, wx.ID_ANY, style=wx.TE_CENTER)
    self.tcN1.SetSize(wx.Size(36, 20))

    self.stN2 = wx.StaticText(self.numbers, wx.ID_ANY, "Number 2:")
    self.tcN2 = wx.TextCtrl(self.numbers, wx.ID_ANY, size=wx.Size(36, 20), style=wx.TE_CENTER)

    # Sizers  
    self.szTop = wx.BoxSizer(wx.VERTICAL)
    self.szNumbers = wx.StaticBoxSizer(self.numbers, wx.VERTICAL)
    self.szN1 = wx.BoxSizer(wx.HORIZONTAL)
    self.szN2 = wx.BoxSizer(wx.HORIZONTAL)

    self.szN1.Add(self.stN1, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
    self.szN1.Add(self.tcN1, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

    self.szN2.Add(self.stN2, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
    self.szN2.Add(self.tcN2, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

    self.szNumbers.Add(self.szN1)
    self.szNumbers.Add(self.szN2)

    self.szTop.Add(self.szNumbers, 0, wx.ALL, 5)

    self.panel.SetSizerAndFit(self.szTop)

    self.Fit()
    self.Show()


if __name__ == "__main__":
    app = wx.App()
    Test(None)
    app.MainLoop()

此代码将给出以下结果:

如您所见,当我在控件的定义中设置它时,在TextCtrl2中正确设置了大小。但是我有很多这样的控件,所以我想在一个方法中动态设置大小" SetSizeOfTextControl(textControl)"。 (因为如果我以后决定使用其他尺寸,我需要在此方法中仅更改1行,而不是在所有定义中更改20行。)

所以我尝试使用给定的方法wx.TextCtrl.SetSize(),如我在TextCtrl1中看到的那样。但这不起作用。好吧,它确实只有在我调用SetSizersAndFit()之前。此时,尺寸将再次恢复为默认值。

这样做的正确方法是什么?如何在使用sizer时动态更改wx.TextCtrl的大小? :)

非常感谢!

2 个答案:

答案 0 :(得分:3)

如果设置了窗口小部件的最小大小,则大小调整器将在计算布局时使用该值,并且当您将大小传递给窗口小部件的构造函数时,它还会设置最小大小。但是调用SetSize并不会改变最小大小,因此下次sizer执行Layout时,它会将小部件的大小重置为最小大小而不是当前大小。在大多数情况下,你真的想要调用SetMinSize,然后调用父窗口小部件的Layout方法。

此外,这对帮助您解决布局问题非常有帮助,甚至可以更好地了解事情的运作方式:https://wiki.wxpython.org/Widget_Inspection_Tool

答案 1 :(得分:1)

您是否考虑过将size变为变量?

size1 = wx.Size(36,20)

self.tcN1 = wx.TextCtrl(self.numbers, wx.ID_ANY, size=size1, style=wx.TE_CENTER)
self.tcN2 = wx.TextCtrl(self.numbers, wx.ID_ANY, size=size1, style=wx.TE_CENTER)