Как динамически позиционировать элементы в wxPython - PullRequest
0 голосов
/ 06 мая 2018

Мне не удалось найти ответ в документации. Скажем, у меня есть следующее:

import wx
from wx import *
import sys

app = wx.App() 

def quitProgram(*args):
    sys.exit()

def restart(*args):
    app.MainLoop()

xSize = 500
ySize = 300
window = wx.Frame(None, title = "My GUI", size = (xSize,ySize)) 
panel = wx.Panel(window)     

# generic label
labelLeft = wx.StaticText(panel, label = 'some text', pos = (2,30))

# exit button
exit = wx.Button(panel, -1, label="Exit", pos = (1, 1), size=(-1,-1))
exit.Bind(wx.EVT_BUTTON, quitProgram)
# reset button
reset = wx.Button(panel, -1, label="Refresh", pos = (100,1), size=(-1,-1))
reset.Bind(wx.EVT_BUTTON, restart)

window.Show(True) 

app.MainLoop()

Как расположить объекты-кнопки и метки в зависимости от размера главного окна? Я бы хотел, чтобы объекты переместились на основе изменения размера окна.

1 Ответ

0 голосов
/ 06 мая 2018

Отправленный код не является чистым кодом wxPython.
Вы должны создать экземпляр своего Frame как Class и использовать Sizer для автоматизации позиционирования ваших виджетов.
Минимальный код, который воспроизводит ваш фрейм с использованием Sizers, таков:

import wx

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((500, 300))
        self.bt_exit = wx.Button(self, wx.ID_ANY, "exit")
        self.bt_refresh = wx.Button(self, wx.ID_ANY, "refresh")
        self.text_ctrl = wx.TextCtrl(self, wx.ID_ANY, "some text", style=wx.TE_MULTILINE)

        self.SetTitle("My GUI")
        self.bt_exit.Bind(wx.EVT_BUTTON, self.on_exit)
        self.bt_refresh.Bind(wx.EVT_BUTTON, self.on_refresh)

        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_2.Add(self.bt_exit, 1, 0, 0)
        sizer_2.Add(self.bt_refresh, 1, 0, 0)
        sizer_1.Add(sizer_2, 0, wx.EXPAND, 0)
        sizer_1.Add(self.text_ctrl, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        self.Layout()

    def on_exit(self, evt):
        self.Close()

    def on_refresh(self, evt):
        self.text_ctrl.Clear()

if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(None)
    frame.Show()
    app.MainLoop()

Это хорошо объяснено в документации по wxPython / Phoenyx. Проверьте, например, эти учебники

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...