Seite 1 von 1

Python Attribute Error

Verfasst: Montag 20. Juli 2020, 19:08
von 2ltime
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()

Re: Python Attribute Error

Verfasst: Montag 20. Juli 2020, 19:35
von sparrow
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.

Re: Python Attribute Error

Verfasst: Montag 20. Juli 2020, 19:54
von Sirius3
`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.

Re: Python Attribute Error

Verfasst: Montag 20. Juli 2020, 19:58
von 2ltime
: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()

Re: Python Attribute Error

Verfasst: Montag 20. Juli 2020, 21:09
von Sirius3

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()

Re: Python Attribute Error

Verfasst: Montag 20. Juli 2020, 22:00
von pintman
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)