Checkbutton Frage/Problem - Anregung gesucht

Fragen zu Tkinter.
BlackJack

@Kalli87: Zur Frage am Rand: Das passiert nicht nur bei Deinem Code. Wenn man Fehler sieht die nahelegen das jemand etwas nicht vollständig verstanden hat oder so wichtige, grundlegende Sachen wie schlechte Namensgebung, sollte man da dann etwa nichts sagen? Das führt letztendlich nur zu Folgeproblemen wenn man das nicht angeht.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: nimm's nicht persönlich. Die Kritik soll Dir helfen, selbst an Deinem Code zu arbeiten. Jeder unnötige Balast macht ihn schwerer Lesbar, auch für Dich. Funktionen sollen möglichst gekapselt sein, also so wenig Interaktion mit der Außenwelt haben wie möglich. Weil jede Interaktion eine potentielle Fehlerquelle ist. Unsinnige Attribut-Zuweisungen sind so ein Fall.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@BlackJack und @Sirius3: Ach quatsch! Darüber braucht ihr euch keinen Kopf machen das ich das persönlich nehme :) Der Thread heißt ja auch nicht umsonst
"Checkbutton Frage/Problem - Anregung gesucht" und außerdem will ich ja auch lernen ;) Nur das Ihr ab und zu darunter leiden müsst nehmt ihr ja schon in kauf und ich muss damit leben das eure Antworten ziemlich raffiniert verschlüsselt sind bzw. so umschrieben sind das man Sie auf Anhieb nicht versteht und ich diese teilweise mehrmals lesen muss um diese zu verstehen ;) Also ich seh es vollkommen gelassen obwohl es manchmal schon den Tag vermießen kann ;)
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Ich bräuchte mal nen Gedankenanstoß von euch :)
Und zwar möchte ich, hier in diesem Fall sinds 2 Checkbutton die aus der Schleife entstehen, so ansprechen das jeder seinen eigenen Wert hat.
Aktuell siehts eher so aus das jeder von diesen 2 alle Werte hat bzw jeder den letzten Wert hat, schöner is es wenn das getrennt wäre.
Das ganze hatte ich außerhalb der beiden "for-Schleifen" versucht aber ohne Erfolg.

Code: Alles auswählen

            self.cursor.execute("select bilder.studie_nr, bilder.serie_nr, bilder.image_nr from bilder, patient where patient.patnu=bilder.patnu and patient.patnu=%s", [self.eingabe.get()])
            self.checkbox=[]
            for row,(studie, serie, image) in enumerate(self.cursor, 1):
                label_data = \
                [
                    (row, 'lightblue'),
                    (self.datum_ausgabe, ''),
                    (image, ''),
                    (serie, ''),
                    (studie, ''),
                ]
                self.serie_studie=('Serie: {} Studie: {}'.format(serie,studie))
                self.checkbox.append(self.serie_studie)

                for column, (text, background) in enumerate(label_data):
                    Label(self.ueberframe, text=text, relief='sunken', anchor=CENTER, background=background).grid(row=row, column=column, sticky=NSEW)
                    Checkbutton(self.ueberframe,text=self.serie_studie,variable=self.serie_studie,command=self.list_checkbox).grid(row=row, column=5)
Über "command" hab ich es halt versucht mir das ganze irgendwie getrennt auszugeben was nicht funktionierte.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: zum allerletzten Mal, welche Variablen sollten **keine** Attribute von self sein? Und ich will jetzt mindestens zwei Variablen wissen :wink:
Und was für ein Typ muß das Objekt haben, das Du dem variable-Argument von Checkbutton übergibst?

Bevor Du wieder irgendwo anders herumprobierst, beantworte bitte diese zwei Fragen, sonst drehen wir uns hier noch bis Weihnachten im Kreis.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@Sirius3: :D ok ok bevor wir wirklich noch bis Weihnachten hier sitzen ;)
Ich hab jetzt bei "datum_ausgabe" und bei "serie_studie" das self entfernt ^^

Ich denke mal dass das Objekt vom Typ "liste" sein müsste.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Kalli87 hat geschrieben:Ich denke mal dass das Objekt vom Typ "liste" sein müsste.
Schade, zweiter Versuch ;-) Kleiner Hinweis: Du hattest es schon richtig.
Das Leben ist wie ein Tennisball.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@EyDu: Etwa wieder das mit dem StringVar? Hatte ehrlich gesagt gehofft das ich das so lösen konnte ^^ da hab ich mich wohl getäuscht
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: im Moment gerade ein IntVar, weil Du on- und off-Value wieder entfernt hast. "datum_ausgabe" hatte ich jetzt gar nicht auf dem Schirm, weil das von irgendwo außerhalb Deines Code-Schnipsles kam. Also bleibt noch mindestens ein Attribut das nicht sein sollte.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@Siruis3: Bist du dir da ganz sicher? Ich würde dir da jetzt voll widersprechen, aus dem Grund weil:
cursor liegt außerhalbe
ueberframe liegt ebenso außerhalb
list_checkbox liegt genauso außerhalb

Code: Alles auswählen

            
            self.cursor.execute("select bilder.studie_nr, bilder.serie_nr, bilder.image_nr from bilder, patient where patient.patnu=bilder.patnu and patient.patnu=%s", [self.eingabe.get()])
            self.checkbox=StringVar()
            for row,(studie, serie, image) in enumerate(self.cursor, 1):                
                checkboxen=[]
                label_data = \
                [
                    (row, 'lightblue'),
                    (datum_ausgabe, ''),
                    (image, ''),
                    (serie, ''),
                    (studie, ''),
                ]
                serie_studie=('Serie: {} Studie: {}'.format(serie,studie))
                checkboxen.append(self.checkbox)

                for column, (text, background) in enumerate(label_data):
                    Label(self.ueberframe, text=text, relief='sunken', anchor=CENTER, background=background).grid(row=row, column=column, sticky=NSEW)
                Checkbutton(self.ueberframe,text=serie_studie,variable=self.checkbox, onvalue=serie_studie, offvalue="",command=self.list_checkbox).grid(row=row, column=5)
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Problem besteht jetzt aber das immer nur ein Checkbutton aktiv bleibt, klick ich einen zweiten an is der erste deaktiviert
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Und das sind wir wieder am Anfang des Kreises angekommen... Lies dir doch bitte den gesamten Thread noch einmal in Ruhe durch und versuche die Ratschläge zu verstehen. Du korrigierst hier ständig einen Fehler und baust dafür einen alten wieder ein. Das ist Raten, nicht Programmieren.
Das Leben ist wie ein Tennisball.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@EyDu: Und das is das was ich nicht verstehe. Ich weiß das ich die StringVar an eine liste hängen muss, was ich ja auch mache. Aber trotzdem es nicht geht und da kann ich die ganzen Thread 5 mal lesen und ich seh es trotzdem nicht.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: Und wieviele StringVars hast Du in Deine Liste gehängt? Und achte darauf, was an self gebunden wird und was nicht :wink:.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@Siruis3: Danke weiß ich nicht mehr wo vorne oder hinten is :?
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

ok bitte mal Schritt für Schritt damit ich den Fehler mal sehe.
@Siruis3: Du fragst ja wie viele StringVar ich an meine Liste hänge.
Mit "self.checkbox=StringVar()" setze ich doch die Variable "self.checkbox" mit "StringVar()" fest.
Danach hänge ich das ganze mit "self.checkboxen.append(self.checkbox)" an meine Liste die ich vor der "for-Schleife" definiert hatte, das mit "self.checkboxen=[]".

Für mich heißt doch das im Klartext, da es durch die Schleife läuft, das immer was meine Liste gehangen wird.

Code: Alles auswählen

            
            self.cursor.execute("select bilder.studie_nr, bilder.serie_nr, bilder.image_nr from bilder, patient where patient.patnu=bilder.patnu and patient.patnu=%s", [self.eingabe.get()])
            checkboxen=[]
            for row,(studie, serie, image) in enumerate(self.cursor, 1):
                self.checkbox=StringVar()
                checkboxen.append(self.checkbox)
                label_data = \
                [
                    (row, 'lightblue'),
                    (datum_ausgabe, ''),
                    (image, ''),
                    (serie, ''),
                    (studie, ''),
                ]
                serie_studie=('Serie: {} Studie: {}'.format(serie,studie))
                for column, (text, background) in enumerate(label_data):
                    Label(self.ueberframe, text=text, relief='sunken', anchor=CENTER, background=background).grid(row=row, column=column, sticky=NSEW)
                Checkbutton(self.ueberframe,text=serie_studie,variable=self.checkbox, onvalue=serie_studie, offvalue="",command=self.list_checkbox).grid(row=row, column=5)
Und der zweiten Hinweis von dir darüber Grüble ich immer noch was du genau meinst.
Ich glaub langsam für eure Hinweise sollte man studiert haben ;)

ps.: Um am ende auf den Inhalt zu zugreifen muss ich doch mit get() arbeiten und das doch bei "self.checkbox.get()" da bekomm ich doch den genauen Inhalt raus. (sieht man hier jetzt natürlich nicht aber das stimmt soweit ich es erlesen habe)

pps.: Wo sitzt der Fehlerteufel? :evil:
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: na jetzt hast Du doch den wesentlichen Punkt schon wieder geändert. Also hätte ich ein "ah, jetzt hab ich's endlich kapiert und alles richtig gemacht" erwartet. Da zum Schluß aber eine Frage steht, schau doch nochmal an, was der Unterschied zwischen jetzt und vorher ist.

Zum hundertsten Mal "self": Variablen, die in einer Schleife geschrieben werden, sind höchst selten sinnvollerweise Attribute. Und "self.cursor" sollte kein "self" haben, weil cursor etwas kurzlebiges sind, die man sich nicht über einen Methodenaufruf merken muß.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@Siruis3: Ich weiß das du genauso langsam kochst wie ich :D aber das mit dem cursor is sicher jetzt nicht das Problem was ich hier habe.

War meine Schritt für Schritt Erklärung falsch oder richtig?? Und nein ich habs immer noch nicht kapiert warum das mal so und dann mal so is.
Ich hab mir mehr als 4 verschiedene Varianten angeschaut es versucht nachzuvollziehen und auch für meine Sache umzusetzen aber *piep* Axt im Wald es funktioniert immer nur ein Checkbutton richtig.

p.: Langsam könnte ich :cry:

Eine vernünftige Erklärung wäre echt toll.....
Und bitte, und ich bitte euch wirklich, lasst jetzt bitte diese komischen Hinweise, mir brumt der Schädel......
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Sorry für meinen kleinen Nervenzusammenbruch gestern aber sich immer wieder im Kreis zu drehen kann einen schon echt an den Rand der Verzweiflung bringen. Also sorry nochmal :oops:
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Ich versuch mein Glück nochmal obwohl das vllt schon arg ausgereitzt wurde.

Code: Alles auswählen

            checkboxen=[]
            self.checkbox=[]
            for row,(studie, serie, image) in enumerate(cursor, 1):
                self.checkbox=(StringVar())
                checkboxen.append(self.checkbox)
                label_data = \
                [
                    (row, 'lightblue'),
                    (datum_ausgabe, ''),
                    (image, ''),
                    (serie, ''),
                    (studie, ''),
                ]
                serie_studie=('Serie: {} Studie: {}'.format(serie,studie))

                for column, (text, background) in enumerate(label_data):
                    Label(self.ueberframe, text=text, relief='sunken', anchor=CENTER, background=background).grid(row=row, column=column, sticky=NSEW)
                Checkbutton(self.ueberframe,text=serie_studie,variable=self.checkbox, onvalue=serie_studie, offvalue="",command=self.list_checkbox).grid(row=row, column=5,sticky=E)
Ich hab mir jetzt die Seiten hier im Thread mehrmals gelesen und bin auf gewisse Dinge gestoßen.
Der Code hier funktioniert ja soweit bis auf das Problem was schon ganz am Anfang beschrieben wurde und was jetzt wieder aufgetreten ist, sprich nur ein Checkbutton funktiniert richtig.

Jetzt zu dem was ich erlesen haben. Ihr schreibt das die StringVar in eine Liste übertragen/gespeichert werden müssen damit das Checkbuttons richtig funktionieren, wenn ich das richtig verstanden habe.
Meine Vermutung war ja das ich so:
checkboxen=[]
self.checkbox=StringVar()
checkboxen.append(self.checkbox)
das ganze in eine liste speichere. (Jetzt nur mal grob dargestellt der eigentliche code steht ja darüber)
Kommt das so ungefähr hin?

Meine frage dazu wäre aber wenn ich die StringVar in eine liste packe wie hier in diesem Fall funktioniert ja trotzdem nur der eine Checkbutton richtig. Daher denk ich dass das so nicht richtig funktioniert.

Der nächste Versuch den ich unternommen hatte war:
checkboxen.append(StringVar())
so würde ich die StringVar direkt in die Liste speichern statt wie oben beschrieben.
Das Problem was dabei aber aufkommt ist, das ich dann nicht mehr mit get() arbeiten kann da eine Listen-Objekt nie das Attribut "get" hat.
Da kommt mir natürlich in den Sinn wie ich dann auf die gespeicherten Dinge in der Liste zu greifen kann wenn das nicht mit "get" geht?
Ohne "get" sieht ja die ausgabe so aus: <tkinter.StringVar object at 0x2809310>

Ein anderer Hinweis von euch war "vergleiche den "on"-Wert der Checkbutton.
Meine Frage dazu wäre: Wie denn? In keinem Beispiel was ich gesucht und gefunden habe wurde der "on"-Wert verglichen.

Ein anderer Hinweis war das die "self.checkbox=StringVar()" überschrieben wird, da diese ja in der Schleife steht, spaßeshalber hatte ich Sie vor die Schleife gesetzt und schon ging ja das ganze mit der Wertübergabe aber dafür gingen die Checkbuttons nicht mehr richtig. Da immer nur einer Aktiv bleiben konnte. Bzw. deswegen sollte ich diese in eine Liste speichern aber da gabs ja wieder ein anderes Problem was ich schon beschrieben habe.

Im großen und ganzen kann ich jetzt sagen das alles mit der StringVar zusammenhängt, wo Sie steht und wie diese verwendet werden soll.


Zum Abschluss jetzt meine genaue Frage/Fragen:
Wie soll ich nun weiter verfahren?
Welcher Hinweis ist nun der für mich am geeignetsten oder sind alle Hinweise für mich relevant?


Danke

Edit: Was unterstrichen ist wurde hinzugefügt
Antworten