Checkbutton Frage/Problem - Anregung gesucht

Fragen zu Tkinter.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@BlackJack:
Wenn Du erst nachlesen musst was ein Generatorausdruck ist, wie kommst Du denn dann dazu einen zu schreiben? Wenn Du dort eine Liste haben möchtest, warum schreibst Du dann einen Generatorausdruck und keine „list comprehension” (LC). Oder halt eine Schleife wie man sie schreiben würde wenn man weder Generatorausdruck noch LC kennt‽
Laut Sirius3 sollte ich StringVar am besten in eine liste packen darauf is das ganze ja erst entstanden.
Hab ja auch in meinem vorherigem post auch geschrieben das ich " <generator object <genexpr> at 0x2d0bd70> " bekommen habe und deswegen danach gesucht habe.

Hätte das Stückchen Code mit dem Geschlecht nicht dummerweise geposted hätte es keine gesehen, hab es aber abgändert.......

Was binde ich denn immer noch zuviel an das Objekt?

Wie sagt man so schön? Probieren geht über studieren, klar probier ich rum da ich keine Ahnung habe wo nun das Problem genau liegt. Ich finde auch nix im Internet was ähnlich vom Problem her aufgebaut is und meine Bücher sind da braucht man gar nicht drüber reden.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: Wenn Du es nicht selbst herausfinden willst, warum sind "self.studie", "self.serie" oder "self.label_data" ans Objekt gebunden?
Dass Du die StringVars in eine Liste packen sollst ist doch gar nicht falsch, Du hast aber scheinbar immer noch nicht verstanden warum, sonst würdest Du nicht immer wieder fragen. Das Problem ist ja, dass Variablen mit falschen Typen an Funktionen übergeben werden, die dann irgendetwas seltsames damit anstellen, was nicht zu dem gewünschten Ergebnis führt. Tk ist in dieser Hinsicht sehr großzügig, was die Fehlersuche nicht unbedingt einfacher macht.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@Sirius3: Mal ganz langsam bitte, wie kommst du drauf das "self.label_data" ein der Checkbox hängt? da steht doch nur in der "onvalue" self.serie und self.studie und wird auch nicht irgendwie in der Checkbox verwendet. Oder reden wir hier nicht mehr von der Checkbox :shock: ?????

Wenn ich das ganze nicht in die Liste packe wird doch immer nur der letzte wert der Checkbox übertragen, der erste wird dann immer überschrieben oder geht verloren oder wie auch immer, jedenfalls ist er nicht da. Soweit waren wir doch schon....
Das mit der Liste hatte das Problem gelöst, nur das jetzt dieses komische "generator" gedönse auftaucht und mir neue Probleme bereitet nervt einfach.
Ich bekomm ja nicht mal Fehlermeldungen, nur Ausgaben die nichts aussagen.

Ich hab extra eine Funktion noch geschrieben die mir das ganze in eine Datei schreibt was genau übertragen wird und da wird nur der ausgewählte Radio-Button richtig übertragen ansonsten kommt irgendwelche grütze die meilen weit davon entfernt ist was eigentlich dort hätte stehen müssen. (Von den Checkboxen her))
BlackJack

@Kalli87: `self.label_data` wird ganz offensichtlich auf `self` als Attribut gesetzt. Warum? Und nein das hat nichts mit der `Checkbox` zu tun.

Dieses „"generator" gedönse” taucht ja nicht einfach so aus dem nichts auf, das hast *Du* ja in das Programm eingebaut. Schreib keinen Generatorausdruck wenn Du keinen Generatorausdruck haben möchtest. :K
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: Du hast scheinbar so wenig von Deinem eigenen Programm verstanden, dass Du nicht merkst, dass BlackJack oder ich von ganz unterschiedlichen Dingen reden. Programmieren heißt immer, dass man ein komplexes Problem in einfachere Teile zerlegt, diese löst und dann das ganze zu komplizierteren Konstrukten zusammensetzt. Wenn Du das einfache Problem (eine Checkbox) gelöst hast, mußt Du nun das komplexere Problem (viele Checkboxen) lösen, indem Du die Standardlösung eins -> viele anwendest, die bei allen ähnlichen Problemen anwendbar ist: Listen.
Ich würde Dir empfehlen, weg von den Checkboxen, hin zu einem simplen Problem zu gehen, an dem Du das Problem eins -> viele üben kannst. So wie jetzt kommen wir glaube ich nicht weiter. Beispiel: eine Zahl verdoppeln, viele Zahlen verdoppeln.

Ich habe nie gesagt, dass "self.label_data" an irgendwelchen Checkboxen hängen, sondern gefragt warum label_data an self hängt?
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

So ich hoffe ihr habt Ostern gut überstanden ;)
Ich hab die freien Tage genutzt um mal abzuschalten und hab mir heute den Code mal angeschaut und hab es nun so gelöst.

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.liste=('Serie: {} Studie: {}'.format(str(serie),str(studie)))
                self.checkbox.append(self.liste)

                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.liste ,variable=self.checkbox, onvalue=self.liste,command=self.list_checkbox,offvalue="", ).grid(row=row, column=5)
Jetzt haut auch die Ausgabe mit "print" hin und bei "text" wird es auch richtig ausgegeben.
BlackJack

@Kalli87: Da wird immer noch zu viel an das Objekt gebunden und mindestens zwei Namen sind total falsch und irreführend.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@BlackJack: Du schaffst es auch immer wieder meine kleinen Erfolgserlebnisse kaputt zu machen :P
Ps.: Bissl Spaß muss auch mal sein ;)
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: Du hast immer noch die irrsinnige Zuweisung der Checkbox-Liste an das variable-Argument. Was glaubst Du soll das bewirken? self.liste ist neben der Tatsache, das das kein Attribut sein sollte, zudem noch ein schlechter Variablenname. Die str-Aufrufe im format sind überflüssig. Für was brauchst Du die checkbox-Liste jetzt überhaupt noch?
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@Sirius3: Das meine Checkbox extrem zugemüllt ist mir bewusst. Das mit dem str-Aufruf hab ich behoben. self.liste heißt nicht mehr self.liste und der code sieht mittlerweile auch bissl anders aus aber auch nur minimal.
Was ich jetzt noch brauche oder machen will bzw. lösen muss ist das jede Checkbox ihren eigenen Wert hat also von studie und serie, aber bis jetzt is es eher so das jede checkbox alle werte hat von studie und serie wenn ich diese aktiviere was natürlich müll is.

Ps.: Mal eine Frage am rand, warum wird mein Code eigentlich immer so hart auseinandergenommen und so kritisiert? Ich weiß ja selbst das der wirklich nicht schön und auch an gewissen stellen mehr als überflüssig is.
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: 17750
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: 17750
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: 17750
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)
Antworten