Problem mit Variable "var"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
jbaben
User
Beiträge: 24
Registriert: Dienstag 12. Januar 2016, 16:05

Hallo,
ich habe ein Problemmit der Variablen "var" in de Funktion: sel ( + str(var.get()), Fehlermeldung:
File "J:\MeineProgramme\Python\Windows\Beispiele aus dem Internet\sz_01.py", line 75, in sel
selection = "You selected the option " + str(var.get())
NameError: name 'var' is not defined
Wie muss ich die Variable in der Funktion: sel richtig deklarieren.
Hat nicht funktioniert: + str(self.var.get())
Hier mein Python Programm: (python3 sz.py)

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Datum: 22.03.2017
# Vorlage:
# gui_python_04.py

try:
    #python3
    from tkinter import *
    from time import *
except ImportError:
    #python2
    from Tkinter import *
    from time import *

class MyApp(Tk):
    def __init__(self):
        Tk.__init__(self)
        Alarmzone_A = IntVar()
        Alarmzone_B = IntVar()
        Alarmzone_C = IntVar()
        Alarmzone_D = IntVar()
        var = IntVar()
        fr = Frame(self)
        fr.pack()
        self.canvas  = Canvas(fr, height = 400, width = 600)
        self.canvas.pack()
        #self.name.set("Steuerzentrale")
        #self.rect = self.canvas.create_rectangle(25, 25, 75, 75, fill = "white")
        #self.do_blink = False
        service_button = Button(self, text="Service", command=self.start_blinking)
        service_button.place(x=200, y=360)
        beenden_button = Button(self, text="Beenden", command=self.close_fenster)
        beenden_button.place(x=25, y=360)
        text_label1 = Label(self,text="Alarmzone")
        text_label1.place(x=25, y=30)
        # RadioButton
        R1 = Radiobutton(self, text="A", variable=var, value=1, command=self.sel)
        R1.pack( anchor = W )
        R2 = Radiobutton(self, text="B", variable=var, value=2, command=self.sel)
        R2.pack( anchor = W )
        # Label fuer Test RadioButton
        label3 = Label(self, text =str(var.get()))
        label3.place(x=100, y=30)
        #label3.pack()
        # ListBox
        Lb1 = Listbox(self, width = 50)
        Lb1.insert(1, "Python")
        Lb1.insert(2, "Perl")
        Lb1.insert(3, "C")
        Lb1.insert(4, "PHP")
        Lb1.insert(5, "JSP")
        Lb1.insert(6, "Ruby")
        Lb1.place(x=25, y=100)

    def start_blinking(self):
        self.do_blink = True
        self.blink()

    def stop_blinking(self):
        self.do_blink = False

    def blink(self):
        if self.do_blink:
            current_color = self.canvas.itemcget(self.rect, "fill")
            new_color = "red" if current_color == "white" else "white"
            self.canvas.itemconfigure(self.rect, fill=new_color)
            text_label2 = Label(master=self,text="blink")
            text_label2.pack()
            self.after(1000, self.blink)

    def sel(self):
        selection = "You selected the option " + str(var.get())
        text_label3 = Label(self, text = selection)
        text_label3.pack()

    def close_fenster(self): 
        self.quit()
        self.destroy()

if __name__ == "__main__":
    root = MyApp()
    root.mainloop() 
MfG

Juergen B.
:(
Zuletzt geändert von Anonymous am Samstag 25. März 2017, 15:13, insgesamt 2-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du hast das self vergessen. Definiere den Wert als self.var und greife mit self.var darauf zu.
jbaben
User
Beiträge: 24
Registriert: Dienstag 12. Januar 2016, 16:05

Hallo,

vielen Dank für die schnelle Antwort.
Es funktioniert mit dem gegebenen Hinweis
Hier mein angepasster Code:

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Datum: 22.03.2017
# Vorlage:
# gui_python_04.py

try:
    #python3
    from tkinter import *
    from time import *
except ImportError:
    #python2
    from Tkinter import *
    from time import *

class MyApp(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.Alarmzone_A = IntVar()
        self.Alarmzone_B = IntVar()
        self.Alarmzone_C = IntVar()
        self.Alarmzone_D = IntVar()
        self.var = IntVar()
        fr = Frame(self)
        fr.pack()
        self.canvas  = Canvas(fr, height = 400, width = 600)
        self.canvas.pack()
        #self.name.set("Steuerzentrale")
        #self.rect = self.canvas.create_rectangle(25, 25, 75, 75, fill = "white")
        #self.do_blink = False
        service_button = Button(self, text="Service", command=self.start_blinking)
        service_button.place(x=200, y=360)
        beenden_button = Button(self, text="Beenden", command=self.close_fenster)
        beenden_button.place(x=25, y=360)
        text_label1 = Label(self,text="Alarmzone")
        text_label1.place(x=25, y=30)
        # RadioButton
        R1 = Radiobutton(self, text="A", variable=self.var, value=1, command=self.sel)
        R1.pack( anchor = W )
        R2 = Radiobutton(self, text="B", variable=self.var, value=2, command=self.sel)
        R2.pack( anchor = W )
        # Label fuer Test RadioButton
        label3 = Label(self, text =str(self.var.get()))
        label3.place(x=100, y=30)
        #label3.pack()
        # ListBox
        Lb1 = Listbox(self, width = 50)
        Lb1.insert(1, "Python")
        Lb1.insert(2, "Perl")
        Lb1.insert(3, "C")
        Lb1.insert(4, "PHP")
        Lb1.insert(5, "JSP")
        Lb1.insert(6, "Ruby")
        Lb1.place(x=25, y=100)

    def start_blinking(self):
        self.do_blink = True
        self.blink()

    def stop_blinking(self):
        self.do_blink = False

    def blink(self):
        if self.do_blink:
            current_color = self.canvas.itemcget(self.rect, "fill")
            new_color = "red" if current_color == "white" else "white"
            self.canvas.itemconfigure(self.rect, fill=new_color)
            text_label2 = Label(master=self,text="blink")
            text_label2.pack()
            self.after(1000, self.blink)

    def sel(self):
        selection = "You selected the option " + str(self.var.get())
        text_label3 = Label(self, text = selection)
        text_label3.pack()

    def close_fenster(self): 
        self.quit()
        self.destroy()

if __name__ == "__main__":
    root = MyApp()
    root.mainloop() 
So nun kann ich mit meinem Programm weiter machen, bis zum nächsten Problem.

MfG

Juergen B.
:D
Zuletzt geändert von Anonymous am Samstag 25. März 2017, 15:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@jbaben: die Probleme sind schon da, auch wenn sie nicht sofort auffallen. Deine Importe sind falsch. Nicht nur, dass *-Importe schlecht sind, weil sie unkontrolliert Namen in den eigenen Namensraum schaufeln, der try-Block umfaßt zu viel. Sollte der tkinter-Import glücken, der time-Import aber fehlschlagen landet man im except-Block, wo dann der Tkinter-Import fehlschlägt und man nie auf den eigentlichen Fehler kommt. TkInter wird üblicherweise als »import tkinter as tk« benutzt. Das was aus time importiert wird, wird gar nicht benutzt.
Wenn man anfängt, Attribute durchzunummerieren, bzw. durchzualphabetisieren, will man eigentlich eine Liste verwenden. Du willst sicher nicht jede Sekunde ein neues Label erzeugen. Alle Elemente werden üblicherweise in __init__ erzeugt und in den anderen Methoden nur noch angepaßt.
Antworten