【发布时间】:2021-09-17 03:41:43
【问题描述】:
我在这里有这段代码,我想将值从一个类 (StartPage) 传递到另一个类 (PageOne)。我在我的控制器“get_page”中创建了一个方法,让我可以访问类之间的页面数据。所以,我在 StartPage 中有一个条目,我想将它的值传递给 PageOne。因此,代码运行,但在 PageOne 中有一个用于调试的打印。一旦我启动程序,它就会自动运行所有代码,就像调用 PageOne 一样,即使我没有按下按钮。我想传递给第二页的值永远不会被传递。有人可以帮我吗? 提前致谢!
import tkinter as tk # python 3
from tkinter import font as tkfont
from typing_extensions import IntVar # python 3
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
# the container is where we'll stack a bunch of frames
# on top of each other, then the one we want visible
# will be raised above the others
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 (StartPage, PageOne):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
# put all of the pages in the same location;
# the one on the top of the stacking order
# will be the one that is visible.
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame("StartPage")
def show_frame(self, page_name):
'''Show a frame for the given page name'''
frame = self.frames[page_name]
frame.tkraise()
def get_page(self, classname):
'''Returns an instance of a page given it's class name as a string'''
for page in self.frames.values():
if str(page.__class__.__name__) == classname:
return page
return None
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text="Start Page: insert value", font=controller.title_font)
label.pack(side="top", fill="x", pady=10)
self.some_input = tk.StringVar()
self.some_entry = tk.Entry(self, width=8)
self.some_entry.pack()
self.some_input = self.some_entry.get()
button1 = tk.Button(self, text='Next Page', command=lambda: controller.show_frame("PageOne"))
button1.pack()
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
start_page = self.controller.get_page('StartPage')
value = start_page.some_entry.get()
print ('The value stored in StartPage entry = %s' % start_page.some_input)
label = tk.Label(self, text="This is page 1, the value stored is" + str(value), font=controller.title_font)
label.pack(side="top", fill="x", pady=10)
button = tk.Button(self, text="Go to the start page",
command=lambda: controller.show_frame("StartPage"))
button.pack()
if __name__ == "__main__":
app = SampleApp()
app.mainloop()
【问题讨论】:
-
查看你的 for 循环:
for F in (StartPage, PageOne)然后frame = F(parent=container, controller=self)。这会在程序启动时同时创建StartPage()和PageOne()。有 2 种可能的解决方案:创建一个StartPage调用的函数,在PageOne内创建标签,或者重新设计整个代码。 -
“一个开始页面调用的函数在第一页内创建标签”是什么意思?
标签: python class tkinter model-view-controller