Matrix in Tkinter und Attribute Error

Fragen zu Tkinter.
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

Hallo Team,
mit dem a. Programm habe ich eine 9 x 9 Matrix mit Feldern als tk.StringVar() und entsprechender Liste 'vars' angelegt.
In die Felder möchte ich Werte eintragen und diese speichern.
Da ich die Daten auch als Sicht auf Zeilen, Spalten, Cubes und Gesamtliste betrachten möchte, habe ich eine class 'Matrix‘ angelegt.
Wenn ich auf den Buttton Speichern drücke, erhalte ich allerdings die Fehlermeldung
> AttributeError: type object 'Matrix' has no attribute 'vars'
Diesen Fehler bekomme ich diesmal nicht gelöst.
Ich wundere mich auch, warum ‚type object‘ und nicht ‚class object‘.
Allerdings habe ich mit der Behandlung von tk.Listen schon Probleme.
Mit dem Ansatz von Entry Widjets bin ich gar nicht klargekommen.
Im diesem Beitrag werden sie auch nicht einem tkinter Fenster oder Feld zugeordnet.
https://stackoverflow.com/questions/326 ... ry-widgets
Vielen Dank für eure Hilfe

Code: Alles auswählen

import tkinter as tk
from functools import partial
import unicodedata

def gui(ausgabe = ''):

    global i
    global entry
    entry =""
    global entries
    entries = []

    class Matrix():
        def __init__(self, entries, vars):   
             self.entries    = entries
             self.vars       = vars
             #self.elements  = elements
             
       
    def chg_col_y():
        col_now = col_now_y
        if col_now == col_ay:
            col_now = col_by
        else:
            col_now = col_ay
        return col_now

    def tast_laden(Matrix):
        print ("Liste laden")
                
    def tast_save(Matrix):
        print ("Listen speichern")
        #liste_entries = matrix.entries.get()
        #print ("im Makro Taste save - erste Entry ", liste_entries[0])
        liste_vars = Matrix.vars.get()
        print ("im Makro Taste save - erste Var ", liste_vars[0])
       
        

    # HIER FÄNGT DER MAIN-LOOP AN
    
    root = tk.Tk()

    rel = tk.StringVar()
    rel = tk.RAISED

    Eing_txt = tk.StringVar()
    
    entries = []
    Liste_Ein = []

    global col_ay, col_by

    col_ay = "white smoke"
    col_by = "floral white"
   
    col_now_y = col_ay
    col = col_now_y

    dir_pc  = "E:\\"
    dir_tab = ""
    dir = dir_pc

    dateiname = "sudo_g.txt"
    dateipfad = dir + dateiname

    root.title("Sudoku")
    rahmen = tk.Frame(root, relief="ridge", borderwidth=3)
    rahmen.pack(fill = "both", expand = 1)

    frame_left = tk.Frame(rahmen, width=400, height =500, relief="ridge", borderwidth=3)
    frame_left.grid(column=0, row=0)
    
    vars = []
    for i in range(1,10): #Rows
        
        if (i-1) % 3 == 0:
            col_now_y = chg_col_y()
            col = col_now_y
                
        for j in range(1,10): #Columns
            var = tk.StringVar()
            vars.append(var)
            if j % 3 == 0: bw=2
            else: bw = 1
            frame_i = tk.Frame(
                master=frame_left,
                relief=rel,
                borderwidth=bw
            )

            frame_i.grid(row=i, column=j,  columnspan = 1, rowspan = 1)
            
            entry=(tk.Entry(master=frame_i, textvariable=vars[-1], width=5, bg = col))
            
            entries.append(entry)
            entries.insert(5, "abc")                      
            entry.pack()

    
    matx  = Matrix(entries, vars)            

    frame_right = tk.Frame(rahmen, width=300, height =500, relief="ridge", borderwidth=3)
    frame_right.grid(column=1, row=0, sticky='n')

    
    taste_laden = tk.Button(frame_right, width = 12, text="Werte laden", font=('arial', 12), 
                               command = partial(tast_laden), bg="old lace")
    taste_laden.grid (column=0, row=0, sticky='n', pady=0, padx=0)

    taste_speichern = tk.Button(frame_right, width = 12, text="Werte speichern", font=('arial', 12), 
                               command = partial(tast_save, Matrix), bg="old lace")
    taste_speichern.grid (column=0, row=1, pady=0, padx=0)


    root.mainloop()

    
if __name__ == "__main__":
    gui()

Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Vergiss erst einmal, dass es `global` überhaupt gibt. Auch definiert man nicht Klassen und Funktionen innerhalb einer anderen Funktion.
Die `gui`-Funktion ist auch viel zu lang, um sie komplett zu verstehen.
Man initialisiert Variablen erst, wenn man sie braucht und nicht schon viele Zeilen vorher. Die ersten Werte von `entry` und `entries` werden gar nicht benutzt.
Die StringVar-Instanz `rel` wird nicht verwendet. `Eing_txt`, `Liste_Ein` und `dateipfad` werden nicht verwendet.
Das Argument `ausgabe` wird auch nicht verwendet.
Benutze keine kryptischen Abkürzungen. Pfade werden nicht per + zusammengestückelt.
Alles was eine Funktion braucht, muss sie auch über ihre Argumente bekommen.
Das `entries.insert` verstehe ich nicht.
Und das eigentliche Problem ist, dass die Klasse nicht das selbe ist, wie eine Instanz der Klasse.

Code: Alles auswählen

import tkinter as tk
from functools import partial
from itertools import cycle

class Matrix():
    def __init__(self, entries, vars):   
         self.entries = entries
         self.vars = vars
         #self.elements = elements

def tast_laden():
    print("Liste laden")
                
def tast_save(matrix):
    print("Listen speichern")
    #liste_entries = matrix.entries.get()
    #print ("im Makro Taste save - erste Entry ", liste_entries[0])
    print("im Makro Taste save - erste Var ", matrix.vars[0].get())
       
        
def gui():
    root = tk.Tk()
    root.title("Sudoku")
    rahmen = tk.Frame(root, relief="ridge", borderwidth=3)
    rahmen.pack(fill = "both", expand = 1)

    frame_left = tk.Frame(rahmen, width=400, height =500, relief="ridge", borderwidth=3)
    frame_left.grid(column=0, row=0)
    
    vars = []
    entries = []
    colors = cycle(["white smoke", "floral white"])
    for row in range(1, 10):
        if (row-1) % 3 == 0:
            color = next(colors)
        for column in range(1, 10):
            var = tk.StringVar()
            vars.append(var)
            borderwidth = 2 if column % 3 == 0 else 1
            frame = tk.Frame(master=frame_left, relief=tk.RAISED, borderwidth=borderwidth)
            frame.grid(row=row, column=column, columnspan=1, rowspan=1)
            entry = tk.Entry(master=frame, textvariable=vars[-1], width=5, bg=color)
            entry.pack()
            entries.append(entry)
    
    matrix  = Matrix(entries, vars)            

    frame_right = tk.Frame(rahmen, width=300, height =500, relief="ridge", borderwidth=3)
    frame_right.grid(column=1, row=0, sticky='n')

    
    tk.Button(frame_right, width = 12, text="Werte laden", font=('arial', 12), 
        command=tast_laden, bg="old lace"
    ).grid(column=0, row=0, sticky='n', pady=0, padx=0)

    tk.Button(frame_right, width = 12, text="Werte speichern", font=('arial', 12), 
        command=partial(tast_save, matrix), bg="old lace"
    ).grid(column=0, row=1, pady=0, padx=0)

    root.mainloop()


if __name__ == "__main__":
    gui()
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

Nun lassen wir mal bitte die nicht benutzten Variablen beiseite.
Gestern hatte ich zig Ansätze aus den Foren erfolglos probiert und einiges ist nach den Versuchen noch stehen geblieben.
>>> "Und das eigentliche Problem ist, dass die Klasse nicht das selbe ist, wie eine Instanz der Klasse."
hier wird es vermutlich spannend - leider verstehe ich deine Antwort nicht.
nun stecke ich weiter fest mit dem Problem.
In anderen Anwendungen hat es, sage ich mal genau so funktioniert; nun benötige ich aber Hilfe
Also es wäre richtig toll, einen Tipp zu erhalten, der mir beim Problem weiterhilft.

Apropos GUI Funktion. Das hatte ich mal im Forum so gelesen.
Wenn die Funktion mit
"if __name__ == "__main__":
gui()
"
aufhört, muss sie doch am Anfang der Schleife beginnen oder nicht?

Aber natürlich wird "dateipfad" verwendet. Wird beim Zugriff auf die Datei gebraucht.
Den erweiterten Code für Lesen und Speichern hab ich hier aber weggelassen, weil diese Vorgänge ohne verfügbare Datenübergabe bisher wenig Sinn machen.

Bin mal gespannt, wie das Übergeben einer Variablenliste an eine Funktion tatsächlich funktioniert.
Bislang war es mir nicht gelungen, eine Liste an eine Funktion zu übergeben; sie musste als global definiert werden.

Und was ist frevelhaft bei der Verkettung mittels des + Operators?
Es liest sich besser und schreibt sich nicht so umständlich wie die Verkettung mit join (var3 = " ".join([var1, var2])).
https://de.acervolima.com/python-string-verkettung/
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Eine Klasse ist eine Blaupause. Ein Objekt ist gebaut nach dieser Blaupause. Du versuchst die Blaupause an der Stelle zu benutzen, an der du eigentlich das fertige Objekt benutzen willst. Und so, wie eine Blaupause eines Autos keine Tuer hat, hat dein *Typ* Matrix keine Eigenschaft "vars". Sondern dazu muss man eben ein Objekt aus dem Typ konstruieren. Also im einfachsten Fall

Code: Alles auswählen

Matrix()
so es keine Argumente an den Konsturktor gibt. Bei dir muessen die natuerlich uebergeben werden.

Zu deinen anderen Fragen kann ichts sagen. Ich habe dir neulich gezeigt, wie man das mit Entries macht, und ich wuerde es auch immer noch so machen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@KlausP: ich kann nicht sagen, was Du alles wegläßt, und was noch gebraucht wird. Ich sehe nur Code, der unnötig ist.
Wenn Du noch nicht sicher darin bist, wie man Funktionen benutzt, dann solltest Du vielleicht noch nicht mit GUIs anfangen.
Es gilt weiterhin überall, dass man `global` nicht verwenden darf.
Ich schrieb auch nicht, dass Du `str.join` verwenden sollst, sondern dass man Pfade nicht so verarbeiten darf, weder + noch str.join, sondern das, was einem pathlib.Path so bietet.

Hast Du meinen Code überhaupt angeschaut. Den Teil, der den Fehler enthielt, hat sich ja nicht wesentlich geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@KlausP: Nicht benutze Namen beiseite lassen ist eine gute Idee, mach das aktiv bevor Du Code zeigst, und es braucht sich keiner mehr damit beschäftigen. 😉

Das `dateipfad` *natürlich* verwendet wird, ist halt nicht so natürlich, denn wenn man den Code dazu nicht sieht/kennt, kann man das nicht wissen. Und insbesondere wenn so etwas dann in einem Bereich steht wo vieles ”auf Vorrat” definiert wird was erst viele Zeilen später tatsächlich verwendet wird, zeigt die Erfahrung das die Wahrscheinlichkeit steigt, dass da Definitionen bei sind, die tatsächlich nirgends verwendet werden. Entweder weil beim Schreiben dieser Definitionen noch Code vorgesehen war, den man dann doch nicht geschrieben hat, oder weil die mal verwendet *wurden*, ein Umschreiben des Codes aber dazu geführt hat, dass die nicht mehr gebraucht werden, aber weil die Definition so weit weg stand, sie einfach nur vergessen wurde zu entfernen. So etwas macht Programme unübersichtlicher, schlechter wart- und veränderbar, und kann deshalb zu Fehlern führen.

Eine Funktion hört nie mit ``if __name__ == "__main__":`` auf. Das steht am Ende von einem Modul auf Modulebene, nicht in einer Funktion.

``+`` auf Zeichenketten hängt die einfach nur stumpf hintereinander. Pfade sind aber nicht einfach nur Zeichenketten, sondern die müssen bestimmten Regeln folgen, damit es gültige Pfade sind. Und diese Regeln sind auch noch zum Teil vom verwendeten Betriebssystem abhängig. Darum ist ``+`` bei Pfaden falsch und es gibt zum Beispiel das `pathlib`-Modul in der Standardbibliothek, dass sich um diese Details kümmert.

Selbst bei tatsächlichen Texten ist ``+`` oft die schlechtere, weil nicht so gut lesbare und in einigen Fällen auch aufwändigere Variante. Und natürlich ersetzt man ein ``var_a + " " + var_b`` nicht durch so etwas umständliches wie `str.join()` mit einer Liste die man extra dafür erstellen muss, sondern durch ein f-Zeichenkettenliteral: ``f"{var_a} {var_b}". Was im übrigen genau so aussehen würde wenn eine oder beide Variablen nicht schon Zeichenketten wären und man mit ``+`` auch noch `str()` ins Boot holen müsste (``str(var_a) + " " + str(var_b)``).

Bei dem verinkten Blog-Beitrag kann man ja fast beim allerersten Satz „In Python sind Strings Arrays von Bytes, die Unicode-Zeichen darstellen.“ schon den Browser-Tab wieder zumachen. Und beim drüberfliegen über die Beispiele die immer aus Code und dessen Ausgabe bestehen sind mir gleich mehrere aufgefallen wo Code und Ausgabe offensichtlich nicht zusammenpassen. Ist vielleicht keine so gute Quelle.
“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

Danke dir!
Habe gerade erst gesehen, dass du den Code korrigiert hast. Und er fluppt richtig.

matrix = Matrix(entries, vars) ist wohl die gemeinte Objektzuordnung.
Ja, das mit einer Matrix oder Liste ist schon etwas komplexer, als die Übergabe einer einzelnen Variable.
Mag im Prinzip ähnlich sein, aber das muss ich noch ein wenig verdauen.

Und colors = cycle(...) ist ja richtig elegant
Die borderwidth für den Spaltenabstand stört leider in den dritten Zellen auch ein wenig vertikal.
Aber im Moment ist das nicht so wichtig. Werde gelegentlich mal row/columnspan ausprobieren, ob das helfen kann.

Irgendwie hab ich ich bei 'Matrix' auch noch gross und klein vermischt
Und in der Variablendefinition hatte ich den Bezeichner matx genannt, das aber aus den Augen verloren.
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

@_blackjack_
ich war ne zeitlang im Programm eingetaucht und habe erst gerade deinen Beitrag gelesen.
Mit "nicht benutzte Namen weglassen" hast du natürlich recht; einmal wenn der Code gepostet und verstanden werden soll, und generell natürlich auch.
Ich wede mir das für das Posting zu Herzen nehmen.
In den letzten Tagen hatte ich soviel gelesen und probiert, dass da leider trotz löschens vor dem Posting noch viel überflüssiger Kram rausgegangen ist.
Nach 2 Tagen Nirvana brauchte ich Hilfe und konnte/wollte nicht mehr warten und hab den Code nicht gut aufgeräumt.

Das path-lib - Modul werde ich mir dann gerne ansehen und verwenden; oft gibt ja auch das Problem mit den '\\' im Pfad.

Habe verstanden, dass ich am besten ``if __name__ == "__main__":`` erst bei der Verwendung bei Modulen betrachte, welche ich z.Z. noch nicht genutzt habe.

Danke für deine Hinweise.
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

@ Sirius3:
natürlich habe ich den Code angeschaut; aber erst nach dem ersten Schriftwechsel habe ich gründlich verglichen und mein ursprüngliches Programm überprüft und zum Laufen gebracht. Denn ich wollte ja den konkreten Casus Knacksus finden.
Der wesentliche Fehler steckte in der Aufruf der Taste zum Speichern; im Command hatte ich 'Matrix' übergeben, aber vorher der Variablen schon den Namen 'matx' verpasst (matx = Matrix(entries, vars). Danach lief das ürsprüngliche Programm ebenfalls.
Ich denke, eher ein Flüchtigkeitsfehler, den ich dort auf Basis der Fehlermeldung nicht gesehen habe. Und die Klasse war schon korrekt angesetzt, aber beim falsch übergebenen Variablennamen nicht gefunden.

Mit Funktionen habe ich schon viel Erfahrung - in Python gibt es allerdings ne Menge komplexer und neuer Dinge.
In den eineinhalb Jahren mit Python hab ich allerdings schon einiges gute programmiert - auch mit Klassen.
Dass ich nun im Tastenaufruf noch einen Variablennamen vom 1. Entwurf übersehen habe, muss m.E. nicht bedeuten, dass ich ein Python Blindgänger bin. Verglichen mit Fortran, Cobol, Basic, Pascal und Assembler seinerzeit, ist Python wie vermutlich viele anderen modernen Sprachen recht komplex.
Da dauert es schon ne lange Zeit , eh man nicht mehr Anfänger ist.
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

@_deets_:
ja, danke. Aber die "Entries", die du mir gezeigt hattest, waren Labels.
Das sah zwar schon recht schön aus.
Aber dann erkannte ich, dass ich die Matrix mit tk.Entry's aufbauen muss.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

@KlausP: also hier viewtopic.php?f=18&t=53827#p399853 benutze ich Entry.
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

@_deets_:
danke, ich hab da nochmals reingeschaut und dir im betreffenden thread geantwortet.
KlausP
User
Beiträge: 60
Registriert: Mittwoch 8. Juli 2020, 17:00

@__blackjack__ und @ allgemein
Du hast mir die Pathlib empfohlen.
Da hab ich viel gutes durchgetested (ausser PoisixPath) unter meinem Windows.
M.E. erwartet Python aber Pfade wie E:\\Bilder\\_Fritz\\2012 Bildname.jpg.
Ich dachte, die Lib würde aus einem WindowsPath oder parts solch einen String basteln können.
Übersehe ich da etwas?
Sorry bin gerade etwas "off topic" unter tkinter .... aber da die Lib oben empfohlen wurde ... ;)
danke.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@KlausP: Eigentlich sollte man normalerweise nur `Path` benötigen. `WindowsPath` und `PosixPath` nur wenn man auf einem System das *nicht* zwingend zum jeweiligen Pfadtyp passt aus irgendwelchen Gründen genau solche Pfade verarbeiten möchte. Was eher selten ist.

Python erwartet auch `Path`-Objekte. Man kann da auch immer noch Zeichenketten und `bytes`-Objekte verwenden, weil sonst ja alle alten Quelltexte die etwas mit den Pfaden anstellen, nicht mehr funktionieren würden, und auch noch nicht alle externen Packages können etwas mit `Path`-Objekten anfangen, aber das werden immer weniger.

Und für Fälle wo man das `Path`-Objekt als Zeichenkette braucht, kann man das machen was auch mit anderen Objekten machen kann: die `str()`-Funktion verwenden.
“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

@ Sirius - dein Beitrag vom 18. Jan mit neuem Code.

Ja, ich möchte die erste Matrix als Sudoku als Programmvorgabe betrachten -> Index der Matrix-Liste = [0].
Und nach dem ersten Rechnungslauf die neue Matrix mit erweiterten Werten per Index [1] anhängen.
Ein weiterer Run würde. vllt. weitere neue Werte bringen, und als weiterer Listen.Index [2] angehängt/dargestellt.
Im Endeffekt möchte ich per Taste vor- und zurückbrowsen und die neu gefundenen/veränderten Werte der dargestellten Matrix blau anzeigen, und die alten in schwarz..
Wenn ich das recht sehe , muss ich wohl jedes mal die Matrix und Variablen in tkinter neu aufbauen.
Und während der Aufbauschleife abfragen, ob der der aktuelle Feldeintrag z.B. Matrix {2][55] neu ist, und dann die gewünschte Farbe setzen.
Ich meine, dass die Laufzeit für den Aufbau in tkinter pro Kalkulationsrun akzeptabel sein könnte.
Als eine weitere Option der Programmes könnte ich mir vorstellen, manuelle Eingaben in der Matrix zu verproben:
Gültig, dann blaue Ziffer,; verboten, dann rote Ziffer.
Hier meine Frage, ob es Sinn macht, dann geweils die aktuelle Matrixvariablenliste zu löschen und die Matrix in tkinter mit den passenden Farben grafisch neu aufzubauen, hierbei meine ich den Aufwand beim grafischen Aufbau der Liste-
Ich hoffe, ich habe meine Vorstellungen klar genug dargestellt.
Auch wenn ich gerade kein Programm poste, würde ich gerne ich eure Meinung hören, ob der o.a. Ansatz Sinn macht, bzw. ein gangbarer Weg wäre.
__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
Antworten