Wxpython: GridBagSizer меня смутил

Я новичок в графическом интерфейсе Python, а также в wxpython. Теперь я столкнулся со следующей проблемой.

Вот код

import wx

class Example(wx.Frame):

    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title)

        self.InitUI()
        self.Centre()
        self.Show()

    def InitUI(self):
        panel = wx.Panel(self)
        sizer = wx.GridBagSizer(0, 0)

        text = wx.StaticText(panel, label = "Name:")
        sizer.Add(text, pos=(0, 0), flag=wx.ALL, border=5)

        tc = wx.TextCtrl(panel)
        sizer.Add(tc, pos=(0, 1), span=(1, 2), flag=wx.EXPAND | wx.ALL, border=5)

        text1 = wx.StaticText(panel, label = "address")
        sizer.Add(text1, pos=(1, 0), flag=wx.ALL, border=5)

        tc1 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
        sizer.Add(tc1, pos=(1, 1), span=(1, 3), flag=wx.EXPAND | wx.ALL, border=5)

        text11 = wx.StaticText(panel, label = "address2")
        sizer.Add(text11, pos=(1, 4), flag=wx.ALL, border=5)

        tc11 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
        sizer.Add(tc11, pos=(1, 5), span=(1, 3), flag=wx.EXPAND | wx.ALL, border=5)

        text2 = wx.StaticText(panel, label = "age")
        sizer.Add(text2, pos=(2, 0), flag=wx.ALL, border=5)

        tc2 = wx.TextCtrl(panel)
        sizer.Add(tc2, pos=(2, 1), flag=wx.ALL, border=5)

        text3 = wx.StaticText(panel, label = "Mob.No")
        sizer.Add(text3, pos=(2, 2), flag=wx.ALIGN_CENTER | wx.ALL, border=5)

        tc3 = wx.TextCtrl(panel)
        sizer.Add(tc3, pos=(2, 3), flag=wx.EXPAND | wx.ALL, border=5)

        text4 = wx.StaticText(panel, label = "Description")
        sizer.Add(text4, pos=(3, 0), flag=wx.ALL, border=5)

        tc4 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
        sizer.Add(tc4, pos=(3, 1), span=(1, 3), flag=wx.EXPAND | wx.ALL, border=5)
        sizer.AddGrowableRow(3)

        buttonOk = wx.Button(panel, label = "Ok")
        buttonClose = wx.Button(panel, label = "Close")

        sizer.Add(buttonOk, pos=(4, 2), flag=wx.ALL, border=5)
        sizer.Add(buttonClose, pos=(4, 3), flag=wx.ALL, border=5)

        panel.SetSizerAndFit(sizer)


app = wx.App()
Example(None, title='GridBag Demo')
app.MainLoop()

Вот результат

Wxpython: GridBagSizer меня смутил

Что меня смущает, так это метка address2. Очевидно, она не занимает три столбца.

text11 = wx.StaticText(panel, label = "address2")
sizer.Add(text11, pos=(1, 4), flag=wx.ALL, border=5)

tc11 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
sizer.Add(tc11, pos=(1, 5), span=(1, 3), flag=wx.EXPAND | wx.ALL, border=5)

Но код метки address2 такой же, как у метки address, за исключением параметра pos. Может кто-нибудь объяснить это.

env: python3.7/wxpython4.0.4 (новейший)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Каково определение этих 3 столбцов?
Вы определили что-нибудь для столбцов 5, 6 и 7, чтобы sizer работал с ними?
Без чего-то, с чем можно работать, сайзер не знает, насколько велики эти столбцы, поэтому вы должны либо дать ему что-то для работы, либо определить размер пустой ячейки.

import wx

class Example(wx.Frame):

    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title, size=(750,-1))

        self.InitUI()
        self.Centre()
        self.Show()

    def InitUI(self):
        panel = wx.Panel(self, -1)
        sizer = wx.GridBagSizer(0, 7)

        text = wx.StaticText(panel, label = "Name:")
        sizer.Add(text, pos=(0, 0), flag=wx.ALL, border=5)
#
# place some dummy text to give the sizer something to work with
#
#        dummy4 = wx.StaticText(panel, label = "something")
#        sizer.Add(dummy4, pos=(0, 4), flag=wx.ALL, border=5)
#        dummy5 = wx.StaticText(panel, label = "something")
#        sizer.Add(dummy5, pos=(0, 5), flag=wx.ALL, border=5)
#        dummy6 = wx.StaticText(panel, label = "something")
#        sizer.Add(dummy6, pos=(0, 6), flag=wx.ALL, border=5)
#        dummy7 = wx.StaticText(panel, label = "something")
#        sizer.Add(dummy7, pos=(0, 7), flag=wx.ALL, border=5)
#
# or set a cell size for empty cells
#
        sizer.SetEmptyCellSize((130,20))

        tc = wx.TextCtrl(panel)
        sizer.Add(tc, pos=(0, 1), span=(1, 2), flag=wx.EXPAND | wx.ALL, border=5)

        text1 = wx.StaticText(panel, label = "address")
        sizer.Add(text1, pos=(1, 0), flag=wx.ALL, border=5)

        tc1 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
        sizer.Add(tc1, pos=(1, 1), span=(1, 3), flag=wx.EXPAND | wx.ALL, border=5)

        text11 = wx.StaticText(panel, label = "address2")
        sizer.Add(text11, pos=(1, 4), flag=wx.ALL, border=5)

        tc11 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
        sizer.Add(tc11, pos=(1, 5), span=(1, 3), flag=wx.EXPAND | wx.ALL, border=5)

        text2 = wx.StaticText(panel, label = "age")
        sizer.Add(text2, pos=(2, 0), flag=wx.ALL, border=5)

        tc2 = wx.TextCtrl(panel)
        sizer.Add(tc2, pos=(2, 1), flag=wx.ALL, border=5)

        text3 = wx.StaticText(panel, label = "Mob.No")
        sizer.Add(text3, pos=(2, 2), flag=wx.ALIGN_CENTER | wx.ALL, border=5)

        tc3 = wx.TextCtrl(panel)
        sizer.Add(tc3, pos=(2, 3), flag=wx.EXPAND | wx.ALL, border=5)

        text4 = wx.StaticText(panel, label = "Description")
        sizer.Add(text4, pos=(3, 0), flag=wx.ALL, border=5)

        tc4 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
        sizer.Add(tc4, pos=(3, 1), span=(1, 3), flag=wx.EXPAND | wx.ALL, border=5)
        sizer.AddGrowableRow(3)

        buttonOk = wx.Button(panel, label = "Ok")
        buttonClose = wx.Button(panel, label = "Close")

        sizer.Add(buttonOk, pos=(4, 2), flag=wx.ALL, border=5)
        sizer.Add(buttonClose, pos=(4, 3), flag=wx.ALL, border=5)

        panel.SetSizerAndFit(sizer)

app = wx.App()
Example(None, title='GridBag Demo')
app.MainLoop()

p.s. Макет, вероятно, будет работать лучше, если вы просто поместите address2 под адресом 1.

спасибо за ответ, и это было правильно. это вызвано пустой ячейкой. Но у меня все еще есть два вопроса. 1. Является ли размер ячейки в GridBagSizer динамическим? 2. Могу ли я установить размер ячейки по умолчанию (не пустая ячейка)?

放課後 09.03.2019 14:19

@放課後 docs.wxpython.org/wx.Sizer.html#wx.Sizer и docs.wxpython.org/wx.GridBagSizer.html#wx.GridBagSizer -- - Размер пустой ячейки по умолчанию составляет 10 в ширину и 20 в высоту.

Rolf of Saxony 09.03.2019 17:47

Другие вопросы по теме