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

问题描述 投票:1回答:1

我正在通过建立机票应用来学习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()

谢谢!

python tkinter
1个回答
2
投票

我想知道为什么我必须创建一个容器(框架),而不是只是把所有东西放在root = Tk()似乎工作。

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

话虽这么说,除了最简单的应用之外的任何东西,在逻辑组中组织你的小部件非常有帮助,每个逻辑组都是一个框架(或者,也许是Canvas或PanedWindow)。这使您可以灵活地为每个部分使用最佳几何管理器(packplacegrid)。

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

使用grid会有点复杂,而pack擅长将小部件放在一个水平行(工具栏或状态栏)或列(顶部的工具栏,底部的状态栏,中间的主区域)。

此外,不是ttk tkinter的一部分,因此我不应该有第二行(from tkinter import ttk)?

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

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

from tkinter import *
root = Tk()

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

import tkinter as tk
root = tk.Tk()

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

© www.soinside.com 2019 - 2024. All rights reserved.