2017-08-01 4 views
0

ont deux boutons sur un panneau. 1 voulez un à gauche et un à droite. Il doit y avoir un moyen simple mais 1 ne peut pas le voir (le (400, 0) l'espace est juste un exemple, il devrait fonctionner sur un panneau)python WX comment placer un bouton sur un châssis 1

import wx 


class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, 
          'Demonstrate wxPython button') 
     self.panel = MainPanel(self) 
     self.Fit() 
     self.Centre() 
     self.Show() 


class MainPanel(wx.Panel): 
    def __init__(self, frame): 
     wx.Panel.__init__(self, frame) 

     # Button 
     button_sizer = self._button_sizer(frame) 

     # Main sizer 
     main_sizer = wx.BoxSizer(wx.VERTICAL) 
     main_sizer.Add((400, 0)) 
     main_sizer.Add(button_sizer) 
     self.SetSizer(main_sizer) 
     self.Fit() 

    def _button_sizer(self, frame): 
     cmd_save = wx.Button(self, wx.ID_SAVE) 
     cmd_cancel = wx.Button(self, wx.ID_CANCEL) 
     button_sizer = wx.BoxSizer(wx.HORIZONTAL) 
     button_sizer.Add(cmd_save) 
     button_sizer.Add(cmd_cancel, flag=wx.ALIGN_RIGHT) 
     return button_sizer 


if __name__ == '__main__': 
    screen_app = wx.App() 
    main_frame = MainFrame() 
    screen_app.MainLoop() 

(désolé à ce sujet, StackOverflow veulent plus de texte)

lorem ipsum les carottes, le vent, jusqu'à ce qu'ils doivent se concentrer sur le financement à long du football Simmer mais, couche de planification est un pot noir. Investir dans nos cookies Chat maintenant, lorem ipsum de la maladie dans les bananes. Même à ultricies Sed avant, mais cette approbation fermentum nibh eu sapien sapien le football se déclenche, comme une haine douce de suspendre la faim. Mais le prix de Mécène WISI, de la masse, la masse de la vie ne sont pas aux textiles maintenant Duis non nisi Mécène sém, de sorte que, aliquet amet, la vie a son origine. Qui ils pourraient désirer rutrum justo Varius felis ligula, Mauris sit ut, la rue du maintenant. Et les développeurs ou, sans de bananes suspendues jusqu'à ce que la gorge à l'arc clinique. Présenter le football doux juste diamètre que l'arc de diamètre ou les développeurs. Le dernier le football très sombre avant que les enfants de sociosqu laids qui ont mis le tireur d'élite, zéro, lorem bateau commencé. Leurs compagnons du cours des produits informatiques sont également grand besoin, tout comme le prix, veulent vivre la vie et que ce soit, mon cher amet amet Malesuada au lit de la vie. Convallis Aenean tristique primigeste dans le temps à venir, alors qu'il aime, et le rire des Ac à rhoncus vehicula neque ETM, ac commodo, magna eget ut.

Répondre

1

1 ont toujours trouvé le sizer l'élément proportion est votre ami dans des cas comme ceux-ci. Ce qui définit combien d'espace un certain élément devrait prendre par rapport aux autres.
Voici votre code, avec l'option de proportion utilisée.

import wx 
class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, 'Demonstrate wxPython button') 
     self.panel = MainPanel(self) 
     # self.Fit() 
     self.Centre() 
     self.Show() 

class MainPanel(wx.Panel): 
    def __init__(self, frame): 
     wx.Panel.__init__(self, frame) 
     # Button 
     button_sizer = self._button_sizer(frame) 
     # Main sizer 
     main_sizer = wx.BoxSizer(wx.VERTICAL) 
     main_sizer.Add(button_sizer,proportion=1, flag=wx.EXPAND) 
     self.SetSizer(main_sizer) 
     self.Fit() 

    def _button_sizer(self, frame): 
     cmd_save = wx.Button(self, wx.ID_SAVE) 
     cmd_cancel = wx.Button(self, wx.ID_CANCEL) 
     button_sizer = wx.BoxSizer(wx.HORIZONTAL) 
     button_sizer.Add(cmd_save) 
     button_sizer.Add((-1, -1), proportion=1) 
     button_sizer.Add(cmd_cancel) 
     return button_sizer 

if __name__ == '__main__': 
    screen_app = wx.App() 
    main_frame = MainFrame() 
    screen_app.MainLoop() 
+0

Ça le fait. Merci Rolf – Psionman

0

Vous ne voulez pas ajouter un bouton au cadre lui-même. Le cadre doit avoir un seul enfant, un panneau. Dans ce cas, son seul enfant doit être une instance de votre classe MainPanel. Vous pouvez simplement changer votre appel à _button_sizer à ce qui suit:

button_sizer = self._button_sizer(self) 

noter que nous passons ici le _button_sizer du comité comme parent au lieu du cadre.

Bien sûr, vous pouvez également déplacer la création des boutons complètement en dehors de la classe si vous voulez:

import wx 

def save_cancel(parent): 
    cmd_save = wx.Button(parent, wx.ID_SAVE) 
    cmd_cancel = wx.Button(parent, wx.ID_CANCEL) 
    button_sizer = wx.BoxSizer(wx.HORIZONTAL) 
    button_sizer.Add(cmd_save) 
    button_sizer.Add(cmd_cancel, flag=wx.ALIGN_RIGHT) 
    return button_sizer 

class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, 
          'Demonstrate wxPython button') 
     self.panel = MainPanel(self) 
     self.Fit() 
     self.Centre() 
     self.Show() 


class MainPanel(wx.Panel): 
    def __init__(self, frame): 
     wx.Panel.__init__(self, frame) 

     # Button 
     button_sizer = save_cancel(self) 

     # Main sizer 
     main_sizer = wx.BoxSizer(wx.VERTICAL) 
     main_sizer.Add((400, 0)) 
     main_sizer.Add(button_sizer) 
     self.SetSizer(main_sizer) 
     self.Fit() 


if __name__ == '__main__': 
    screen_app = wx.App() 
    main_frame = MainFrame() 
    screen_app.MainLoop() 

Cela fera des événements de liaison plus délicat, mais il est un moyen intéressant de faire votre un code modulaire peu plus aussi bien.

Si vous voulez que le bouton soit séparé, puis vous ajoutez un StretchSpacer ou un tuple comme (-1, -1) (voir la réponse de Rolf). Voici un exemple en utilisant le StretchSpacer:

import wx 



class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, 
          'Demonstrate wxPython button') 
     self.panel = MainPanel(self) 
     self.Fit() 
     self.Centre() 
     self.Show() 


class MainPanel(wx.Panel): 
    def __init__(self, frame): 
     wx.Panel.__init__(self, frame) 

     # Button 
     button_sizer = self.save_cancel() 

     # Main sizer 
     main_sizer = wx.BoxSizer(wx.VERTICAL) 
     main_sizer.Add((400, 0)) 
     main_sizer.Add(button_sizer, proportion=1, flag=wx.EXPAND) 
     self.SetSizer(main_sizer) 
     self.Fit() 

    def save_cancel(self): 
     cmd_save = wx.Button(self, wx.ID_SAVE) 
     cmd_cancel = wx.Button(self, wx.ID_CANCEL) 
     button_sizer = wx.BoxSizer(wx.HORIZONTAL) 
     button_sizer.Add(cmd_save) 
     button_sizer.AddStretchSpacer() 
     button_sizer.Add(cmd_cancel, flag=wx.ALIGN_RIGHT) 
     return button_sizer  


if __name__ == '__main__': 
    screen_app = wx.App() 
    main_frame = MainFrame() 
    screen_app.MainLoop() 
+0

Merci Mike. 1 pensais que mon seul cadre avait un enfant, MainPanel. Peut-être 1've mal compris, mais tout ce que vous semblez avoir fait est mouvement autour de la création du bouton Sizer. Cela a répondu à mes questions sur l'alignement des boutons? 1 voulez que le bouton Annuler pour apparaître sur le côté droit du cadre principal et le bouton Enregistrer sur le côté gauche – Psionman

+0

Vous avez passé l'objet de cadre à votre panneau, puis vous définissez le cadre comme parent de vos boutons. Ce qui est sans doute pas ce que vous voulez. Si vous voulez que le bouton soit séparés les uns des autres, qui est en fait assez facile. 1 a ajouté un exemple distinct. Rolf avait aussi une bonne façon de le faire aussi. –

+0

Merci Mike. C'est bien aussi.Je ne connaissais pas "AddStretchSpacer"; très utile – Psionman