Matrix in Tkinter und Attribute Error

Fragen zu Tkinter.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Neun, das siehst du falsch. Da muss nichts neu aufgebaut werden. Im Gegenteil, das zu tun würde zu Flickern und anderen unschönen Effekten führen.
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

Super, das hört sich ja gut an. Dann muss ich es nochmals versuchen.
Vor ein paar Tagen hatte ich schon mal versucht, testweise die Color Attribute zu setzen - ohne Erfolg
>>> liste_vars (matx.vars[55j.config (fg = "red")) <<<

Code: Alles auswählen

for j in range(0, mat_size):
     matx.vars[j].set(liste_vars[j])

matx.vars[55].config (fg = "red")
        
#entry=(tk.Entry(master=frame, textvariable=vars[55],   justify="center", width=3, fg = "red", font=('arial',12)))
#entry.pack()
Leider klappt es wieder nicht.
"matx.vars[55]. config" bringt >>> AttributeError: 'StringVar' object has no attribute 'config'
der Versuch mit "entry ....." bringt Farbe ins Leben, aber in angehängten Feldern.

Bei diskreten Entries hatte ich in früheren Programmen Erfolg, aber mit dieser Matrix nicht
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@KlausP: Natürlich haben `StringVar`-Objekte keine `config()`-Methode. Objekte haben nicht auf magische Weise die Attribute und Methoden die man gerne hätte, sondern die, die der jeweilige Typ halt *hat*. Wenn Du die Farbe von einem `Entry`-Objekt ändern willst, dann brauchst Du — Überraschung — das `Entry`-Objekt von dem Du die Farbe ändern willst.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

@__blackjack__
ok, verstanden.

Das erste Beispiel eines anderen Programmes funktioniert:

Code: Alles auswählen

feld_anz_grp = tk.Entry(frame_mid, width=4, font=('arial', 14),  textvariable = such.anz_grp, bg='gray98', justify="center"
feld_anz_grp.grid(column=2, row=3, padx=3)
#.....
feld_anz_grp.config(bg = "lightyellow")
# hier brauche ich mich jedoch nicht auf die Textvariable Nummer 55 beziehen -----


# aber hier bei der Matrix habe ich 81 Entries.
entry=(tk.Entry(master=frame, textvariable=vars[-1],  justify="center", width=3, bg = color, font=('arial',12)))

entry(vars[55]).config (fg = "red") 
# -> TypeError: 'Entry' object is not callable


entry.config (fg = "red") 
# das bringt keinen Fehler;  färbt mir allerdings die letzte Entry ein  -  das nutzt mir nix.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@KlausP: Programmieren durch raten funktioniert nicht. Eigentlich müsstest Du wissen wie es geht, denn passenden Code hast Du schon mal gesehen, aber offensichtlich nicht wirklich verstanden. Du müsstest wahrscheinlich bei der GUI eine kleine Pause einlegen und Dich mit objektorientierter Programmierung, Datentypen, und Schleifen noch mal gründlicher auseinandersetzen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

Das habe ich bereits getan. Und diese aktuelle Geschichte löst sich nicht durch einen zweiten Einsteigerkurs.
OOP und GUI sind zweierlei Dinge; was soll dieser Kommentar?

Man sitze auf dem Olymp und diktiere den Usern, dass Fachwissen das non-plus-ultra sei.
Zeit für Kunst, Sport oder Hobbies aufzuwenden, wird verabscheut.

Anyway, das Subjekt ist inzwischen gelöst.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

GUI ist fundamental OOP. Egal in welchem Kontext. Denn Python kennt da keinen Unterschied. Es gibt keinen Anfängermodus, der irgendwie einfacher wäre.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@KlausP: OOP und GUI sind eben nicht zweierlei Dinge. OOP ist Voraussetzung um sinnvoll GUI-Code zu schreiben. Man kann dann beides zusammen lernen, und mit GUIs kommt noch neu die ereignisorientierte Programmierung hinzu, die auch mit ein Grund ist, warum man OOP braucht — denn man muss sich dann Zustand über Aufrufe hinweg merken, wo Funktionen dann nicht mehr reichen. Man kann da noch eine gewisse Strecke mit Closures überbrücken, aber a) skaliert das nicht, und b) ist OOP in Python der dafür vorgesehen Weg, auch wenn man natürlich OOP durch Closures ”ersetzen” kann. Oder man macht es sich eventuell etwas einfacher, indem man erst OOP-Grundlagen lernt, und dann erst GUI und was sich da so ändert, gegenüber linear abgearbeiteten Code, der die volle/feste Kontrolle über die Abarbeitungsreihenfolge hat.

Deine Probleme berühren auch OOP, weil in Python ja alles ein Objekt ist und welche Methoden ein Objekt hat oder halt auch nicht, und wie es sich mit Operatoren verhält, wird durch die Klasse bestimmt, die Vorlage für das jeweilige Objekt ist. Ganz konkret war ja das ein Problem, dass Du Code geschrieben hast der `StringVar`-Objekte so behandeln wollte als wären es `Entry`-Objekte. Und das gleiche hast Du in einem anderen Thema hier ja auch schon mal genau anders herum gehabt, da wolltest Du eine Methode die `StringVar`-Objekte haben (`set()`), ganz gerne auf `Entry`-Objekten aufrufen.

Wenn man beides braucht, ist eine naheliegende, saubere Lösung, sich einen eigenen Typ zu schreiben, der alles verhalten was man da so braucht anbietet. Also auch wieder OOP.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und obendrein ist eine Entry-basierte (oder auch jedes andere fertige Text/Nummern-Widget von tk) Loesung eh nicht wirklich sinnvoll. Denn fuer Sudoku will man ja sowas wie wahlweise leer, eine Zahl, oder eine Reihe von Kandidaten-Zahlen. Dazu bietet sich viel eher eine canvas-basierte Darstellung an. Das ohne OO ist auch nicht sinnvoll moeglich.
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

nun ja:
OOP ist schon komplex - aber ebenso die Syntax - beides muss man sich aneignen.
Und das braucht Zeit und Übung.
Mit tk Entries und Labels hatte schon gearbeitet. Eine var nun als Liste, war neu für mich.
Na ja, ich will das nicht weiter kommentieren.
Ich lerne per Projekt, wo ich weiter will. Bzw. ich möchte ein Projekt realisieren. Und habe auch Freude daran.
Wenn ich mit OOP oder was auch immer von der Pike auf anfange, bin ich bei meinem Alter bestimmt inzwischen tot umgefallen.
Ja Python ist eine Schlange, die zwar gut und mächtig ist, die einen aber auch zeitlich würgt.

Soweit das. Immerhin bin ich inzwischen erheblich weitergekommen; muss aber leider doch an anderer Stelle wieder posten.
Manches "offensichtliche" klappt nicht immer wie erwartet ;-)

@_deets_
Ja Canvas ist sicherlich interessant; hatte auch schon kurz damit angefangen.
Wollte gerne Funktionen und Integrale darstellen; aber das führt derzeit zu weit.
Antworten