Python Attribute Error

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
2ltime
User
Beiträge: 2
Registriert: Montag 20. Juli 2020, 18:57

Hallo,
ich bin neu in diesem Forum und möchte erstmal alle mit einen herzlichen "servas griaß eich" begrüßen :-)

Ich habe folgendes Problem:

In Zeile 108 bekomme ich ein "AttributeError: 'NoneType' object has no attribute 'get' und ich habe keinen Dunst warum.
Das ganze soll (ja ich weiß, ist schon ein wenig abgedroschen) eine Bewässerungssteuerung mit zukünfitg tag- und zeitabhängen Relays werden.
Um das ganze zu speicher, schreibe ich in texfiles raus...in der func "safevar" erhalte ich dann den fehler...

Hier der Code mit der Bitte um HIIIILLFEEEEEE:

import sys
import tkinter as tk
from datetime import date
import time
import schedule

heute = date.today()
print (heute.weekday())
print (("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag")[heute.weekday()])

import datetime
heute = datetime.datetime.today()
strheute = '{:%H:%M}'.format(heute)
print (strheute)
print(type(strheute))


HEIGHT = 300
WIDTH = 700

root = tk.Tk()

canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()

frame = tk.Frame(root, bg='gray')
frame.place(relx=0.01, relheight=0.98, relwidth=0.98)

lable_starttime = tk.StringVar()
tk.Label(frame, bg='gray', textvariable=lable_starttime).grid(row=1, column=2)
lable_stoptime = tk.StringVar()
tk.Label(frame, bg='gray', textvariable=lable_stoptime).grid(row=2, column=2)
lable_today = tk.StringVar()
tk.Label(frame, bg='gray', textvariable=lable_today).grid(row=9, column=0)
#lable_today.set(("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag")[heute.weekday()])



#Auswahl der zu bewassernden Tage
global ckmo
ckmo = tk.StringVar()
tk.Checkbutton(frame, text="montag", variable=ckmo, bg='gray').grid(row=0, column=0)
global ckdi
ckdi = tk.StringVar()
tk.Checkbutton(frame, text="dienstag", variable=ckdi, bg='gray').grid(row=0, column=1)
global ckmi
ckmi = tk.StringVar()
tk.Checkbutton(frame, text="mittwoch", variable=ckmi, bg='gray').grid(row=0, column=2)
global ckdo
ckdo = tk.StringVar()
tk.Checkbutton(frame, text="donnerstag", variable=ckdo, bg='gray').grid(row=0, column=3)
global ckfr
ckfr = tk.StringVar()
tk.Checkbutton(frame, text="freitag", variable=ckfr, bg='gray').grid(row=0, column=4,)
global cksa
cksa = tk.StringVar()
tk.Checkbutton(frame, text="samstag", variable=cksa, bg='gray').grid(row=0, column=5)
global ckso
ckso = tk.StringVar()
tk.Checkbutton(frame, text="sonntag", variable=ckso, bg='gray').grid(row=0, column=6)

tk.Label(frame, text="start:", bg='gray').grid(row=1, column=0)
tk.Label(frame, text="stop:", bg='gray').grid(row=2, column=0)

#Eingabe der Start/Stop Zeiten
starttime = tk.Entry(frame).grid(row=1, column=1)
stoptime = tk.Entry(frame).grid(row=2, column=1)

print(str(ckmo.get()))

#Liest die aktuellen Bewasserungstage aus Textfile aus
def get_timer_states():
#print("\nKreis:" + str(rbv.get()))

i = str(rbv.get())

with open("textdatei" + i + ".txt", "r") as f:
data = f.read().splitlines()
#print(data[0])

a = str(data[0])
ckmo.set(a[0])
ckdi.set(a[1])
ckmi.set(a[2])
ckdo.set(a[3])
ckfr.set(a[4])
cksa.set(a[5])
ckso.set(a[6])

lable_starttime.set(' Aktuelle Starzeit: ' + str(data[1]))
lable_stoptime.set(' Aktuelle Stopzeit: ' + str(data[2]))

#Wählt den jeweiligen Bewasserungskreis aus
rbv = tk.StringVar()
button_k1 = tk.Radiobutton(frame, text='Kreis 1', bg='lightgray', variable=rbv, value=1, command=get_timer_states).grid(row=1, column=10)
button_k2 = tk.Radiobutton(frame, text='Kreis 2', bg='lightgray', variable=rbv, value=2, command=get_timer_states).grid(row=2, column=10)
button_k3 = tk.Radiobutton(frame, text='Kreis 3', bg='lightgray', variable=rbv, value=3, command=get_timer_states).grid(row=3, column=10)
button_k4 = tk.Radiobutton(frame, text='Kreis 4', bg='lightgray', variable=rbv, value=4, command=get_timer_states).grid(row=4, column=10)
button_k5 = tk.Radiobutton(frame, text='Kreis 5', bg='lightgray', variable=rbv, value=5, command=get_timer_states).grid(row=5, column=10)
button_k6 = tk.Radiobutton(frame, text='Kreis 6', bg='lightgray', variable=rbv, value=6, command=get_timer_states).grid(row=6, column=10)
button_k7 = tk.Radiobutton(frame, text='Kreis 7', bg='lightgray', variable=rbv, value=7, command=get_timer_states).grid(row=7, column=10)
button_k8 = tk.Radiobutton(frame, text='Kreis 8', bg='lightgray', variable=rbv, value=8, command=get_timer_states).grid(row=8, column=10)


#Speichert die eingegebenen Daten (Kreis, Tag, Start/Stop) in ein Textfile
def safevar():

d = [[ckmo.get(), ckdi.get(), ckmi.get(), ckdo.get(), ckfr.get(), cksa.get(), ckso.get()], [starttime.get()], [stoptime.get()]]

i = rbv.get()

with open("textdatei" + i + ".txt", "w") as f:
for line in d:
f.write("".join(line) + "\n")


button_safe = tk.Button(frame, text='speichern', bg='lightgray', bd=1, command=safevar)
button_safe.grid(row=3, column=0)



root.mainloop()
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Schreibe deinen Code in Code-Tags (die erscheine mit dem </>-Button im Editor).

Ich mag ungern 108 Zeilen abzählen. Wenn du uns sagst, welche Zeile das ist, würde das schon helfen.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

`global` solltest Du nicht benutzen und so wie Du es benutzt macht es auch keinen Sinn.
Was soll `lable` denn bedeuten? Oder ckmo? Benutze keine kryptischen Abkürzungen.
Bei 7 Checkboxen solltest Du eine passende Datenstruktur verwenden, z.B. eine Liste.
Der Rückgabewert von `grid` ist None, das an eine Variable zu binden, ist nicht sehr sinnvoll.
Alles was eine Funktion braucht, sollte sie über ihre Argumente bekommen, und kein ausführbarer Code sollte auf oberster Ebene stehen.
Jedes nicht-triviale GUI-Programm braucht Klassendefinitionen.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4 und mal 2.
2ltime
User
Beiträge: 2
Registriert: Montag 20. Juli 2020, 18:57

:shock: OMG sorry....ich hoffe das stimmt jetzt so

Code: Alles auswählen

import sys
import tkinter as tk
from datetime import date
import time
import schedule

heute = date.today()
print (heute.weekday())
print (("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag")[heute.weekday()])

import datetime
heute = datetime.datetime.today()
strheute = '{:%H:%M}'.format(heute)
print (strheute)
print(type(strheute))


HEIGHT = 300
WIDTH = 700

root = tk.Tk()

canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()

frame = tk.Frame(root, bg='gray')
frame.place(relx=0.01, relheight=0.98, relwidth=0.98)    

lable_starttime = tk.StringVar()
tk.Label(frame, bg='gray', textvariable=lable_starttime).grid(row=1, column=2)
lable_stoptime = tk.StringVar()
tk.Label(frame, bg='gray', textvariable=lable_stoptime).grid(row=2, column=2)
lable_today = tk.StringVar()
tk.Label(frame, bg='gray', textvariable=lable_today).grid(row=9, column=0)
#lable_today.set(("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag")[heute.weekday()])



#Auswahl der zu bewassernden Tage
global ckmo
ckmo = tk.StringVar()
tk.Checkbutton(frame, text="montag", variable=ckmo, bg='gray').grid(row=0, column=0)
global ckdi
ckdi = tk.StringVar()
tk.Checkbutton(frame, text="dienstag", variable=ckdi, bg='gray').grid(row=0, column=1)
global ckmi
ckmi = tk.StringVar()
tk.Checkbutton(frame, text="mittwoch", variable=ckmi, bg='gray').grid(row=0, column=2)
global ckdo
ckdo = tk.StringVar()
tk.Checkbutton(frame, text="donnerstag", variable=ckdo, bg='gray').grid(row=0, column=3)
global ckfr
ckfr = tk.StringVar()
tk.Checkbutton(frame, text="freitag", variable=ckfr, bg='gray').grid(row=0, column=4,)
global cksa
cksa = tk.StringVar()
tk.Checkbutton(frame, text="samstag", variable=cksa, bg='gray').grid(row=0, column=5)
global ckso
ckso = tk.StringVar()
tk.Checkbutton(frame, text="sonntag", variable=ckso, bg='gray').grid(row=0, column=6)

tk.Label(frame, text="start:", bg='gray').grid(row=1, column=0)
tk.Label(frame, text="stop:", bg='gray').grid(row=2, column=0)

#Eingabe der Start/Stop Zeiten
starttime = tk.Entry(frame).grid(row=1, column=1)
stoptime = tk.Entry(frame).grid(row=2, column=1)

print(str(ckmo.get()))

#Liest die aktuellen Bewasserungstage aus Textfile aus
def get_timer_states():
    #print("\nKreis:" + str(rbv.get()))

    i = str(rbv.get())

    with open("textdatei" + i + ".txt", "r") as f:
     data = f.read().splitlines()
     #print(data[0])
     
     a = str(data[0])
     ckmo.set(a[0])
     ckdi.set(a[1])
     ckmi.set(a[2])
     ckdo.set(a[3])
     ckfr.set(a[4])
     cksa.set(a[5])
     ckso.set(a[6])

     lable_starttime.set('  Aktuelle Starzeit: ' + str(data[1]))
     lable_stoptime.set('   Aktuelle Stopzeit: ' + str(data[2]))

#Wählt den jeweiligen Bewasserungskreis aus
rbv = tk.StringVar()
button_k1 = tk.Radiobutton(frame, text='Kreis 1', bg='lightgray', variable=rbv, value=1, command=get_timer_states).grid(row=1, column=10)
button_k2 = tk.Radiobutton(frame, text='Kreis 2', bg='lightgray', variable=rbv, value=2, command=get_timer_states).grid(row=2, column=10)
button_k3 = tk.Radiobutton(frame, text='Kreis 3', bg='lightgray', variable=rbv, value=3, command=get_timer_states).grid(row=3, column=10)
button_k4 = tk.Radiobutton(frame, text='Kreis 4', bg='lightgray', variable=rbv, value=4, command=get_timer_states).grid(row=4, column=10)
button_k5 = tk.Radiobutton(frame, text='Kreis 5', bg='lightgray', variable=rbv, value=5, command=get_timer_states).grid(row=5, column=10)
button_k6 = tk.Radiobutton(frame, text='Kreis 6', bg='lightgray', variable=rbv, value=6, command=get_timer_states).grid(row=6, column=10)
button_k7 = tk.Radiobutton(frame, text='Kreis 7', bg='lightgray', variable=rbv, value=7, command=get_timer_states).grid(row=7, column=10)
button_k8 = tk.Radiobutton(frame, text='Kreis 8', bg='lightgray', variable=rbv, value=8, command=get_timer_states).grid(row=8, column=10)

print(ckmo.get())
#Speichert die eingegebenen Daten (Kreis, Tag, Start/Stop) in ein Textfile
def safevar():

    d = [[ckmo.get(), ckdi.get(), ckmi.get(), ckdo.get(), ckfr.get(), cksa.get(), ckso.get()], [starttime.get()], [stoptime.get()]]

    i = rbv.get()

    with open("textdatei" + i + ".txt", "w") as f:
      for line in d:
        f.write("".join(line) + "\n")


button_safe = tk.Button(frame, text='speichern', bg='lightgray', bd=1, command=safevar)
button_safe.grid(row=3, column=0)



root.mainloop()
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

import tkinter as tk
from functools import partial

WEEKDAYS = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"]

def get_timer_states(kreis, checkboxes, starttime_label, stoptime_label):
    with open(f"textdatei{kreis.get()}.txt", encoding="utf8") as lines:
        checked, start, stop = (line.strip() for line in lines)
    for box, value in zip(checkboxes, checked):
        box.set(value)
     starttime_label.set(f'  Aktuelle Starzeit: {start}')
     stoptime_label.set(f'  Aktuelle Stopzeit: {stop}')

def save_status(kreis, checkboxes, starttime, stoptime):
    checked = ''.join(box.get() for box in checkboxes)
    with open(f"textdatei{kres.get()}.txt", "w", encoding="utf8") as output:
        output.write(f"{checked}\n")
        output.write(f"{starttime.get()}\n")
        output.write(f"{stoptime.get()}\n")

def main():
    root = tk.Tk()
    frame = tk.Frame(root, bg='gray')
    frame.pack()

    starttime_label = tk.StringVar()
    tk.Label(frame, bg='gray', textvariable=starttime_label).grid(row=1, column=2)
    stoptime_label = tk.StringVar()
    tk.Label(frame, bg='gray', textvariable=stoptime_label).grid(row=2, column=2)
    today_label = tk.StringVar()
    tk.Label(frame, bg='gray', textvariable=today_label).grid(row=9, column=0)

    #Auswahl der zu bewassernden Tage
    checkboxes = []
    for column, weekday in enumerate(WEEKDAYS):
        var = tk.StringVar()
        tk.Checkbutton(frame, text=weekday, variable=var, bg='gray').grid(row=0, column=column)
        checkboxes.append(var)

    tk.Label(frame, text="start:", bg='gray').grid(row=1, column=0)
    tk.Label(frame, text="stop:", bg='gray').grid(row=2, column=0)

    #Eingabe der Start/Stop Zeiten
    starttime = tk.Entry(frame)
    starttime.grid(row=1, column=1)
    stoptime = tk.Entry(frame)
    stoptime.grid(row=2, column=1)
    kreis = tk.IntVar()
    func = partial(get_timer_states, kreis, checkboxes, starttime_label, stoptime_label)
    for index in range(1, 9):
        tk.Radiobutton(frame, text=f'Kreis {index}', bg='lightgray', variable=kreis, value=index, command=func).grid(row=index, column=10)
    tk.Button(frame, text='speichern', bg='lightgray', bd=1, command=safevar).grid(row=3, column=0)
    root.mainloop()

if __name__ == '__main__':
    main()
Benutzeravatar
pintman
User
Beiträge: 39
Registriert: Freitag 2. Dezember 2005, 20:43
Kontaktdaten:

In Z.11,12 stimmt die Einrückung nicht und ich erhalte sofort einen Syntaxfehler.

Code: Alles auswählen

    for box, value in zip(checkboxes, checked):
        box.set(value)
     starttime_label.set(f'  Aktuelle Starzeit: {start}')
     stoptime_label.set(f'  Aktuelle Stopzeit: {stop}')

Z.52 nutzt eine Variable "safevar", die nicht deklariert wurde: vermutlich soll dort eine Methode genutzt werden, um diese an den Button zu binden.

Code: Alles auswählen

    tk.Button(frame, text='speichern', bg='lightgray', bd=1, command=safevar).grid(row=3, column=0)

Antworten