2015-03-06 2 views
0

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

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 и высота, ширина и высота родительского окна (в настоящее время 340 х 270). И selectWindow, в данном случае, является «configWindow»

ответ

0

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

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

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

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() 
+0

Вы правы, это была проблема. Я сделал то же самое для topBuffer и itemSep, и теперь они тоже работают, хотя у меня все еще есть какая-то настройка, так как индикатор прогресса заканчивается сверху, и я не уверен, почему и виджеты не центрированы по горизонтали, что я и думал ALIGN_CENTER сделал. Ahh хорошо, я могу суетиться с ними. Почему Python нуждается в .0 в конце целых чисел? Говорит ли .0, что ответ будет плавающей точкой? Правило №1 отладки: проверьте свои переменные - извлеченный урок в 500-й раз. Благодаря! – linus72982

+0

Да, это говорит Python использовать деление с плавающей запятой. Вы можете включить деление с плавающей запятой по умолчанию, используя 'from __future__ import division' - http://stackoverflow.com/questions/1267869/how-can-i-force-division-to-be-floating-point-in-python , Вы можете найти эту статью полезной для центрирования виджетов - http://www.blog.pythonlibrary.org/2015/02/19/wxpython-101-how-to-center-a-widget/ –

0

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

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 
Смежные вопросы