Измените размер wx.TextCtrl динамически - PullRequest
0 голосов
/ 06 июня 2018

У меня проблема с 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 ]

0 голосов
/ 07 июня 2018

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

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

0 голосов
/ 06 июня 2018

Рассматривали ли вы возможность сделать 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)
...