Ошибка с настройщиками wxpython

#python #wxpython

#python #wxpython

Вопрос:

Я не уверен, как мне следует это определить, я пытался использовать sizer, но, похоже, я все время делаю что-то не так.

В основном у меня есть этот код:

 self.button = wx.Button(self, label="Create New", pos=(25,250))
  

и я хотел бы использовать с ним сайзер. Таким образом, он всегда будет корректировать свое положение в соответствии с окном. Начальная начальная позиция равна 25, 250. Высота начального окна равна 400.
Я бы хотел, чтобы кнопка настраивалась в соответствии с изменениями окна.

Спасибо, пожалуйста, прокомментируйте, если у вас есть какие-либо вопросы или вам нужны разъяснения.

Комментарии:

1. Каков ваш код сайзера на данный момент? Для начала вам нужно инициализировать что-то вроде wx.BoxSizer . Кроме того, указание позиции в элементе не требуется, если вы собираетесь поместить его в сайзер.

Ответ №1:

Здесь у вас есть автоматически сгенерированный код wxglade, показывающий, как использовать wx.BoxSizer . Это просто рамка с виджетом панели. Вы можете изменить панель с помощью своей кнопки, и она будет работать идеально. Идея в том, что вы могли бы добавить другие виджеты, как это делается для wx.Panel в:

 sizer_2.Add(self.panel_1, 1, wx.EXPAND, 0)
  

это приведет к тому, что ваши виджеты будут расположены в ряд. Если вы хотите другое расположение, вы могли бы использовать другой размер, вы также можете добавить размеры с виджетами в другие размеры. Параметры в sizer.Add() определяют границы и поведение сайзера. Для этого вам следует проверить документацию wxPython / wxglade. В любом случае, структура всегда похожа на приведенную ниже:

 import wx

# begin wxGlade: extracode
# end wxGlade

class MyFrame1(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame1.__init__
        kwds["style"] = wx.CLOSE_BOX|wx.SYSTEM_MENU| wx.CAPTION
        wx.Frame.__init__(self, *args, **kwds)
        self.panel_1 = wx.Panel(self, -1)
        ------ create other widgets here ------

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: MyFrame1.__set_properties
        self.SetTitle("frame_2")
        self.SetMinSize((300,200))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrame1.__do_layout
        sizer_2 = wx.BoxSizer(wx.VERTICAL)
        sizer_2.Add(self.panel_1, 1, wx.EXPAND, 0)
        ------ add other widgets or even sizers to the sizer here ------
        self.SetSizer(sizer_2)
        sizer_2.Fit(self)
        self.Layout()
        # end wxGlade

# end of class MyFrame1

if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = MyFrame1(None, -1, "")
    app.SetTopWindow(frame_1)
    frame_1.Show()
    app.MainLoop()