tkinter中的属性错误,我无法使用链接到按钮的方法

时间:2018-03-06 20:19:20

标签: python tkinter attributeerror

我试图链接按钮" calculate_button"到我创建的方法" calculate()"这应该只是打印"你只是点击了#34; 虽然提出了一个错误,表示没有属性计算 我真的不明白应该在哪里编写方法计算以及如何正确地将按钮链接到方法

这是错误

AttributeError: '_tkinter.tkapp' object has no attribute 'calculate
line 2095, in __getattr__
    return getattr(self.tk, attr)
File "deathcalculatorapp.py", line 102, in <lambda>
command=lambda: controller.calculate())

这是代码

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import datetime

LARGE_FONT = ("VERDANA", 12)


#user's information manager(classes and method)

class person:
    def __init__(self, name, birthday, sex, age, diet, smoker, physical_activity_frequency):
    self.name = name
    self.birthday = birthday
    self.sex = sex
    self.age = age
    self.diet = diet
    self.smoker = smoker
    self.physical_activity_frequency = physical_activity_frequency

    def age():
    today = datetime.today()
    person.age = person.birthday - today.year
    return person.age






#main windows

class deathCalculatorapp(tk.Tk):

def __init__(self, *args, **kwargs):
    tk.Tk.__init__(self, *args, **kwargs)

    tk.Tk.wm_title(self, "age calculator app")

    container = tk.Frame(self)
    container.pack(side="top", fill="both", expand=True)
    container.grid_rowconfigure(0, weight=1)
    container.grid_columnconfigure(0, weight=1)

    self.frames = {}
    for F in (StartPage, PageOne, PageTwo):
        page_name = F.__name__
        frame = F(parent=container, controller=self)
        self.frames[page_name] = frame

        # put all of the pages in the same location;
        # the one on the top of the stacking order
        # will be the one that is visible.
        frame.grid(row=0, column=0, sticky="nsew")

    self.show_frame("StartPage")

def show_frame(self, page_name):
    '''Show a frame for the given page name'''
    frame = self.frames[page_name]
    frame.tkraise()

def calculate():
        print("you've jsut clicked the button")


#all of the frames

class StartPage(tk.Frame):

def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    self.controller = controller


    label = ttk.Label(self, text="deathcalculatorapp", font=LARGE_FONT)
    label.grid(column=1, row=0)

    first_label = ttk.Label(self, text = "insert your data")
    year_label = tk.Label(self, text="year", bg ="lightblue", padx=9)
    month_label = tk.Label(self, text= "month", bg = "lightblue", padx=3)
    day_label = tk.Label(self, text ="day", bg= "lightblue", padx=11)

    first_label.grid(column=1, row=3)
    year_label.grid(column=0, row =4)
    month_label.grid(column=0, row =5)
    day_label.grid(column=0, row = 6)

    year_entry = tk.Entry(self,text = "", bg = "lightblue")
    month_entry = tk.Entry(self, text = "", bg= "lightblue")
    day_entry = tk.Entry(self, text= "", bg = "lightblue")

    year_entry.grid(column=1,row=4)
    month_entry.grid(column=1, row= 5)
    day_entry.grid(column=1, row=6)

    sex = tk.IntVar()

    female= ttk.Radiobutton(self, text="female",variable= sex, value="female")
    male=ttk.Radiobutton(self, text="male", variable= sex, value="male")
    female.grid(column=2, row=4)
    male.grid(column=2, row=5)

    calculate_button= ttk.Button(self, text="calculate your lifespawn",
                                 command= lambda: controller.calculate())
    calculate_button.grid(column=1, row=7)
    button1 = ttk.Button(self, text="Go to Page One",
                        command=lambda: controller.show_frame("PageOne"))
    button2 = ttk.Button(self, text="Go to Page Two",
                        command=lambda: controller.show_frame("PageTwo"))
    button1.grid(column=0, row=0)
    button2.grid(column=0, row=1)

    image = Image.open(r"/"
                       r"Users/tommasomasaracchio/Documents/pythonfolder/kushina4.jpg")
    image.thumbnail((500,300), Image.ANTIALIAS)
    photo = ImageTk.PhotoImage(image)

    Photo_label= ttk.Label(self, image=photo)
    Photo_label.image = photo
    Photo_label.grid(row= 2, column = 1)




class PageOne(tk.Frame):

def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    self.controller = controller
    label = ttk.Label(self, text="This is page 1", font=LARGE_FONT)
    label.grid(column=0, row=0)
    button = ttk.Button(self, text="Go to the start page",
                       command=lambda: controller.show_frame("StartPage"))
    button.grid(column=0, row=0)


class PageTwo(tk.Frame):

def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    self.controller = controller
    label = ttk.Label(self, text="This is page 2", font=LARGE_FONT)
    label.grid(column=0, row=0)
    button = ttk.Button(self, text="Go to the start page",
                       command=lambda: controller.show_frame("StartPage"))
    button.grid(column=0, row=0)






if __name__ == "__main__":
    app = deathCalculatorapp()
    app.mainloop()

非常感谢你的帮助,我很感激

1 个答案:

答案 0 :(得分:0)

我已经修正了缩进并添加了self作为您的计算函数参数,现在可以正常工作。

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import datetime

LARGE_FONT = ("VERDANA", 12)


#user's information manager(classes and method)

class person:
    def __init__(self, name, birthday, sex, age, diet, smoker, physical_activity_frequency):
        self.name = name
        self.birthday = birthday
        self.sex = sex
        self.age = age
        self.diet = diet
        self.smoker = smoker
        self.physical_activity_frequency = physical_activity_frequency

    def age():
        today = datetime.today()
        person.age = person.birthday - today.year
        return person.age

#main windows

class deathCalculatorapp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        tk.Tk.wm_title(self, "age calculator app")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (StartPage, PageOne, PageTwo):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame

            # put all of the pages in the same location;
            # the one on the top of the stacking order
            # will be the one that is visible.
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()

    def calculate(self):
            print("you've jsut clicked the button")


    #all of the frames

class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller


        label = ttk.Label(self, text="deathcalculatorapp", font=LARGE_FONT)
        label.grid(column=1, row=0)

        first_label = ttk.Label(self, text = "insert your data")
        year_label = tk.Label(self, text="year", bg ="lightblue", padx=9)
        month_label = tk.Label(self, text= "month", bg = "lightblue", padx=3)
        day_label = tk.Label(self, text ="day", bg= "lightblue", padx=11)

        first_label.grid(column=1, row=3)
        year_label.grid(column=0, row =4)
        month_label.grid(column=0, row =5)
        day_label.grid(column=0, row = 6)

        year_entry = tk.Entry(self,text = "", bg = "lightblue")
        month_entry = tk.Entry(self, text = "", bg= "lightblue")
        day_entry = tk.Entry(self, text= "", bg = "lightblue")

        year_entry.grid(column=1,row=4)
        month_entry.grid(column=1, row= 5)
        day_entry.grid(column=1, row=6)

        sex = tk.IntVar()

        female= ttk.Radiobutton(self, text="female",variable= sex, value="female")
        male=ttk.Radiobutton(self, text="male", variable= sex, value="male")
        female.grid(column=2, row=4)
        male.grid(column=2, row=5)

        calculate_button= ttk.Button(self, text="calculate your lifespawn",
                                     command= lambda: controller.calculate())
        calculate_button.grid(column=1, row=7)
        button1 = ttk.Button(self, text="Go to Page One",
                            command=lambda: controller.show_frame("PageOne"))
        button2 = ttk.Button(self, text="Go to Page Two",
                            command=lambda: controller.show_frame("PageTwo"))
        button1.grid(column=0, row=0)
        button2.grid(column=0, row=1)

        image = Image.open(r"/"
                           r"Users/tommasomasaracchio/Documents/pythonfolder/kushina4.jpg")
        image.thumbnail((500,300), Image.ANTIALIAS)
        photo = ImageTk.PhotoImage(image)

        Photo_label= ttk.Label(self, image=photo)
        Photo_label.image = photo
        Photo_label.grid(row= 2, column = 1)



class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = ttk.Label(self, text="This is page 1", font=LARGE_FONT)
        label.grid(column=0, row=0)
        button = ttk.Button(self, text="Go to the start page",
                           command=lambda: controller.show_frame("StartPage"))
        button.grid(column=0, row=0)


class PageTwo(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = ttk.Label(self, text="This is page 2", font=LARGE_FONT)
        label.grid(column=0, row=0)
        button = ttk.Button(self, text="Go to the start page",
                           command=lambda: controller.show_frame("StartPage"))
        button.grid(column=0, row=0)


if __name__ == "__main__":
    app = deathCalculatorapp()
    app.mainloop()