Alle Checkboxen eines Dialogs mit ner For-Schleife durchgehe

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Silmaril
User
Beiträge: 55
Registriert: Sonntag 21. September 2008, 17:10
Wohnort: Franken

Hallo, zusammen.

Ich habe ein Dialog und möchte beim drücken eines Buttons die Werte aller Checkboxen dieses Dialogs abfragen. Im Dialog sind (momentan) 24 Checkboxen und ich möchte weder alle einzeln ansprechen noch soetwas in der Art verbrechen:

Code: Alles auswählen

for i in range(23):
    Liste.append(eval('self.checkbox_' + i + '.GetValue()'))
Zwar bekommt eval da keine Benutzereingaben aber trotzdem ist das hässlich.

von wx.CheckListBox und der dort vorhandenen Methode GetChecked(self) habe ich zwar auch schon gehört, aber wxGlade kann das nicht, und selbst habe ich keine Ahnung wie ich soetwas zu Fuss aufbauen kann.

Ich hätte daran gedacht alle Objekte des Dialogs auf die Abstammung von wx.CheckBox hin zu vergleichen und dann ein .GetValue() anzuwenden. Oder vielleicht gibt es auch eine Möglichkeit alle checkboxen zu bekommen.

Wie würdet ihr das machen?
Lebe jeden Tag, als wäre es Absicht.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

An welchem Punkt in deinem Gedankengang bist du auf die Idee gekommen es wäre sinnvoll die Liste der Checkboxen durchzunummerieren und die Liste wegzuschmeissen?
Silmaril
User
Beiträge: 55
Registriert: Sonntag 21. September 2008, 17:10
Wohnort: Franken

DasIch hat geschrieben:An welchem Punkt in deinem Gedankengang bist du auf die Idee gekommen es wäre sinnvoll die Liste der Checkboxen durchzunummerieren und die Liste wegzuschmeissen?
Ich hatte noch nie ein Liste der Checkboxen. :?:

Edit: Ach, gehst du vl davon aus, dass ich die Checkboxen vor den generieren in einer Liste vorbereitet habe? Dann muss ich dich enttäuschen. Ich benutze wxGlade. Das generiert die Checkboxen und ich versuche jetzt an all diese elegant heranzukommen.
Zuletzt geändert von Silmaril am Montag 23. November 2009, 15:54, insgesamt 1-mal geändert.
Lebe jeden Tag, als wäre es Absicht.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Wenn eine Checkbox aktiviert / deaktiviert wird, wird ein Event ausgelöst, das kannst du nutzten um die Werte zu speichern

Beispiel aus dem "Another Tutorial" ein bisschen abgeändert:

Code: Alles auswählen

#!/usr/bin/python

# checkbox.py

import wx

class MyCheckBox(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(250, 170))

        self.cb1value = False

        panel = wx.Panel(self, -1)
        self.cb = wx.CheckBox(panel, 11, 'Bluff', (10, 10))
        self.cb.SetValue(False)

        self.Bind(wx.EVT_CHECKBOX, self.on_checkbox1, id=11)

        self.Show()
        self.Centre()

    def on_checkbox1(self, event):
        self.cb1value = event.IsChecked()
        print self.cb1value


app = wx.App(0)
MyCheckBox(None, -1, 'checkbox.py')
app.MainLoop()
das kann man noch verbessern / verfeinern
the more they change the more they stay the same
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Silmaril hat geschrieben:Ich hatte noch nie ein Liste der Checkboxen. :?:
Dann wäre es Zeit eine zu nutzen.
Silmaril
User
Beiträge: 55
Registriert: Sonntag 21. September 2008, 17:10
Wohnort: Franken

DasIch hat geschrieben:
Silmaril hat geschrieben:Ich hatte noch nie ein Liste der Checkboxen. :?:
Dann wäre es Zeit eine zu nutzen.
Für was, wenn ich mir die Oberfläche von wxGlade generieren hab lassen? Hoffentlich kommt jetzt nicht, ich solle das doch schön selbst machen. wxGlade ist eine große Arbeitserleichterung.

@dav1d: Leider hilft es mir wenig weiter, für die Checkboxen ne eigene Klasse zu bauen.[/b]
Lebe jeden Tag, als wäre es Absicht.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Hier gings nicht um die Klasse sondern um die Events und wie DasIch schon gesagt hat wär ne Liste nicht schlecht

Bsp:

Code: Alles auswählen

#!/usr/bin/python

# checkbox.py

import wx

class MyCheckBox(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(250, 170))

        self.checkboxes = list()

        panel = wx.Panel(self, -1)
        self.cb1 = wx.CheckBox(panel, 11, 'Bluff', (10, 10))
        self.cb1.SetValue(False)
        self.checkboxes.append(self.cb1)

        self.cb2 = wx.CheckBox(panel, 12, 'Foo', (30, 30))
        self.checkboxes.append(self.cb2)
        
        self.cb3 = wx.CheckBox(panel, 13, 'Bar', (50, 50))
        self.checkboxes.append(self.cb3)

        #self.Bind(wx.EVT_CHECKBOX, self.tu_was) # Beispiel Event
        self.Bind(wx.EVT_MOVE, self.tu_was) # Beispiel Event

        self.Show()
        self.Centre()

    def tu_was(self, event):
        '''Get the values of all checkboxes in the self.checkboxes list'''
        #Diese Funktion wird aufgerufen wenn du sie brauchst ;)
        #und dient nur als Beispiel!
        for checkbox in self.checkboxes:
            print checkbox.IsChecked()

app = wx.App(0)
MyCheckBox(None, -1, 'checkbox.py')
app.MainLoop()
//Edit: n' schöneres Event gefunden :twisted: (wx.EVT_MOVE)
Zuletzt geändert von Dav1d am Montag 23. November 2009, 16:16, insgesamt 1-mal geändert.
the more they change the more they stay the same
Silmaril
User
Beiträge: 55
Registriert: Sonntag 21. September 2008, 17:10
Wohnort: Franken

Dav1d hat geschrieben:Wenn eine Checkbox aktiviert / deaktiviert wird, wird ein Event ausgelöst, das kannst du nutzten um die Werte zu speichern
Hm... also jetzt habe ich mir das genauer angeschaut.

Heißt das, ich kann ein einziges Event an alle Checkboxen binden mit

Code: Alles auswählen

self.Bind(wx.EVT_CHECKBOX, self.on_checkbox1, id=11)
Und wie bekomme ich dann heraus welche checkbox verändert wurde?
Lebe jeden Tag, als wäre es Absicht.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

mit id=11 bindest du das Event an eine Checkbox und zwar an die mit der Id 11, das Beispiel das ich zuletzt gepostet hab, ist sinnvoller wenn man viele Checkboxen hat (so wie du)

Das Beispiel mit den Events finde ich für wenige Checkboxen besser
the more they change the more they stay the same
Silmaril
User
Beiträge: 55
Registriert: Sonntag 21. September 2008, 17:10
Wohnort: Franken

Dav1d hat geschrieben:mit id=11 bindest du das Event an eine Checkbox und zwar an die mit der Id 11, das Beispiel das ich zuletzt gepostet hab, ist sinnvoller wenn man viele Checkboxen hat (so wie du)

Das Beispiel mit den Events finde ich für wenige Checkboxen besser
Werds mal ausprobieren. Danke!
Lebe jeden Tag, als wäre es Absicht.
Silmaril
User
Beiträge: 55
Registriert: Sonntag 21. September 2008, 17:10
Wohnort: Franken

[quote="Dav1d"]
Bsp:

Code: Alles auswählen


        self.cb2 = wx.CheckBox(panel, 12, 'Foo', (30, 30))
        self.checkboxes.append(self.cb2)
Sorry, deine Antwort habe ich übersehen.

Ich halte also fest. Entweder ich habe 24mal die Zeile:

Code: Alles auswählen

ne_Werteliste.append(self.checkbox_0.GetValue())
Jeweils mit dem richtigen Namen der Checkbox

Oder ich mach das ganze mit eval() (siehe oben). Der Vorteil wäre die Code-Einsparung.

Oder ich habe 24mal die Zeile

Code: Alles auswählen

self.checkboxes.append(self.ceckbox0)
Und dann noch die Iteration über checkboxes in meinen Eventhandler für den Ok-Button.

Mal sehen. Heute kann ich es eh nicht mehr fertig machen.

Danke euch!
Lebe jeden Tag, als wäre es Absicht.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.

Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Beachte die Fett geschriebenen Zeilen

und man kann auch das Hinzufügen zur Liste kürzen

Code: Alles auswählen

checkboxes = list()
for i in xrange(23):
    cb = wx.CheckBox(self, -1, 'Foo bar')
    checkboxes.append(cb)
//Edit: Kleine Fehler im Code ausgebessert
the more they change the more they stay the same
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Was hast du davon, wenn du 24 Checkboxen hast aber nicht weiteres mit ihnen anzufangen weißt?

Wie verbindest du denn den Inhalt mit der CB?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Antworten