command mit OOP funktioniert nicht
Verfasst: Montag 21. Februar 2022, 16:28
Hallo Experten,
es geht um GUI mit tkinter und OOP.
Ohne OOP habe ich schon mehrer GUIs gemacht, da funktioniert es.
Mit OOP habe ich Schwierigkeiten mit dem command.
Hier die Zeile:
neuein_button=tk.Button(self.frame2,text="Neue ",font=self.my_font,command=self.start).grid(row=3,column=4,padx=5,pady=5,sticky=tk.E)
def start(self):
pass
print("hallo, hier geht es weiter!")
und nun die Fehlermeldung:
neuein_button=tk.Button(self.frame2,text="Neue ",font=self.my_font,command=self.start).grid(row=3,column=4,padx=5,pady=5,sticky=tk.E)
AttributeError: 'Eingeben' object has no attribute 'start'
Das verstehe ich, aber wie geht das richtig.
Wenn ich das self weglasse also command=start mache kommt die Meldung:
return self.func(*args)
TypeError: start() missing 1 required positional argument: 'self'
Auch das ist klar, aber wie geht es nun richtig ?
Mein Programm:
import tkinter as tk
from tkinter import ttk
class Eingeben():
pass
def __init__(self, master):
pass
self.master = master
self.master.geometry("600x300")
self.master.title("RÜCKNAHMEN / Eingabe")
self.wel_frame= tk.Frame(master,bd=20,)
self.wel_frame.grid(row=0, column=2,padx=5,pady=5,)
self.my_font=("Arial",14)
start_label=tk.Label(self.wel_frame, text='Rot',font=self.my_font,fg="red").grid(row=1,column=0,pady=5,padx=5,sticky=tk.W)
weiter_label=tk.Label(self.wel_frame,text="Blau",font=self.my_font,fg="blue" ).grid(row=2,column=0,padx=5,pady=5,sticky=tk.W)
next2_label=tk.Label(self.wel_frame,text="Gruen",font=self.my_font,fg="green").grid(row=3,column=0,padx=5,pady=5,sticky=tk.W)
next3_label=tk.Label(self.wel_frame,text="Stueckzahl",font=self.my_font).grid(row=0,column=1,padx=5,pady=5,sticky=tk.W)
next4_label=tk.Label(self.wel_frame,text=" Preis/€ ",font=self.my_font).grid(row=0,column=2,padx=5,pady=5,sticky=tk.W)
next5_label=tk.Label(self.wel_frame,text=" noch",font=self.my_font).grid(row=1,column=2,padx=5,pady=5,sticky=tk.W)
next6_label=tk.Label(self.wel_frame,text="so-so",font=self.my_font).grid(row=2,column=2,padx=5,pady=5,sticky=tk.W)
next8_label=tk.Label(self.wel_frame,text=" Name",font=self.my_font).grid(row=6,column=0,padx=5,pady=5,sticky=tk.W)
rotstck_entry=tk.Entry(self.wel_frame,bg="white").grid(row=1,column=1,padx=5,pady=5,sticky=tk.W)
blaustck_entry=tk.Entry(self.wel_frame,bg="white").grid(row=2,column=1,padx=5,pady=5,sticky=tk.W)
gruenstck_entry=tk.Entry(self.wel_frame,bg="white").grid(row=3,column=1,padx=5,pady=5,sticky=tk.W)
kdname_entry=tk.Entry(self.wel_frame,bg="white",font=self.my_font).grid(row=6,column=1,columnspan=3,padx=5,pady=5,sticky=tk.W)
rotprs_entry=tk.Entry(self.wel_frame,bg="white").grid(row=1,column=2,padx=5,pady=5,sticky=tk.W)
blauprs_entry=tk.Entry(self.wel_frame,bg="white").grid(row=2,column=2,padx=5,pady=5,sticky=tk.W)
gruenprs_entry=tk.Entry(self.wel_frame,bg="white").grid(row=3,column=2,padx=5,pady=5,sticky=tk.W)
meldung_label=tk.Label(self.wel_frame,text="Meldung",font=self.my_font).grid(row=7,column=0,padx=5,pady=5,sticky=tk.W)
meldg_label=tk.Label(self.wel_frame,text= " ",bg="white").grid(row=6,column=1,columnspan=2,padx=5,pady=5,sticky=tk.W)
self.frame2 = tk.Frame(master,bd=20,)
self.frame2.grid(row=0, column=4,padx=5,pady=5,)
weiter_button=tk.Button(self.frame2, text='Weiter',fg="red",font=self.my_font).grid(row=0,column=4,padx=5,pady=5,sticky=tk.E)
neuein_button=tk.Button(self.frame2,text="Neue ",font=self.my_font,command=start).grid(row=3,column=4,padx=5,pady=5,sticky=tk.E)
ende_button=tk.Button(self.frame2,text="ENDE ",font=self.my_font,command=self.master.destroy).grid(row=4,column=4,padx=5,pady=5,sticky=tk.E)
def start(self):
pass
print("hallo, hier geht es weiter!")
def main():
pass
root=tk.Tk()
app=Eingeben(root)
root.mainloop
if __name__ == "__main__":
main()
Sicher, das ist ohne OOP auch machbar, ich habe bisher wenig mit OOP gemacht, deshalb. Da es sich um den Anfang einer Simulation handelt, brauche ich die OOP für weiteres.
Danke für alle Hinweise!
es geht um GUI mit tkinter und OOP.
Ohne OOP habe ich schon mehrer GUIs gemacht, da funktioniert es.
Mit OOP habe ich Schwierigkeiten mit dem command.
Hier die Zeile:
neuein_button=tk.Button(self.frame2,text="Neue ",font=self.my_font,command=self.start).grid(row=3,column=4,padx=5,pady=5,sticky=tk.E)
def start(self):
pass
print("hallo, hier geht es weiter!")
und nun die Fehlermeldung:
neuein_button=tk.Button(self.frame2,text="Neue ",font=self.my_font,command=self.start).grid(row=3,column=4,padx=5,pady=5,sticky=tk.E)
AttributeError: 'Eingeben' object has no attribute 'start'
Das verstehe ich, aber wie geht das richtig.
Wenn ich das self weglasse also command=start mache kommt die Meldung:
return self.func(*args)
TypeError: start() missing 1 required positional argument: 'self'
Auch das ist klar, aber wie geht es nun richtig ?
Mein Programm:
import tkinter as tk
from tkinter import ttk
class Eingeben():
pass
def __init__(self, master):
pass
self.master = master
self.master.geometry("600x300")
self.master.title("RÜCKNAHMEN / Eingabe")
self.wel_frame= tk.Frame(master,bd=20,)
self.wel_frame.grid(row=0, column=2,padx=5,pady=5,)
self.my_font=("Arial",14)
start_label=tk.Label(self.wel_frame, text='Rot',font=self.my_font,fg="red").grid(row=1,column=0,pady=5,padx=5,sticky=tk.W)
weiter_label=tk.Label(self.wel_frame,text="Blau",font=self.my_font,fg="blue" ).grid(row=2,column=0,padx=5,pady=5,sticky=tk.W)
next2_label=tk.Label(self.wel_frame,text="Gruen",font=self.my_font,fg="green").grid(row=3,column=0,padx=5,pady=5,sticky=tk.W)
next3_label=tk.Label(self.wel_frame,text="Stueckzahl",font=self.my_font).grid(row=0,column=1,padx=5,pady=5,sticky=tk.W)
next4_label=tk.Label(self.wel_frame,text=" Preis/€ ",font=self.my_font).grid(row=0,column=2,padx=5,pady=5,sticky=tk.W)
next5_label=tk.Label(self.wel_frame,text=" noch",font=self.my_font).grid(row=1,column=2,padx=5,pady=5,sticky=tk.W)
next6_label=tk.Label(self.wel_frame,text="so-so",font=self.my_font).grid(row=2,column=2,padx=5,pady=5,sticky=tk.W)
next8_label=tk.Label(self.wel_frame,text=" Name",font=self.my_font).grid(row=6,column=0,padx=5,pady=5,sticky=tk.W)
rotstck_entry=tk.Entry(self.wel_frame,bg="white").grid(row=1,column=1,padx=5,pady=5,sticky=tk.W)
blaustck_entry=tk.Entry(self.wel_frame,bg="white").grid(row=2,column=1,padx=5,pady=5,sticky=tk.W)
gruenstck_entry=tk.Entry(self.wel_frame,bg="white").grid(row=3,column=1,padx=5,pady=5,sticky=tk.W)
kdname_entry=tk.Entry(self.wel_frame,bg="white",font=self.my_font).grid(row=6,column=1,columnspan=3,padx=5,pady=5,sticky=tk.W)
rotprs_entry=tk.Entry(self.wel_frame,bg="white").grid(row=1,column=2,padx=5,pady=5,sticky=tk.W)
blauprs_entry=tk.Entry(self.wel_frame,bg="white").grid(row=2,column=2,padx=5,pady=5,sticky=tk.W)
gruenprs_entry=tk.Entry(self.wel_frame,bg="white").grid(row=3,column=2,padx=5,pady=5,sticky=tk.W)
meldung_label=tk.Label(self.wel_frame,text="Meldung",font=self.my_font).grid(row=7,column=0,padx=5,pady=5,sticky=tk.W)
meldg_label=tk.Label(self.wel_frame,text= " ",bg="white").grid(row=6,column=1,columnspan=2,padx=5,pady=5,sticky=tk.W)
self.frame2 = tk.Frame(master,bd=20,)
self.frame2.grid(row=0, column=4,padx=5,pady=5,)
weiter_button=tk.Button(self.frame2, text='Weiter',fg="red",font=self.my_font).grid(row=0,column=4,padx=5,pady=5,sticky=tk.E)
neuein_button=tk.Button(self.frame2,text="Neue ",font=self.my_font,command=start).grid(row=3,column=4,padx=5,pady=5,sticky=tk.E)
ende_button=tk.Button(self.frame2,text="ENDE ",font=self.my_font,command=self.master.destroy).grid(row=4,column=4,padx=5,pady=5,sticky=tk.E)
def start(self):
pass
print("hallo, hier geht es weiter!")
def main():
pass
root=tk.Tk()
app=Eingeben(root)
root.mainloop
if __name__ == "__main__":
main()
Sicher, das ist ohne OOP auch machbar, ich habe bisher wenig mit OOP gemacht, deshalb. Da es sich um den Anfang einer Simulation handelt, brauche ich die OOP für weiteres.
Danke für alle Hinweise!