wxDialog: CreateButtonSizer

Plattformunabhängige GUIs mit wxWidgets.
Antworten
alan
User
Beiträge: 81
Registriert: Dienstag 10. April 2007, 11:30

Hallo!

ich werde hier aus der Doku (zu wx.Dialog) nicht ganz schlau:
Also notice that the CreateButtonSizer() should be used to create the buttons appropriate for the current platform and positioned correctly (including their order which is platform-dependent).
Ich hab mich dran gehalten und ausprobiert:

Code: Alles auswählen

class Preferences(wx.Dialog):
    def __init__(self, parent, id=-1, title="Preferences"):
        wx.Dialog.__init__(self, parent, id, title)
        buttonSizer = self.CreateButtonSizer(wx.OK | wx.CANCEL)
        self.SetSizer(buttonSizer)
Ich weiß jetzt allerdings nicht mehr weiter:
Beide Buttons verhalten sich wie erwartet und schließen den Dialog.
Aber wie lässt sich an den OK-Button ein Event binden, um Änderungen zu speichern, bevor der Dialog geschlossen wird?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

alan hat geschrieben:CreateButtonSizer()
Hallo alan!

``CreateButtonSizer()`` habe ich noch nie eingesetzt. Klingt aber interessant.

So wie es aussieht, kann man nur über die ID-Konstanten darauf zugreifen.

Code: Alles auswählen

import wx

class Preferences(wx.Dialog):
    def __init__(self, parent = None, id=-1, title="Preferences"):
        wx.Dialog.__init__(self, parent, id, title)
        buttonSizer = self.CreateButtonSizer(wx.OK | wx.CANCEL)
        self.SetSizer(buttonSizer)
        self.Bind(wx.EVT_BUTTON, self.x, id = wx.ID_OK)
        self.Bind(wx.EVT_BUTTON, self.y, id = wx.ID_CANCEL)
    
    def x(self, event):
        event.Skip()
        print "x"

    def y(self, event):
        event.Skip()
        print "y"

app = wx.PySimpleApp()
diag = Preferences()
if diag.ShowModal() == wx.ID_OK:
    print "OK"
else:
    print "CANCEL"
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Ich habe mich ein wenig damit gespielt. Feine Sache!

Wenn man wx.Locale() referenziert, dann bekommt man sogar deutsche Buttonbeschriftungen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx

wx.SetDefaultPyEncoding("iso-8859-15")


class Preferences(wx.Dialog):
    def __init__(self, parent = None, id=-1, title="Preferences"):
        wx.Dialog.__init__(self, parent, id, title)
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(vbox)
        
        vbox.AddStretchSpacer()
        
        buttonSizer = self.CreateButtonSizer(wx.OK | wx.CANCEL)
        #buttonSizer = self.CreateSeparatedButtonSizer(wx.OK | wx.CANCEL)
        
        vbox.Add(buttonSizer, 0, wx.ALL | wx.EXPAND, 5)
        
        self.Bind(wx.EVT_BUTTON, self.x, id = wx.ID_OK)
        self.Bind(wx.EVT_BUTTON, self.y, id = wx.ID_CANCEL)
    
    def x(self, event):
        event.Skip()
        print "x"

    def y(self, event):
        event.Skip()
        print "y"


app = wx.PySimpleApp()

# Buttonbeschriftung DEUTSCH
app.locale = wx.Locale(wx.LANGUAGE_DEFAULT)

diag = Preferences()
if diag.ShowModal() == wx.ID_OK:
    print "OK"
else:
    print "CANCEL"
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
alan
User
Beiträge: 81
Registriert: Dienstag 10. April 2007, 11:30

Ich muss dir schon wieder danken :) Lerne aus jedem deiner Posts was.

Die Sache mit den Buttonbeschriftungen ist mir gar nicht aufgefallen, weil ich meine Systemsprache auf Englisch eingestellt habe.

Prinzipiell finde ich aber, dass man damit vorsichtig sein sollte. Mich hat (als ich noch Deutsch als Systemsprache eingesellt hatte) kaum etwas so genervt wie unfreiwillig zweisprachige Programme. Gewisse Standardsachen waren auf Deutsch und der Rest, für den keine Sprachdateien bereitstanden, auf Englisch. Das macht einen furchtbar zusammengeschusterten und unfertigen Eindruck.

Aber das ist nur meine Meinung ;-)
alan
User
Beiträge: 81
Registriert: Dienstag 10. April 2007, 11:30

Mir ist gerade was aufgefallen, worauf ich mir keinen Reim machen kann. Dein zweites Script quittiert mit:
Traceback
File "temp.py", line 16, in __init__
vbox.AddStretchSpacer()
AttributeError: 'BoxSizer' object has no attribute 'AddStrechSpacer'
Was soll das? wx.Sizer hat definitiv ein "AddStrechSpacer()".
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Ich glaube eher, dass es ein "AddStretchSpacer()" hat...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
alan
User
Beiträge: 81
Registriert: Dienstag 10. April 2007, 11:30

autsch.

Das war aber nur ein Schreibfehler von mir im Posting, im Code steht AddStretchSpacer (s.o.)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Ah. Nachdem es auch im Traceback so stand, hab ich nicht näher nachgeschaut, aber du hast wohl den Traceback abgetippt.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

``AddStretchSpacer()`` gibt es seit wxPython 2.6 und ist direkt an wx.Sizer gebunden.

Als Ersatz kannst du ``<sizer>.Add((0, 0), 1)`` verwenden.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten