Tkinter登录和菜单程序

时间:2017-09-16 09:50:21

标签: python-3.x tkinter

我正在创建一个具有登录页面的Tkinter Python程序,一旦您登录,它将显示一个菜单页面供用户与之交互。

我的代码包括Quiz类,StartPage类,Menu类,难度级别和Login页面如下:

import tkinter as tk
from tkinter import *
import tkinter.messagebox as tm
class Quiz (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, Menu, Difficulty):
             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 = "Login")
         label.pack(pady = 10 , padx = 10)
         Username = tk.Entry(self)
         Username.pack()
         Password = tk.Entry (self, show = "*")
         Password.pack()
         button1 = tk.Button(self, text = "Login", command = lambda: Login(Username,Password,parent,controller,self))
         button1.pack()

 class Menu(tk.Frame):
     def __init__ (self, parent, controller) :
         tk.Frame.__init__(self, parent)
         label = tk.Label(self, text = "Menu")
         button1 = tk.Button(self, text = "Histoy", command = lambda: controller.show_frame(Difficulty))
         button1.pack()
         button2 = tk.Button(self, text = "Maths", command = lambda: controller.show_frame(Difficulty))
         button2.pack()
         button3 = tk.Button(self, text = "Music",
                        command = lambda: controller.show_frame(Difficulty))
         button3.pack()

 class Difficulty(tk.Frame):
    def __init__ (self, parent, controller):
         tk.Frame.__init__(self,parent)
         label = tk.Label(self, text = "Difficulty")
         Easy = tk.Button(self, text = "Easy", command = lambda: controller.show_frame(Difficulty))
         Easy.pack()
         Medium = tk.Button(self, text = "Medium",command = lambda: controller.show_frame(Difficulty))
         Medium.pack()
         Hard = tk.Button(self, text = "Hard", command = lambda: controller.show_frame(Difficulty))
         Hard.pack()
         backtomenu = tk.Button(self, text = "Back to Menu", command = lambda: controller.show_frame(Menu))
         backtomenu.pack()

 def Login(Username,Password,parent,controller,self):
     Usernames = []
     count = 0
     Username = Username.get()
     Password = Password.get()
     try:
         with open ("Usernames&Passwords.txt" , "r", encoding = "UTF-8" ) as                    file:
            for each in file:
                Usernames.append(each.strip("\n"))

except IOError as error:
    print (error)
    if Usernames[count] == Username :
         if Usernames[count + 1] == Password:
            Menu( parent, controller)
            print ("Hi")
         else:
            tm.showinfo("Username or Password is Incorrect")

     else:
          tm.showinfo("Username or Password is Incorrect")
app = Quiz()
app.geometry ("500x300")
app.mainloop()

当我运行代码时,没有显示错误消息,但它没有运行Menu类,因此它不会转到下一个Tkinter Frame继续执行该程序。有人可以帮助指出我为什么Main类没有运行的正确方向。提前谢谢。

1 个答案:

答案 0 :(得分:-1)

在显示下一个小部件之前,您必须销毁所有其他小部件。 在菜单(父级,控制器)之前插入self.destroy()。 必须通过困难来完成同样的事情。

编辑:正如@Bryan Oakley指出的那样,这是错误的解决方案。而是将Menu(parent, controller)更改为controller.show_frame(Menu)