【问题标题】:Understanding Frame Classes in Tkinter了解 Tkinter 中的帧类
【发布时间】:2020-09-20 08:23:19
【问题描述】:

我是 Python 新手,并试图理解下面的代码。此代码应创建 3 个框架对象,这些对象可以旋转到前面以交换页面。
APP 类应该创建这 3 个新对象。我不确定是不是。
我想要的是通过该类中的函数修改 Dashboard 类上的标签。 即 Dashboard.update() 有人可以解释一下 APP 类是如何为 3 个窗口创建框架对象的吗?我现在确定它是,并且我想我正在尝试更新类中的文本,而不是该类的对象。

### Import libaries
import requests
import pyodbc 
import tkinter as tk
from tkinter import *
from tkinter import messagebox, ttk

### Set global fonts
TITLE_FONT = ("Verdana", 12)

### Define the applicaiton class
class APP (Frame):

    ### Build the init function to create the container and windows
    def __init__ (self, master=None ):

        Frame.__init__(self, master)
        self.grid()

        # Set the application window title
        self.master.title("Playing Around with Classes")

        # set the size of the row height for the application
        self.master.rowconfigure(0, weight=1)
        self.master.rowconfigure(1, weight=35)
        self.master.rowconfigure(2, weight=1)
        self.master.rowconfigure(3, weight=1) 

        #Row 0 - Title area
        label = tk.Label(master, text="Playing Around with Classes", font=TITLE_FONT)
        label.grid(row=0, columnspan=3, sticky="nsew")

        # Main presentation are
        Frame2 = Frame(master, bg="#263D42")
        Frame2.grid(row = 1, column = 0, rowspan = 1, columnspan = 3,  sticky = "nsew") 

        # List of pages
        self.frames = {}

        # i think this loop defines the class objects
        for F in (NetworkMap,AuthorPage,Dashboard):

            frame = F(Frame2, self)
            self.frames[F] = frame
            frame.grid(row=0, column=1, sticky="nsew")

        self.show_frame(Dashboard)

    ### Define the show_frame function that will bring the selected fram to the front so it can be viewed
    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

### Create a class for the Dashboard page.  This will also be the start page when the application starts
class Dashboard (tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent, bg="#263D42")
        label = tk.Label(self, text="Text to change", font=TITLE_FONT, bg="#263D42", fg="white", pady = 20)
        label.grid(row=0, column=0, sticky="nsew")

    def update(self):
        self.allPapersLabel.config(text="Changed Text")

### Create a page to get the Author detasil
class AuthorPage (tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)
        label = tk.Label(self, text="Get Author", font=TITLE_FONT)
        label.grid(row=0, column=0, sticky="nsew")

class NetworkMap (tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)
        label = tk.Label(self, text="Network Map", font=TITLE_FONT)
        label.grid(row=0, column=0, sticky="nsew")

def changeText():
    Dashboard.update()

changeText()

root = tk.Tk()
root.geometry("600x800+100+100")
app = APP(master=root)
app.mainloop()

【问题讨论】:

标签: python python-3.x tkinter


【解决方案1】:

谁能解释一下 APP 类是如何为 3 个窗口创建框架对象的

关键就在这里:

for F in (NetworkMap,AuthorPage,Dashboard):
    frame = F(Frame2, self)
    self.frames[F] = frame
    frame.grid(row=0, column=1, sticky="nsew")

请记住,NetworkMapAuthorPageDashboard。类是可调用对象,它们充当特定类型的新实例的工厂。

所以基本上 for 循环使 F 成为每个类的别名(或标签),并依次调用它们来实例化一个对象。

请记住,我们在大多数语言中称为“变量”的东西在 Python 中称为 名称。来自语言手册:

名称指的是对象。名称由名称绑定操作引入。

所以F 只不过是一个方便的标签来引用这三个类。 for 循环头 绑定类的名称。


顺便说一句:这看起来像是对 ttk.Notebook 的重新实现。我建议改用它。


编辑

帧被保存到frames 字典App 对象中。因此,在App 实例的所有方法中,您都可以访问self.frames 来获取各个帧。

有点奇怪(至少对我来说)是框架的类对象被用作从字典中选择的键。

所以使用self.frames[AuthorPage] App的方法中应该返回AuthorPage框架。

【讨论】:

  • 好的,谢谢。这是否意味着我可以通过 F 变量调用 Dashboard 类。像 F.update() 这样的东西来访问仪表板类中的更新功能?
  • 我只是补充上面的内容。下面每一行的代码描述是否正确。下面的行将框架变量设置为等于框架定义 frame = F(Frame2, self) 下面的行基于 3 个类 self.frames[F] = frame 创建了 3 个对象 下面的行定义了对象在页面上的位置。在这种情况下,frame.grid(row=0, column=1, sticky="nsew") 我仍然不明白如何在这些创建的对象之一中引用函数。这些对象似乎没有名字。
  • 这不是 ttk.notebook 的重新实现。几年前它开始作为对a question 的回答关于如何在不同帧之间切换。对于初学者来说这是一个糟糕的选择,但是一位 youtuber 选择了它并创建了一个很多初学者似乎都开始使用的教程。
  • @BryanOakley 我在解释“那些不了解 Unix 的人注定要重新发明它,很糟糕。” :-) 对我来说,您的链接答案(和这个问题)基本上看起来像没有标签的笔记本。我完全同意这是一个过于复杂的例子。很久以前,我开始用 C 语言为 OS/2 2.0 编写 GUI 程序,所以(大多数)GUI 工具包的事件驱动性质对我来说已经过时了。但是对于新手来说,我发现了宝贵的小 python/tkinter 材料,它们清楚地解释了 GUI 工具包的性质,而不仅仅是提供代码示例。
  • @BryanOakley 更重要的是,我认为 Python 新手不应该开始使用 tkinter 程序根本。在这种情况下,需要同时解释的内容太多了。
猜你喜欢
  • 2016-03-21
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多