wxPython - BoxSizer неправильно размещает вещи

Я не могу понять, что я делаю не так. Я только что сделал переход с Tkinter на wxPython и пытаюсь выяснить BoxSizers. Я бы посмотрел на этот вопрос, но я даже не знаю, что искать. Эта панель заполняет пространство фрейма, она должна показывать строку текста с индикатором прогресса под ней, и все это должно занимать 1/5 нижней части панели или около того, с центром по горизонтали (в конце концов я собираюсь добавить фоновое изображение позади него). Но то, что происходит, я вижу только текст и только около 40% вниз сверху, выровненный по левому краю окна. Вот код:

class KhPanel(wx.Panel):

def __init__(self, parent, configSet, selectWindow):
    wx.Panel.__init__(self, parent=parent)
    self.frame = parent
    self.configSet = configSet
    whichWindow = getattr(self, selectWindow)
    whichWindow()

def configWindow(self):
    gaugeWidth = (1/5)*self.configSet["width"]
    gaugeHeight = (1/10)*self.configSet["height"]
    gaugeMax = 100
    topBuffer = (8/10)*self.configSet["height"]
    itemSep = (1/16)*self.configSet["height"]

    vSizer = wx.BoxSizer(wx.VERTICAL)
    textSizer = wx.BoxSizer(wx.HORIZONTAL)
    progressSizer = wx.BoxSizer(wx.HORIZONTAL)

    configText = wx.StaticText(self, label="STUFF", style=wx.ALIGN_CENTER)
    configProgressBar = wx.Gauge(self, range=gaugeMax, size=(gaugeWidth, gaugeHeight))

    textSizer.Add(configText, 1, wx.ALIGN_CENTER, 0)
    progressSizer.Add(configProgressBar, 1, wx.ALIGN_CENTER, 1)
    vSizer.Add(textSizer, 1, wx.TOP, topBuffer)
    vSizer.Add(progressSizer, 1, wx.TOP, itemSep)

    self.SetSizer(vSizer)
    vSizer.Fit(self)
    return

Если вам нужна информация, configSet.width и height - это ширина и высота родительского окна (в настоящее время 340 x 270). И selectWindow, в этом случае, является "configWindow"

2 ответа

Решение

Запуск этого кода, gaugeWidth а также gaugeHeight оба устанавливаются на ноль, поэтому индикатор выполнения не отображается. Это связано с тем, что вы здесь делаете целочисленную математику, поэтому 1, деленное на 5, равно 0. То же с 1/10 Просто измените эти строки на:

gaugeWidth = (1/5.0)*self.configSet["width"]
gaugeHeight = (1/10.0)*self.configSet["height"]

Тогда датчик появится. Вот некоторый полностью исполняемый код, слегка измененный по сравнению с вашим неуправляемым оригиналом:

import wx

class KhPanel(wx.Panel):

    def __init__(self, parent, configSet):
        wx.Panel.__init__(self, parent=parent)
        self.frame = parent
        self.configSet = configSet
        self.configWindow()


    def configWindow(self):
        gaugeWidth = (1/5.0)*self.configSet["width"]
        gaugeHeight = (1/10.0)*self.configSet["height"]
        gaugeMax = 100
        topBuffer = (8/10)*self.configSet["height"]
        itemSep = (1/16)*self.configSet["height"]

        vSizer = wx.BoxSizer(wx.VERTICAL)
        textSizer = wx.BoxSizer(wx.HORIZONTAL)
        progressSizer = wx.BoxSizer(wx.HORIZONTAL)

        configText = wx.StaticText(self, label="STUFF", style=wx.ALIGN_CENTER)
        configProgressBar = wx.Gauge(self, range=gaugeMax, size=(gaugeWidth, gaugeHeight))

        textSizer.Add(configText, 1, wx.ALIGN_CENTER, 0)
        progressSizer.Add(configProgressBar, 1, wx.ALIGN_CENTER, 1)
        vSizer.Add(textSizer, 1, wx.TOP, topBuffer)
        vSizer.Add(progressSizer, 1, wx.TOP, itemSep)

        self.SetSizer(vSizer)
        vSizer.Fit(self)

class MyFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, title="Test")
        config = {'width':340, 'height':270}
        panel = KhPanel(self, config)

        self.Show()

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

С учетом поправки Майка Дрисколла, приведенной выше, я изменил способ разметки, и получилось меньше работы. Я вынул горизонтальные калибровщики, поскольку обнаружил, что они не нужны, если только я не собирался размещать две вещи в одном ряду и не добавил проставки вместо огромных границ. Вот новый код, и он выглядит именно так, как я хотел:

def configWindow(self):
    gaugeWidth = (4/5.0)*self.configSet["width"]
    gaugeHeight = (1/10.0)*self.configSet["height"]
    gaugeMax = 100

    vSizer = wx.BoxSizer(wx.VERTICAL)
    configText = wx.StaticText(self, label="STUFF")
    configProgressBar = wx.Gauge(self, range=gaugeMax, size=(gaugeWidth, gaugeHeight))

    vSizer.AddStretchSpacer(7)
    vSizer.Add(configText, 1, wx.ALIGN_CENTER, 0)
    vSizer.Add(configProgressBar, 1, wx.ALIGN_CENTER, 0)
    vSizer.AddStretchSpacer(1)

    self.SetSizer(vSizer)
    return
Другие вопросы по тегам