我已经在python中编写了很短的时间,所以不能完全理解语言的逻辑,特别是在使用Tkinter时。我目前正在研究我在登录页面专门开发的系统的导航系统。以下是我的问题代码:
class Application(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 (createLogin, createHome, createViewer, createAnalyse):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(createLogin)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
def connectToDataBase(self):
cnxn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\Public\dbsDetectorBookingSystem.accdb')
cursor = cnxn.cursor()
cursor.execute("SELECT * FROM tblUsers")
userRows = cursor.fetchall
cursor.execute("SELECT * FROM tblRuns")
runsRows = cursor.fetchall
class createLogin(Tk.Frame):
def __init__(self, parent, controller):
Tk.Frame.__init__(self,parent)
topFrame= Tk.Frame(self)
topFrame.pack(side="top")
leftFrame = Tk.Frame(topFrame)
leftFrame.pack(side="left")
nameLabel = Tk.Label(leftFrame, text = "Username")
nameLabel.pack(side="top", padx = 5, pady = 10)
passwordLabel = Tk.Label(leftFrame, text = "Password")
passwordLabel.pack(side="top", padx = 5, pady = 10)
rightFrame = Tk.Frame(topFrame)
rightFrame.pack(side="left")
nameText = Tk.Text(rightFrame, height=1, width = 30)
nameText.pack(side="top", padx = 5, pady = 10)
passwordText = Tk.Text(rightFrame, height=1, width = 30)
passwordText.pack(side="top", padx = 5, pady = 10)
botFrame = Tk.Frame(self)
botFrame.pack(side="top")
Login = Tk.Button(botFrame, text="Login")
Login["command"] = lambda: self.checkLogin()
Login.pack(side="left", padx = 5, pady = 10)
我想要做的是让登录按钮调用一个方法,该方法可以使用读入数据库中的用户名和密码验证文本框,如果它们是正确的,那么应该调用'show_frame'方法。我可以实现验证但是每当我创建一个尝试调用'show_frame'的方法时,我必须创建一个远非理想的应用程序类的新实例,我真正想做的是触发该方法,传递'createHome '在Application类的当前实例中。
对此有任何帮助将非常感谢抱歉成为这样的新手。
答案 0 :(得分:0)
您的createLogin
课程已经引用了主要应用程序,因此我不明白为什么您认为必须创建应用程序类的新实例"。
我认为您需要做的就是保存controller
的实例并使用它来调用show_frame
方法。
class createLogin(Tk.Frame):
def __init__(self, parent, controller):
Tk.Frame.__init__(self,parent)
self.controller = controller
...
Login = Tk.Button(botFrame, text="Login", command=self.checkLogin)
...
def checkLogin(self):
...
if correct_password:
self.controller.show_frame(createHome)