为什么要将小部件打包到框架中而不是直接将它们打包到根窗口中?

时间:2017-12-31 19:19:55

标签: python tkinter

我通过构建机票应用来学习Python。我目前正在为GUI学习TkInter,我想知道为什么我必须创建一个容器(框架)而不是只是将所有内容放在root = Tk()中似乎有效。

此外,ttk不属于tkinter,因此我不必拥有第二行(from tkinter import ttk)?

这是我的代码:

from tkinter import *
from tkinter import ttk

root = Tk()

frame = Frame(root)
root.title("AirTix")

flight_title = Label(frame, text = "Flights").grid()

root.mainloop()

谢谢!

1 个答案:

答案 0 :(得分:2)

  

我想知道为什么我必须创建一个容器(框架),而不是只将所有内容放在'name'中,这似乎有效。

您不必创建容器。无论教程或书籍告诉你,你一定是错的。在根窗口中创建所有内容没有任何问题。

话虽如此,除了最简单的应用程序外,它还可以帮助极大地组织逻辑组中的小部件,每个逻辑组都是一个框架(或者,也许是Canvas或PanedWindow) )。这使您可以灵活地为每个部分使用最佳几何管理器(root = Tk()packplace)。

例如,有一个工具栏是一个框架,有一堆按钮从左到右打包是有道理的。底部状态栏也可能是这样。主体可以是具有以网格排列的小部件的框架。

使用

grid可能会有点复杂,grid擅长将小部件放在单个水平行(工具栏或状态栏)或列(顶部的工具栏,状态栏上)底部,中间的主要区域。

  

此外,不是t pack部分,因此我不必拥有第二行(ttk)?

即使ttk是tkinter的一部分,当你从tkinter导入所有内容时也不会导入它。许多python包都是这种方式,必须显式导入子模块。

此外,使用通配符导入是不好的做法。而不是这样做:

from tkinter import ttk

......这样做可能会更好:

from tkinter import *
root = Tk()

对于前者,您最终会用一些您可能会或可能不会使用的东西来污染全局命名空间。使用后者,您只导入一件事。此外,它使您的代码更加自我记录,因为当您期望使用tk包中的对象或类时,它会使它变得清晰。