2009-12-12 6 views
4

Je n'arrive pas à trouver comment faire pour que les calibreurs dans wxPython fonctionnent comme je le veux (à part: suis-je le seul à penser que wxPython est mal documenté?). J'ai 4 boutons et une textctrl que je veux arrangées comme:wxPython - choisir le bon calibreur à utiliser dans une application

============================================== 
|WINDOW TITLE       _ [] X| 
|============================================| 
|Button1 | Button2 | Button3 | Button4| 
|--------------------------------------------| 
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| 
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| 
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| 
|xxxxxxxxxxxxxxxxxxTextCtrlxxxxxxxxxxxxxxxxxx| 
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| 
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| 
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| 
============================================== 

Les boutons doivent étendre horizontalement, mais pas verticalement, et le textctrl devrait étendre à la fois horizontalement et verticalement. J'ai essayé à peu près tous les calibreurs listés dans le programme de démo wxPython et aucun d'entre eux n'a fonctionné - plusieurs boxsizers, gridsizers + boxsizeres, gridsizer simple, flexgridsizer et rowColsizer mais aucun ne fonctionne, quelqu'un pourrait-il aider? Pour référence, voici le code que j'ai en ce moment.

  ...snip... 
      panel = wx.Panel(self, -1) 
      select_file = wx.Button(panel, self.BUTTON_0, "Select File") 
      button1 = wx.Button(panel, self.BUTTON_1, "250 Words") 
      button2 = wx.Button(panel, self.BUTTON_2, "500 Words") 
      button3 = wx.Button(panel, self.BUTTON_3, "750 Words") 
      self.txt = wx.TextCtrl(panel, -1, "", style=wx.TE_MULTILINE | wx.TE_READONLY) 

      # Now to re-do this with gridsizers instead. 
      # 4 rows, 4 columns, 2 pixel gap horizontally and vertically. 
      grid = rcs.RowColSizer() 

      # These buttons need to expand to fill their space, and then 
      # expand when the windows are resized. 
      grid.Add(select_file, row=1, col=1) 
      grid.Add(button1, row=1, col=2) 
      grid.Add(button2, row=1, col=3) 
      grid.Add(button3, row=1, col=4) 
      grid.Add(self.txt, row=2, col=1) 
      ...snip... 

Répondre

8

Il m'a fallu un certain temps pour comprendre cela. C'est quelque chose que je fais avec wxPython tout le temps. Essentiellement, vous devez imbriquer des calibreurs de boîte. Vous avez besoin d'un calibreur vertical qui tient deux calibreurs horizontaux.

Voici le code dont vous avez besoin:

import wx 

class sizertest(wx.Panel): 

    def __init__(self,parent): 
     wx.Panel.__init__(self,parent) 
     vsizer = wx.BoxSizer(wx.VERTICAL) 
     hsizer1 = wx.BoxSizer(wx.HORIZONTAL) 

     button1 = wx.Button(self,-1,"button 1") 
     self.Bind(wx.EVT_BUTTON,self.button1,button1) 
     hsizer1.Add(button1,1,wx.EXPAND) 

     button2 = wx.Button(self,-1,"button 2") 
     self.Bind(wx.EVT_BUTTON,self.button2,button2) 
     hsizer1.Add(button2,1,wx.EXPAND) 

     vsizer.Add(hsizer1,.1,wx.EXPAND) 
     self.SetSizer(vsizer) 

     tc = wx.TextCtrl(self,-1,"",style=wx.TE_MULTILINE) 
     hsizer2 = wx.BoxSizer(wx.HORIZONTAL) 
     hsizer2.Add(tc,1,wx.EXPAND) 
     vsizer.Add(hsizer2,1,wx.EXPAND) 

    def button1(self,event):pass 
    def button2(self,event):pass 


if __name__ == "__main__": 
    app = wx.App() 
    frame = wx.Frame(parent=None, id=-1, title="sizer test") 
    panel = sizertest(frame) 

    frame.Show() 
    app.MainLoop() 

Le vsizer sizer vertical tient deux calibreurs horizontales. Le premier calibreur horizontal contient autant de boutons que vous voulez ajouter, et ils peuvent se développer horizontalement. Puisque vous l'ajoutez au calibreur vertical avec un nombre inférieur à un pour son "poids", il ne s'étendra pas verticalement. Le deuxième calibreur horizontal contient le contrôle de texte et il peut s'étendre pour occuper tout l'espace horizontal et vertical restant. Les deux calibreurs se dilatent lorsque la fenêtre est agrandie.

Je recommande que vous obteniez le livre wxPython in Action de Rappin et Dunn - cela m'a vraiment aidé à comprendre le fonctionnement des calibreurs wxPython et de la disposition de l'écran.

J'utilise des boxsizers imbriqués pour 99% de mes programmes wxPython.

Curt

+0

Oui, les calibreurs de boîtes imbriquées sont aussi mon approche générale. – FogleBird

+2

+1 J'utilise principalement des boxsizers (imbriqués) et des flexgridsizers. Et oui, c'est une vérité universelle que wxpython est très mal documenté. Je recommande la liste de diffusion, il suffit de suivre cela pendant quelques semaines et vous serez à la hauteur. – DrBloodmoney

0

Il y a beaucoup d'informations sur le wiki, consultez http://wiki.wxpython.org/UsingSizers par exemple. L'image en bas permet de montrer comment fonctionnent tous les drapeaux et les arguments de la fonction.

D'autres bons exemples sont -zetcodea et n'oubliez pas de vérifier les pages wxwidgets aussi.

Les exemples/applications de démonstration sont également disponibles sur la page de téléchargement de wxpython. Je ne peux pas fournir plus d'un lien en raison d'être un nouvel utilisateur de StackOverflow. Après un moment de jeu avec des calibreurs, ils devraient "cocher", je trouve que leur utilisation rend la création de mes GUI un jeu d'enfant.

Questions connexes