python-3.x - 从不同的帧更改 Tkinter 帧
问题描述
我正在 Tkinter 中制作一个项目,我在一帧中收集一些信息(我们称之为第一帧),并且基于该信息,我想更改不同帧的布局(我们称之为第二帧)。
我附加的代码是我想要实现的基本版本(我的项目长约 630 行)。
我遇到的问题是如何访问框架,这是一个类。谷歌搜索我在https://stackoverflow.com/questions/48731097/calling-functions-from-a-tkinter-frame-to-another# =上看到了 Bryan Oakley 的回复,但是当我尝试复制它时,我得到了一个错误.
编辑:以下修改使它起作用,因此当单击 PageTwo 上的按钮时,它当前将“测试”附加到 testText。
from tkinter import *
from tkinter import ttk
class MyApp(Tk):
def __init__(self):
Tk.__init__(self)
container = ttk.Frame(self)
container.pack(side="top", fill="both", expand = True)
self.frames = {}
for F in (PageOne, PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky = NSEW)
self.show_frame(PageOne)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
def get_page(self, classname):
'''Returns an instance of a page given its class name as a string'''
for page in self.frames.values():
if str(page.__class__.__name__) == classname:
return page
return None
def test_get_page(self, page_class):
return self.frames[page_class]
class PageOne(ttk.Frame):
def __init__(self, parent, controller):
self.controller=controller
ttk.Frame.__init__(self, parent)
ttk.Label(self, text='PageOne').grid()
self.testText = Text(self, height=2, width=30)
button1 = ttk.Button(self, text='Next Page',
command=lambda: controller.show_frame(PageTwo))
self.testText.grid()
button1.grid()
class PageTwo(ttk.Frame):
def __init__(self, parent, controller):
self.controller=controller
ttk.Frame.__init__(self, parent)
ttk.Label(self, text='PageTwo').grid()
button1 = ttk.Button(self, text='Previous Page',
command=self.testButton)#controller.show_frame(PageOne))
button1.grid()
def testButton(self):
page = self.controller.test_get_page(PageOne)
page.testText.insert(END,'testing')
self.controller.show_frame(PageOne)
app = MyApp()
app.title('Multi-Page Test App')
app.mainloop()
一旦单击 PageTwo 上的“上一页”按钮,预期的结果将是 PageOne 的“testText”小部件显示“正在测试”,但我得到了以下错误:
"Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Max\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1702, in __call__
return self.func(*args)
File "C:\Users\Max\Dropbox\Programación\prueba.py", line 54, in testButton
page.testText.insert(0,'testing')
AttributeError: 'PageOne' object has no attribute 'testText'"
解决方案
错误在堆栈跟踪中给出。“testText”变量当前不是 PageOne 对象的实例变量。你应该设置self.testText = Text(self, height=2, width=30)
推荐阅读
- python - 如何在运行 Flask 时让 python 日志库在控制台中打印日志?
- asp.net - 如何找出 DynamoDb 表的属性类型?
- mysql - 如何在 MySQL 中使用创建的列作为带有 CASE 子句的 ORDER BY 的参数?(#42S22 错误)
- text - 对于使用 Three.JS 构建的 VR 应用程序,是否有任何替代方法可以提供更好的性能?
- c# - OpenIddict Asp.net Core 5.0 如何在刷新令牌流中获取主体关联
- postgresql - 如何将一列添加到 postgresql 模式中的所有表
- c# - 使用并行代码时全局变量的性能问题
- r - R studio 上的瞬时速度
- python - 在 RDFLIB 上使用 OWL-RL 进行传递推理
- async-await - 在另一个函数中使用异步函数