Таким образом, с помощью приведенного ниже кода я могу переключать страницы с Страница 1 на страницу2, Page2 в страницу3, Page3 на страницу4, но не может перейти от Page4 к странице1.Python tkinter - невозможно отобразить один и тот же кадр более одного раза?
Он отображает сообщение об ошибке:
Traceback (most recent call last):
File "C:\Python33\lib\tkinter\__init__.py", line 1489, in __call__
return self.func(*args)
File "F:\CCTV\test\Page4.py", line 29, in buttonLoginClicked
self.controller.show_frame(Page1)
NameError: global name 'Page1' is not defined
мне было интересно, если это потому, что я не могу переключиться на тот же кадр более, что когда-то, или я просто делаю что-то неправильно. если я поместил все классы на одну и ту же страницу, это, кажется, исправить проблему, но я хотел бы иметь все классы на отдельных страницах. Может быть, это связано с импортом страниц? Это упрощенная версия моего кода, чтобы помочь показать проблему:
CCTV:
import tkinter as tk
from tkinter import ttk, messagebox
from Page1 import *
from Page2 import *
from Page3 import *
from Page4 import *
class CCTV(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack()
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (Page1, Page2, Page3, Page4):
frame = F(container, self)
self.frames[F] = frame
frame.grid(column=0, row=0, sticky="nsew")
self.openPage()
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
def openPage(self):
self.show_frame(Page1)
app = CCTV()
app.geometry("800x600")
app.mainloop()
Page1:
import tkinter as tk
from tkinter import ttk, messagebox
from Page2 import *
class Page1(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.createView()
def createView(self):
inner_frame = tk.Frame(self)
inner_frame.pack(side="top", fill="none")
self.labelTitle = ttk.Label(inner_frame, text="Page 1")
self.buttonLogin = ttk.Button(inner_frame, text="Page 2", command=self.buttonLoginClicked)
self.labelTitle.grid(row=1, columnspan=4, pady=10)
self.buttonLogin.grid(row=2, columnspan=4, pady=10)
self.grid_rowconfigure(0, weight=1)
self.grid_rowconfigure(3, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(3, weight=1)
def buttonLoginClicked(self):
self.controller.show_frame(Page2)
Page2:
import tkinter as tk
from tkinter import ttk, messagebox
from Page3 import *
class Page2(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.createView()
def createView(self):
inner_frame = tk.Frame(self)
inner_frame.pack(side="top", fill="none")
self.labelTitle = ttk.Label(inner_frame, text="Page 2")
self.buttonLogin = ttk.Button(inner_frame, text="Page 3", command=self.buttonLoginClicked)
self.labelTitle.grid(row=1, columnspan=4, pady=10)
self.buttonLogin.grid(row=2, columnspan=4, pady=10)
self.grid_rowconfigure(0, weight=1)
self.grid_rowconfigure(3, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(3, weight=1)
def buttonLoginClicked(self):
self.controller.show_frame(Page3)
Page3:
import tkinter as tk
from tkinter import ttk, messagebox
from Page4 import *
class Page3(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.createView()
def createView(self):
inner_frame = tk.Frame(self)
inner_frame.pack(side="top", fill="none")
self.labelTitle = ttk.Label(inner_frame, text="Page 3")
self.buttonLogin = ttk.Button(inner_frame, text="Page 4", command=self.buttonLoginClicked)
self.labelTitle.grid(row=1, columnspan=4, pady=10)
self.buttonLogin.grid(row=2, columnspan=4, pady=10)
self.grid_rowconfigure(0, weight=1)
self.grid_rowconfigure(3, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(3, weight=1)
def buttonLoginClicked(self):
self.controller.show_frame(Page4)
Page4:
import tkinter as tk
from tkinter import ttk, messagebox
from Page1 import *
class Page4(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.createView()
def createView(self):
inner_frame = tk.Frame(self)
inner_frame.pack(side="top", fill="none")
self.labelTitle = ttk.Label(inner_frame, text="Page 4")
self.buttonLogin = ttk.Button(inner_frame, text="Page 1", command=self.buttonLoginClicked)
self.labelTitle.grid(row=1, columnspan=4, pady=10)
self.buttonLogin.grid(row=2, columnspan=4, pady=10)
self.grid_rowconfigure(0, weight=1)
self.grid_rowconfigure(3, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(3, weight=1)
def buttonLoginClicked(self):
self.controller.show_frame(Page1)
Возможно, вы забыли 'из Page1 import *' Или вы импортируете неправильную страницу. – furas
Лучше всего написать все классы, связанные с страницами, в одном файле: 'pages.py', а не так много разных/Возможно, вы не импортировали' Page1' в файл 'Page4.py'. ум, показывающий содержимое 'Page4'. –
Если все страницы почти идентичны, вы можете создать один класс «BasePage» и использовать его для определения других классов - «class Page1 (BasePage)». – furas