首页 > 解决方案 > 如何将值传递给 tkinter 页面?

问题描述

我一直在关注 Sentdex 的播放列表“GUI's with Tkinter (Intermediate)”,但我不知道如何向页面提供信息。这是我到目前为止所拥有的

class Project(tk.Tk):
  def init(self, *args, **kwargs):
      tk.Tk.init(self, *args, *kwargs)
      tk.Tk.wm_title(self, "Project")
      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 (HomePage,PageOne, PageTwo):
          frame = F(container, self)
          self.frames[F] = frame
          frame.grid(row=0, column=0, sticky="nsew")
      self.show_frame(HomePage)
  def show_frame(self, cont):
      frame = self.frames[cont]
      frame.tkraise()

class PageTwo:
  def __init__(self,parent,controller,name):
      tk.Frame.__init__(self,parent)
      self.name=name
      label = tk.Label(self, text=self.name, font=LARGE_FONT)
      label.pack(pady=10, padx=10)
      button = ttk.Button(self, text="Back to Team Page", command=lambda: controller.show_frame(HomePage))
      button.pack()

PageTwo 类需要在其上命名,但我不断收到 KeyError

frame = self.frames[cont]                                                                   
KeyError: <__main__.Page2 object .!frame.!page2>

我能做些什么来解决这个问题?

标签: pythonpython-3.xtkinter

解决方案


您复制的代码并非旨在在创建时向每个页面传递不同的信息。该代码旨在要求页面在构建页面时都采用完全相同的参数。

话虽如此,改变页面的构造方式是微不足道的。

首先删除此代码:

self.frames = {}
for F in (HomePage,PageOne, PageTwo):
    frame = F(container, self)
    self.frames[F] = frame
    frame.grid(row=0, column=0, sticky="nsew")

然后,在其位置添加此代码:

self.frames = {
    HomePage: HomePage(container, self),
    PageOne:  PageOne(container, self),
    PageTwo:  PageTwo(container, self, name="the name"),
}
self.frames[HomePage].grid(row=0, column=0, sticky="nsew")
self.frames[PageOne].grid(row=0, column=0, sticky="nsew")
self.frames[PageTwo].grid(row=0, column=0, sticky="nsew")

该教程中的代码是从 stackoverflow 上的答案复制而来的。他在解释代码的工作原理方面做得很差,并且它产生了许多问题,这些问题最终回到了 StackOverflow 上。原始代码绝对不是为刚开始使用 tkinter 的人设计的。

要查看原始代码的修改版本以及有关该代码的其他问题的链接,请参阅此答案:https ://stackoverflow.com/a/7557028/7432


推荐阅读