首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tkinter自动加载窗口

tkinter自动加载窗口
EN

Stack Overflow用户
提问于 2021-07-06 21:43:31
回答 1查看 40关注 0票数 0

我在这里有这段代码,我想把值从一个类(StartPage)传递到另一个类(PageOne)。我在控制器"get_page“中创建了一个方法,让我可以在类之间访问页面数据。因此,我在StartPage中有一个条目,我想将它的值传递给PageOne。因此,代码运行了,但是在PageOne中有一个用于调试的打印。只要我启动程序,它就会自动运行所有代码,就像即使我没有按下按钮也会调用PageOne一样。并且我想要传递给第二页的值永远不会被传递。有谁能帮帮我吗?提前感谢!

代码语言:javascript
复制
 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()
EN

Stack Overflow用户

发布于 2021-07-06 21:58:31

您需要找到一种方法,当show_frame()显示标签时,通知PageOne更新标签,其中一种方法是使用event_generate()函数通过虚拟事件:

代码语言:javascript
复制
class SampleApp(tk.Tk):
    ...
    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()
        # notify frame that it is raised via virtual event
        frame.event_generate("<<Raised>>")

...
class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        # save a reference of 'StartPage'
        self.start_page = self.controller.get_page('StartPage')
        # use instance variable 'self.label' instead of local variable 'label'
        self.label = tk.Label(self, font=controller.title_font)
        self.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()

        # bind the virtual event
        self.bind("<<Raised>>", self.on_raised)

    def on_raised(self, event):
        self.label.config(text=f"This is page 1, the value stored is '{self.start_page.some_entry.get()}'")
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68271705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档