无法在Tkinter中定义多个变量内部类

时间:2017-08-02 12:52:36

标签: python tkinter sqlite

我已经在类中声明了变量,但现在我收到了错误

Traceback (most recent call last): 
File "ank.py", line 162, in <module> class Addlib(tk.Frame): File "ank.py", 
line 165, in Addlib self.Name = tk.StringVar() 
File "/usr/lib/python3.5/tkinter/__init__.py", line 337, in __init__ Variable.__init__(self, master, value, name) 
File "/usr/lib/python3.5/tkinter/__init__.py",
line 236, in __init__ self._root = master._root() AttributeError: 
'NoneType' object has no attribute '_root'

下面是我的代码我在类中声明了变量,当我运行代码时我得到的错误请指导我进一步以便我可以解决问题基本上我必须将数据存储在文本框的表中。

import tkinter as tk
from tkinter.messagebox import showinfo

import sqlite3
LARGE_FONT= ("Verdana", 12)

class Myproj(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        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, Adminlogin, Liblogin, Adsection, Addlib):

            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        label = tk.Label(self, text="Library Managment system", font=LARGE_FONT)
        label.pack(pady=10,padx=10)

        button = tk.Button(self, text="Admin Login",
                            command=lambda: controller.show_frame(Adminlogin))
        button.pack()

        button2 = tk.Button(self, text="Lib Login",
                            command=lambda: controller.show_frame(Liblogin))
        button2.pack()


class Adminlogin(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        name_label = tk.Label(self, text="User ID:", font=LARGE_FONT)
        name_label.pack(pady=10,padx=10)
        name_lable = tk.Entry(self)
        name_lable.pack(pady=10,padx=10)
        pwd_label = tk.Label(self, text="Password", font=LARGE_FONT)
        pwd_label.pack(pady=10,padx=10)
        pwd_lable = tk.Entry(self, show="*")
        pwd_lable.pack(pady=10,padx=10)

        button1 = tk.Button(self, text="Back to Home",
                            command=lambda: controller.show_frame(StartPage))
        button1.pack()

        button2 = tk.Button(self, text="Login",
                            command=lambda: controller.show_frame(Adsection))
        button2.pack()


class Liblogin(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        Lname_label = tk.Label(self, text="User ID:", font=LARGE_FONT)
        Lname_label.pack(pady=10,padx=10)
        Lname_lable = tk.Entry(self)
        Lname_lable.pack(pady=10,padx=10)
        Lpwd_label = tk.Label(self, text="Password", font=LARGE_FONT)
        Lpwd_label.pack(pady=10,padx=10)
        Lpwd_lable = tk.Entry(self, show="*")
        Lpwd_lable.pack(pady=10,padx=10)


        button1 = tk.Button(self, text="Back to Home",
                            command=lambda: controller.show_frame(StartPage))
        button1.pack()

        button2 = tk.Button(self, text="Login",
                            command=lambda: controller.show_frame(Adminlogin))
        button2.pack()

class Adsection(tk.Frame):



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

            button1 = tk.Button(self, text="Add Librarian",
                                command=lambda: controller.show_frame(Addlib))
            button1.pack()

            button2 = tk.Button(self, text="View Librarian",
                                command=viewentry)
            button2.pack()

            button3 = tk.Button(self, text="Delete Librarian",
                                command=lambda: controller.show_frame(StartPage))
            button3.pack()

            button4 = tk.Button(self, text="Logout",
                                command=lambda: controller.show_frame(StartPage))
            button4.pack()



class Addlib(tk.Frame):
         Name = tk.StringVar()
         Password = tk.StringVar()
         emailvar = tk.StringVar()
         addressvar = tk.StringVar()
         cityvar = tk.StringVar()
         contectvar =tk.StringVar()

        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
            Libname_label = tk.Label(self, text="Name:", font=LARGE_FONT)
            Libname_label.pack(pady=10,padx=10)
            Libname_lable = tk.Entry(self, textvariable=Name)
            #Name = namevar.get()
            Libname_lable.pack(pady=10,padx=10)
            Libpass_label = tk.Label(self, text="Password:", font=LARGE_FONT)
            Libpass_label.pack(pady=10,padx=10)
            Libpass_label = tk.Entry(self, show ='*', textvariable=Password)
            #Password = pwdvar.get()
            Libpass_label.pack(pady=10,padx=10)
            Libemail_label = tk.Label(self, text="Email:", font=LARGE_FONT)
            Libemail_label.pack(pady=10,padx=10)
            Libemail_label = tk.Entry(self, textvariable=emailvar)
            #Email = emailvar.get()
            Libemail_label.pack(pady=10,padx=10)
            LibAddres_label = tk.Label(self, text="Address:", font=LARGE_FONT)
            LibAddres_label.pack(pady=10,padx=10)
            LibAddres_label = tk.Entry(self, textvariable=addressvar)
            #Address = addressvar.get()
            LibAddres_label.pack(pady=10,padx=10)
            Libcity_label = tk.Label(self, text="City:", font=LARGE_FONT)
            Libcity_label.pack(pady=10,padx=10)
            Libcity_label = tk.Entry(self, textvariable=cityvar)
            #City = cityvar.get()
            Libcity_label.pack(pady=10,padx=10)
            Libcontect_label = tk.Label(self, text="Contect:", font=LARGE_FONT)
            Libcontect_label.pack(pady=10,padx=10)
            Libcontect_label = tk.Entry(self, textvariable=contectvar)
            #Contect = contectvar.get()
            Libcontect_label.pack(pady=10,padx=10)

            button1 = tk.Button(self, text="Show",command=show)
            button1.pack()
            #print("City name is {}".format(cityvar))
            button4 = tk.Button(self, text='BACK',
                                command=lambda: controller.show_frame(Adsection))

            button4.pack()

        def addentry() :

            db = sqlite3.connect("LibManagment.db")
            cur.execute('INSERT INTO Add_lib2 VALUES (?, ?, ?, ?, ?, ?);', (Name, Password, Email, Address, City, Contect))
            print("Entry Added To Database")
            db.commit()
            showinfo( title = "Librarian Add", message = "Data inserted To table")


app = Myproj()
app.mainloop()

1 个答案:

答案 0 :(得分:2)

您的代码有几个问题。一个主要问题是你的缩进。你需要先修复它。

接下来我注意到你是如何试图宣布你的一些变量的。

class Addlib(tk.Frame):
         Name = tk.StringVar()
         Password = tk.StringVar()
         emailvar = tk.StringVar()
         addressvar = tk.StringVar()
         cityvar = tk.StringVar()
         contectvar =tk.StringVar()

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

您需要将所有变量移动到__init__部分,因为这是实例化类属性的位置。此外,您需要在此处为​​所有变量添加self.前缀以使其成为类属性,因为您的类中的方法需要使用这些变量,并且您在程序中多次与它们进行交互。

你的班级应该这样开始:

class Addlib(tk.Frame):


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

        self.Name = tk.StringVar()
        self.Password = tk.StringVar()
        self.emailvar = tk.StringVar()
        self.addressvar = tk.StringVar()
        self.cityvar = tk.StringVar()
        self.contectvar = tk.StringVar()

我注意到的另一个问题是你的命令按钮指向不存在的方法。在Eclipse IDE中,这将阻止代码运行,我想它会在其他IDE上执行相同的操作。

我建议使用pass方法作为尚未使用的按钮命令的占位符。至少我喜欢这样做,所以我可以继续测试我的代码,而不需要编写所有的方法/函数。

如下所示:

def do_nothing(self):
    pass

这可以在command = self.do_nothing这样的任何命令中使用,这样你就可以设置你的按钮,直到你在程序中制作稍后需要的方法/功能。

最后一点是这一行:

cur.execute('INSERT INTO Add_lib2 VALUES (?, ?, ?, ?, ?, ?);', (self.Name, self.Password, self.Email, self.Address, self.City, self.Contect))

您的代码中没有任何内容与cur匹配,因此我必须注释掉这一行以允许程序运行。您可能需要验证此部分是否有效。

通过上面提到的一些更改,您的代码运行正常。