Исходя из вашего обновленного вопроса, мы должны исправить несколько вещей.
Сначала убедитесь, что вы используете правильный отступ, определенный в соответствии с правилами стиля PEP8. Это облегчит другим чтение вашего кода.
Далее, когда вы определяете класс, который наследуется от виджета, вы должны определить метод __init__
и супер.
Далее, поскольку вам нужно взаимодействовать с методом, который вызывает фреймы, нам нужно передать основной класс tkiner всем нашим классам фреймов. Таким образом, мы можем вызвать контроллер и метод show_frame.
Вот исправленная версия вашего примера. Дайте знать, если у вас появятся вопросы. Примечание. Я удалил часть проверки пароля, поскольку у меня нет hashlib.
import tkinter as tk
class PasswordManager(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
container = tk.Frame(self)
container.grid(row=0, column=0, sticky="nsew")
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames={}
for F in (LoginPage, SignUpPage, MainPage, MainPage):
frame=F(container, self)
self.frames[F]=frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(LoginPage)
def show_frame(self, cont):
print("test")
frame=self.frames[cont]
frame.tkraise()
class LoginPage(tk.Frame):
def __init__(self, container, controller):
tk.Frame.__init__(self)
self.controller = controller
tk.Label(self, text="Username").grid(row=0, sticky="e")
tk.Label(self, text="Password").grid(row=1, sticky="e")
self.entry_username = tk.Entry(self)
self.entry_password = tk.Entry(self, show="*")
self.entry_username.grid(row=0, column=1)
self.entry_password.grid(row=1, column=1)
self.checkbox = tk.Checkbutton(self, text="Keep me logged in")
self.checkbox.grid(columnspan=2)
tk.Button(self, text="Login", fg="red", command=lambda: self.show_frame(MainPage)).grid(row=3, column=0)
tk.Button(self, text="Sign Up", fg="red", command=lambda: self.show_frame(SignUpPage)).grid(row=3, column=1)
def show_frame(self, frame):
self.controller.show_frame(frame)
class SignUpPage(tk.Frame):
def __init__(self, container, controller):
tk.Frame.__init__(self)
tk.Label(self, text="Sign Up Page").pack()
class MainPage(tk.Frame):
def __init__(self, container, controller):
tk.Frame.__init__(self)
tk.Label(self, text="Main Page").pack()
PasswordManager().mainloop()