#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()