Seite 1 von 1

Anfängerproblem (undefined variable)

Verfasst: Dienstag 31. März 2020, 21:17
von marco.toegel@web.de
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)

Re: Anfängerproblem (undefined variabl

Verfasst: Dienstag 31. März 2020, 21:25
von __deets__
Da muss self.farbeaendern hin.

Re: Anfängerproblem (undefined variable)

Verfasst: Dienstag 31. März 2020, 21:33
von marco.toegel@web.de
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.

Re: Anfängerproblem (undefined variable)

Verfasst: Dienstag 31. März 2020, 22:32
von __deets__
In einem Tutorial zur OO sollte sowas drin stehen. Nicht als callback. Aber als normaler Methodenaufruf.

Re: Anfängerproblem (undefined variable)

Verfasst: Mittwoch 1. April 2020, 07:40
von Sirius3
@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)