2015-03-06 1 views
0

Je ne peux pas comprendre ce que je fais mal. J'ai juste fait le saut de Tkinter à wxPython et j'essaye de comprendre BoxSizers. Je poserais cette question, mais je ne sais même pas quoi chercher. Ce panneau remplit l'espace d'un cadre, il est censé montrer une ligne de texte avec une barre de progression en dessous et tout cela est supposé prendre le 1/5 inférieur du panneau ou plus, centré horizontalement (finalement je vais ajouter une image de fond derrière). Mais ce qui se passe, c'est que je ne vois que le texte et seulement environ 40% du haut, aligné sur le bord gauche de la fenêtre. Voici le code:wxPython - BoxSizers ne pas placer les choses correctement

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 

Si vous avez besoin d'informations, configSet.width et la hauteur sont la largeur et la hauteur de la fenêtre mère (actuellement 340 x 270). Et selectWindow, dans ce cas, est « configWindow »

Répondre

0

L'exécution de ce code, le gaugeWidth et gaugeHeight sont tous les deux se mis à zéro, ce qui est la raison pour laquelle la barre de progression ne montre pas. Ceci est dû au fait que vous faites des maths entiers ici, donc 1 divisé par 5 est 0. Même avec 1/10. Remplacez simplement ces lignes par:

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

Ensuite, la jauge apparaîtra. Voici un code entièrement runnable, légèrement modifié de votre origine Non-Exécutable:

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

Vous avez raison, c'était le problème. J'ai fait la même chose pour le topBuffer et itemSep et maintenant ceux-ci fonctionnent, même si j'ai encore quelques ajustements comme la barre de progression se termine en haut et je ne sais pas pourquoi et les widgets ne sont pas centrés horizontalement, ce que je pensais ALIGN_CENTER a fait. Ahh eh bien, je peux en discuter avec ceux-là. Pourquoi Python a-t-il besoin du .0 à la fin des entiers comme ça? Est-ce que le .0 dit que la réponse sera un point flottant? Règle n ° 1 du débogage: testez vos variables - leçon apprise pour la 500ème fois. Merci! – linus72982

+0

Oui, il dit à Python d'utiliser la division en virgule flottante. Vous pouvez activer la division en virgule flottante par défaut en utilisant 'from __future__ import division' - http://stackoverflow.com/questions/1267869/how-can-i-force-division-to-be-floating-point-in-python . Vous pourriez trouver cet article utile pour centrer les widgets - http://www.blog.pythonlibrary.org/2015/02/19/wxpython-101-how-to-center-a-widget/ –

0

L'intégration de la correction de Mike Driscoll ci-dessus, je l'ai changé la façon dont j'espacé et il fonctionne à moins de travail. J'ai sorti les calibreurs horizontaux car j'ai découvert qu'ils n'étaient pas nécessaires sauf si je devais espacer deux choses sur la même rangée et j'ai ajouté des entretoises extensibles au lieu d'énormes bordures. Voici le nouveau code et il ressemble exactement à ce que je voulais:

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