Python 3.x 在单独的python模块(tk.Frames)中从类调用变量
我正在编写一个Python 3.x 在单独的python模块(tk.Frames)中从类调用变量,python-3.x,tkinter,Python 3.x,Tkinter,我正在编写一个tkinter应用程序,在三个不同的.py文件中有三个页面 我重新编写了代码,允许我通过在所有后续页面中运行一个主要的总体应用程序来创建每个帧,该应用程序是self.controller(感谢该站点上的一些优秀用户)。我这样做的原因是我希望能够将用户名(tk.StringVar())从第一个帧传递到第二个帧中的tk.Label) 正如我在上面所说的,我已经重写了几次这段代码,但是当我试图从其他页面调用变量或函数时,我仍然会得到如下所示的错误 另一个页面称为FrontPage,它存储
tkinter
应用程序,在三个不同的.py
文件中有三个页面
我重新编写了代码,允许我通过在所有后续页面中运行一个主要的总体应用程序来创建每个帧,该应用程序是self.controller
(感谢该站点上的一些优秀用户)。我这样做的原因是我希望能够将用户名(tk.StringVar()
)从第一个帧传递到第二个帧中的tk.Label
)
正如我在上面所说的,我已经重写了几次这段代码,但是当我试图从其他页面调用变量或函数时,我仍然会得到如下所示的错误
另一个页面称为FrontPage,它存储在front_page.py
中,当我在主tk.tk
中运行该页面时,它工作正常,因此我知道我已经在那里正确定义了self.name_条目
我在游戏页面中使用的(最低)代码是
import tkinter as tk
from tkinter import SUNKEN
import front_page
from front_page import FrontPage
from character import Character
from dice_roll import Die
class GamePage(tk.Frame):
"""The overall class for the app"""
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text="This is the start page")
label.pack(side="top", fill="x", pady=10)
self.features = {}
#This is where I try to call the text from the other page
self.character_name = front_page.FrontPage.name_entry.get()
self.name_label = tk.Label(
self.mainframe,
text= self.character_name,
font=("Courier", 20),
bd = 1,
relief = SUNKEN
)
self.name_label.pack()
当我试图从FrontPage上的tk.Entry
调用文本时,它不起作用。我的其他类(从顶部导入)中的所有函数都可以正常工作
Traceback (most recent call last):
File "/Users/kevinomalley/Desktop/python_work/rapid_rpg/app_GUI.py",
line 47, in <module>
app = GUI()
File "/Users/kevinomalley/Desktop/python_work/rapid_rpg/app_GUI.py",
line 20, in __init__
frame = F(parent=container, controller=self)
File "/Users/kevinomalley/Desktop/python_work/rapid_rpg/main_page.py",
line 23, in __init__
self.character_name = front_page.FrontPage.name_entry.get()
AttributeError: type object 'FrontPage' has no attribute 'name_entry'
回溯(最近一次呼叫最后一次):
文件“/Users/kevinomalley/Desktop/python\u work/rapid\u rpg/app\u GUI.py”,
第47行,在
app=GUI()
文件“/Users/kevinomalley/Desktop/python\u work/rapid\u rpg/app\u GUI.py”,
第20行,in_uuuinit__
帧=F(父级=容器,控制器=自身)
文件“/Users/kevinomalley/Desktop/python\u work/rapid\u rpg/main\u page.py”,
第23行,in__init__
self.character\u name=front\u page.FrontPage.name\u entry.get()
AttributeError:类型对象“FrontPage”没有属性“name\u entry”
现在我90%确定这是因为我没有正确使用self.controller
我看到很多答案都提到了它,但没有明确解释如何使用它或有效地调用它
如果有人能把我从5天的撞墙中解救出来,那我可怜的小菜鸟的心就好了
谢谢控制器是控制页面之间访问的一种方式。您还没有显示所有代码,但是如果您希望您的页面能够访问其他页面,那么您需要做的第一件事就是创建一个函数,该函数可以返回对其他页面的引用
例如:
class YourApp(...):
...
def get_page(self, page_class):
return self.frames[page_class]
self.character_name = game_page.name_entry.get()
现在,您可以从任何页面调用此函数以获取对任何其他页面的引用:
game_page = self.controller.get_page(GamePage)
通过该引用,您现在可以使用其任何属性:。例如:
class YourApp(...):
...
def get_page(self, page_class):
return self.frames[page_class]
self.character_name = game_page.name_entry.get()
注意:这些示例可能不是100%正确。我不知道您是如何实现其余代码的。然而,这个概念很重要:
- 将方法添加到控制器以返回页面
- 调用该方法以获取对页面的引用
- 使用该引用获取该页面的属性
这一切都在下面的回答中得到了更详细的解释:Bryan,非常感谢你的回答。我将完成这项工作,将其添加到我的代码中。你真的很像tkinter的耳语者。几天前,我偶然发现了你建议的答案,它确实很有帮助,但我似乎一直忽略了其中的一部分。我知道你可能忙得不可开交,但如果你写过tkinter教程,我相信它会帮助很多人。