Tkinter!了解如何切换框架

鲍勒

我试图教自己如何使用tkinter,我通过youtube找到了一个我不太了解的有用代码。如果有人可以帮助我理解它,将不胜感激。用**标记了我不懂的东西

import tkinter as tk  # why not from tkinter import? **

class SampleApp(tk.Tk): tk.TK**

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        # 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, PageTwo):
            page_name = F.__name__
            frame = F(container, 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() **


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)  **
        self.controller = controller  **
        label = tk.Label(self, text="This is the start page",
                         font=TITLE_FONT)
        label.pack(side="top", fill="x", pady=10)

        button1 = tk.Button(self, text="Go to Page One",
                            command=lambda: controller.show_frame("PageOne"))
        button2 = tk.Button(self, text="Go to Page Two",
                            command=lambda: controller.show_frame("PageTwo"))
        button1.pack()
        button2.pack()
布莱恩·奥克利(Bryan Oakley)
import tkinter as tk  # why not from tkinter import? **

为什么不from tkinter import *呢?因为那是错误的方法。全球进口不好由于某些我不了解的原因,Tkinter教程往往会以错误的方式进行操作。

之所以选择该as tk部分,是因为您可以这样做,tk.Frame而不是Tkinter.Frame,这使得代码的键入变得更容易一点,阅读起来也更加容易。这是完全可选的。


class SampleApp(tk.Tk): 

tk是导入的tkinter模块的名称。Tk是该模块中代表根窗口的类的名称。每个tkinter应用程序必须具有单个根窗口。通过将其放在中SampleApp,这将创建此窗口小部件的子类-具有其他功能的副本。

不必从继承tk.Tk您可以继承tk.Frame任何其他tkinter小部件,甚至object这是个人喜好。选择使某些事情变得容易,某些事情变得更加困难。


container = tk.Frame(self)

上面创建了一个Frame小部件的实例,该实例将用作其他“页面”的容器。这些“页面”将全部堆叠在此容器中。


frame = F(container, self)

F是循环变量。该循环在一个类列表上进行迭代,因此每次循环F都将代表一个类。F(...)创建该类的实例。这些类(StartPagePageOnePageTwo),都需要两个参数:窗口小部件,这将是这个类的父,和一个对象,将服务器作为控制器(从UI图案借用的一个术语模型/视图/控制器)。

该行代码创建该类的实例(其本身是Frame小部件的子类),并将该框架临时分配给局部变量frame

通过self作为第二个(“控制器”)参数传递,这些新的类实例将能够调用SampleApp该类对象中的方法

这样可以将对刚创建的框架的引用保存在字典中。字典的关键是页面名称(或更准确地说,是类的名称)。

这就是show_frame方法仅从类的名称即可确定实际页面小部件的方式。

在循环中创建框架在功能上等同于以下内容:

f1 = StartPage(container, self)
f2 = PageOne(container, self)
f3 = PageTwo(container, self)

f1.grid(row=0, column=0, sticky="nsew")
f2.grid(row=0, column=0, sticky="nsew")
f3.grid(row=0, column=0, sticky="nsew")

self.frames = {"StartPage": f1, "PageOne": f2, "PageTwo": f3}

frame.tkraise() 

在几乎所有的GUI工具包(包括tkinter)中,都存在“堆叠顺序”的概念:堆叠的顺序。一些工具箱可能将其称为z顺序。如果两个或多个小部件彼此堆叠(此代码通过将所有页面置于同一行和同一列中来完成),则位于堆叠顶部的小部件通常是可见的小部件。

tkraise是一种Frame对象的方法,该方法会将框架提升到堆叠顺序的顶部。在这一行代码中,frame指的是页面之一的特定实例。


tk.Frame.__init__(self, parent)

由于每个页面都是类的子tk.Frame类,因此将调用父类的构造函数。这是初始化构成实际框架小部件的所有内部结构所必需的。尽管aFrame可以有很多选择,但是此代码选择仅发送一个-引用另一个小部件,该小部件将充当此新小部件的父级。


self.controller = controller

上面的代码只是“记住”controller传入变量的值。在这种情况下,thecontroller是应用程序。通过将其保存下来,此类可以在SampleApp对象上调用方法


注意:问题中的代码来自一个教程,该教程从以下答案中复制了代码:https : //stackoverflow.com/a/7557028/7432我是原始代码的作者,但不是本教程的作者。该原始答案中包含与该代码相关的其他问题的链接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

tkinter切换按钮框架是否没有阻碍?

来自分类Dev

如何在切换框架时验证WebDriver的焦点

来自分类Dev

如何在Tkinter中切换按钮的功能?

来自分类Dev

了解jQuery事件切换

来自分类Dev

在带框架的窗户之间切换

来自分类Dev

无法在框架之间切换

来自分类Dev

切换播放!框架版本

来自分类Dev

无法在框架之间切换

来自分类Dev

python:tkinter切换svg内容

来自分类Dev

Tkinter中的切换帧

来自分类Dev

使用python(Tkinter)的按钮切换

来自分类Dev

在 tkinter 窗口之间来回切换

来自分类Dev

如何切换CAGradientLayer?

来自分类Dev

如何切换阵列?

来自分类Dev

如何切换ViewController?

来自分类Dev

如何切换元素?

来自分类Dev

如何在Visual Studio中的.NET Core项目的目标框架之间切换

来自分类Dev

VB6 +如何通过按钮在窗体的窗口/框架之间切换

来自分类Dev

如何在Microsoft Bot框架中的多个表单流之间切换?

来自分类Dev

了解更多/更少的幻灯片切换问题?

来自分类Dev

在Tkinter中切换帧时如何更新/刷新小部件?

来自分类Dev

如何在 Tkinter 中实现数据库在帧之间切换?

来自分类Dev

在Phaser框架中的Sprite动画之间切换的方法

来自分类Dev

BUG-Chrome从框架信息切换

来自分类Dev

在Python中使用菜单按钮切换框架

来自分类Dev

实施后要切换持久性框架?

来自分类Dev

在侧面菜单离子框架内使用切换按钮

来自分类Dev

PyQt-切换框架调整大小按钮

来自分类Dev

在 Xcode 上的 2 个框架之间切换