Измените размер 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(). В этот момент размер снова возвращается к значению по умолчанию.

Как правильно это сделать? Как динамически изменить размер wx.TextCtrl при использовании классификаторов?:)

Большое спасибо!

2 ответа

Решение

Если установлен минимальный размер виджета, то разработчики размера будут использовать это значение при расчете макета, а когда вы передаете размер конструктору виджета, он также устанавливает минимальный размер. Но зовет SetSize не меняет минимальный размер и поэтому в следующий раз, когда сортировщик Layout тогда он сбросит размер виджета до минимального размера вместо текущего размера. В большинстве случаев, как это вы действительно хотите позвонить SetMinSize с последующим вызовом родительского виджета Layout метод.

Кроме того, это может быть очень полезно, чтобы помочь вам решить проблемы с макетом, или даже просто лучше понять, как все работает: https://wiki.wxpython.org/Widget_Inspection_Tool

Рассматривали ли вы сделать 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)
Другие вопросы по тегам