Seite 1 von 1

Alle Checkboxen eines Dialogs mit ner For-Schleife durchgehe

Verfasst: Montag 23. November 2009, 12:56
von Silmaril
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?

Verfasst: Montag 23. November 2009, 15:21
von DasIch
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?

Verfasst: Montag 23. November 2009, 15:51
von Silmaril
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.

Verfasst: Montag 23. November 2009, 15:51
von Dav1d
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

Verfasst: Montag 23. November 2009, 15:54
von DasIch
Silmaril hat geschrieben:Ich hatte noch nie ein Liste der Checkboxen. :?:
Dann wäre es Zeit eine zu nutzen.

Verfasst: Montag 23. November 2009, 16:04
von Silmaril
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]

Verfasst: Montag 23. November 2009, 16:13
von Dav1d
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)

Verfasst: Montag 23. November 2009, 16:15
von Silmaril
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?

Verfasst: Montag 23. November 2009, 16:18
von Dav1d
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

Verfasst: Montag 23. November 2009, 16:44
von Silmaril
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!

Verfasst: Montag 23. November 2009, 17:04
von Silmaril
[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!

Verfasst: Montag 23. November 2009, 17:14
von Dav1d
>>> 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

Verfasst: Montag 23. November 2009, 17:53
von jbs
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?