Seite 1 von 1

wxDialog: CreateButtonSizer

Verfasst: Mittwoch 29. August 2007, 21:36
von alan
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?

Re: wxDialog: CreateButtonSizer

Verfasst: Mittwoch 29. August 2007, 22:08
von gerold
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
:-)

Verfasst: Mittwoch 29. August 2007, 22:23
von gerold
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
:-)

Verfasst: Mittwoch 29. August 2007, 22:38
von alan
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 ;-)

Verfasst: Donnerstag 30. August 2007, 11:34
von alan
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()".

Verfasst: Donnerstag 30. August 2007, 11:49
von birkenfeld
Ich glaube eher, dass es ein "AddStretchSpacer()" hat...

Verfasst: Donnerstag 30. August 2007, 11:55
von alan
autsch.

Das war aber nur ein Schreibfehler von mir im Posting, im Code steht AddStretchSpacer (s.o.)

Verfasst: Donnerstag 30. August 2007, 12:26
von birkenfeld
Ah. Nachdem es auch im Traceback so stand, hab ich nicht näher nachgeschaut, aber du hast wohl den Traceback abgetippt.

Verfasst: Donnerstag 30. August 2007, 12:34
von gerold
``AddStretchSpacer()`` gibt es seit wxPython 2.6 und ist direkt an wx.Sizer gebunden.

Als Ersatz kannst du ``<sizer>.Add((0, 0), 1)`` verwenden.