Tkinter模块错误错误在calss pageone中创建登录页面

时间:2017-07-19 20:59:55

标签: python tkinter

我已经尝试为库管理系统编写程序我正在使用tkinter模块。我已经写了下面的代码,但是当我尝试创建多个文本框时,我收到了以下错误。

  File "Hope_work.py", line 22, in __init__ 
    frame = F(container, self)
  File "Hope_work.py", line 62, in __init__
    pwd_lable.pack()
UnboundLocalError: local variable 'pwd_lable' referenced before assignment 

以下是我在PageOne课程中收到错误的完整程序

import tkinter as tk
import os
LARGE_FONT= ("Verdana", 12)
class Myprogramapp(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, PageOne):
            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(PageOne))
        button.pack()
        button1 = tk.Button(self, text="Lib Login")
        button1.pack()
class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        name_label = tk.Label(self, text="User ID : ")
        pwd_label = tk.Label(self.name_lable, text="Password:")
        name_label.pack(pady=10,padx=10)
        pwd_lable.pack(pady=10,padx=10)
        name_lable = tk.Entry(self)
        pwd_lable = tk.Entry(self, show="*")
        name_lable.pack()
        pwd_lable.pack()
        button1 = tk.Button(self, text="Login")
        button1.pack()
if __name__ == "__main__":
    app = Myprogramapp()
    app.mainloop()

**

1 个答案:

答案 0 :(得分:0)

看起来你试图咬掉的东西比你可以咀嚼更多,所以说这个代码的例子。你会错过使用tkinter的部分,这些部分应该被理解,然后再转向更复杂的事情。

在尝试使用这样的多个类之前,请尝试更多地关注tkinter如何工作以及如何在单个类中甚至在类之外正确实现其所有小部件。

您不会将小部件分配给另一个小部件,就像您尝试在此处一样:

pwd_label = tk.Label(self.name_lable, text="Password:")

这是你的引用中引用的问题。您需要将Label小部件分配给根窗口,框架或顶层。

您的缩进不干净,如果您在问题中粘贴的方式准确无误,那么您的代码将无效,因为def show_frame()方法不在Myprogramapp类内。

您在这里无缘无故地导入os,导入您当前未使用的库是不太好的做法。

您应该将程序的一些重要部分放入类属性中,例如输入字段。如果您要为该字段输入密码并尝试get()方法内的输入字段中的字符串,则您将无法将其作为类属性。您可以通过向窗口小部件名称添加self.前缀来解决此问题。

完成所有更改后,您将获得一个带有2个按钮的tkinter窗口。 Admin Login按钮将显示登录屏幕。话虽如此,我认为你应该在学习tkinter或者在一个单独的课程中一起离开课程,直到你对类,方法和属性如何工作和使用有充分的理解。