Anfängerproblem (undefined variable)

Code-Stücke können hier veröffentlicht werden.
Antworten
marco.toegel@web.de
User
Beiträge: 2
Registriert: Dienstag 31. März 2020, 21:02

Dienstag 31. März 2020, 21:17

Servus Forum,

ich bin Python Anfänger, kann ich aber echt mit der Syntax von Python anfreunden. Damit das auch so bleibt, bitte ich euch um Hilfe. Denn inzwischen sitze ich drei Stunden vor der gleichen Zeile.

Das Problem ist das definieren des Buttons b1, hier speziell am "command". Ohne das "command" geht es... aufgerufen werden soll die nächste Funktion "farbeaendern", egal ob dann Sinn macht oder nicht. Ich hatte auch versucht beim "command" eine Farbe mitzugeben. Das ändert aber alles nichts an der Tatsache, das die Funktion farbeaendern für Eclipse nicht definiert ist. Obwohl sie vor der aufrufenden Funktion steht (darauf bin ich nämlich auch schon reingefallen).

Das sind wirklich nur Tests für mich, bitte sucht nicht nach dem Sinn des Codings ;-)

Ich danke euch und viele Grüße
Marco


import tkinter as tk
from tkinter import *
from tkinter import Button

class Schreibgeraete():

def __init__(self, typ, loeschbar, spitzen_breite, nachfuellbar, farbe):

self.typ = typ
self.loeschbar = loeschbar
self.spitzen_breite = spitzen_breite
self.nachfuellbar = nachfuellbar
self.farbe = farbe


def farbeaendern(self,farbe):
self.farbe = farbe

def farbeauswaehlen(self):
f1 = tk.Tk()
b1 = Button(master=f1,text="farbe_in_blau_aendern",command=farbeaendern) <--- hier ist das Problem undefined variable
b1.pack()
f1.mainloop()

point88 = Schreibgeraete("fineliner", "nein", 1, False, "schwarz")
print (point88.farbe)
point88.farbeauswaehlen()
print (point88.farbe)
__deets__
User
Beiträge: 8098
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 31. März 2020, 21:25

Da muss self.farbeaendern hin.
marco.toegel@web.de
User
Beiträge: 2
Registriert: Dienstag 31. März 2020, 21:02

Dienstag 31. März 2020, 21:33

Danke danke danke :-) Da wäre ich allerdings nie drauf gekommen. Scheinbar hab ich das in den gängigen Tutorials bisher immer übersehen bzw. noch nie gesehen.
__deets__
User
Beiträge: 8098
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 31. März 2020, 22:32

In einem Tutorial zur OO sollte sowas drin stehen. Nicht als callback. Aber als normaler Methodenaufruf.
Sirius3
User
Beiträge: 11983
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 1. April 2020, 07:40

@marco.toegel@web.de: Du hast drei verschiedene Varianten, tkinter zu importieren. Die erste ist die richtige, die zweite wird zum Glück nicht benutzt und die dritte könnte man machen, wird aber bei vielen Namen, die man braucht, irgendwann auch unübersichtlich.

Benutze keine Abkürzungen, was soll die 1 bei f1 und b1? Das ist an sich schon schlecht, weil Nummern keine Aussagekraft haben, wenn es aber nicht einmal ein f2 gibt?
Eine tk-Instanz tief verschachtelt in einer Methode zu haben, ist schlecht, weil es nur ein solches Exemplar im ganzen Programm geben darf. Man schreibt ja auch normalerweise ein GUI-Programm, wo über die gesamte Laufzeit ein Fenster existiert.

Der Knopf heißt zwar "farbe_in_blau_aendern", es steht aber nirgends im Programm "blau", das Argument für den Methodenaufruf fehlt daher auch.

Code: Alles auswählen

import tkinter as tk
from functools import partial

class Schreibgeraete():
    def __init__(self, typ, loeschbar, spitzen_breite, nachfuellbar, farbe):
        self.typ = typ  
        self.loeschbar = loeschbar
        self.spitzen_breite = spitzen_breite
        self.nachfuellbar = nachfuellbar
        self.farbe = farbe  
        
    def farbeaendern(self, farbe):
        self.farbe = farbe
        
    def farbeauswaehlen(self):
        main_window = tk.Tk()
        tk.Button(master=main_window, text="farbe_in_blau_aendern", command=partial(self.farbeaendern, "blau")).pack()
        main_window.mainloop()

point88 = Schreibgeraete("fineliner", "nein", 1, False, "schwarz")
print(point88.farbe)
point88.farbeauswaehlen()
print(point88.farbe)
Antworten