创建新的顶级窗口与创建新的小部件几乎完全相同。顶级窗口是使用顶级类创建的:t = Toplevel(parent)
与常规的小部件不同,我们不必为它在屏幕上的显示设置顶层网格。一旦我们创建了一个新的顶层,我们就可以创建其他小部件作为该顶层的子级,并在顶层中对它们进行网格化。新顶层的行为与自动创建的根窗口完全相同。
要销毁窗口,请使用其销毁方法:window.destroy()
请注意,您可以在任何小部件上使用destroy,而不仅仅是顶级窗口。销毁窗口时,作为该窗口子窗口的所有窗口(小部件)也将被销毁。小心!如果您破坏了根窗口(所有其他小部件都是从根窗口派生出来的),那么将终止您的应用程序。
1. 窗口的行为和风格
1.1 窗口标题
要检查或更改窗口的标题,请执行以下操作:
oldtitle =window.title()
window.title('New title')
1.2 尺寸和位置
在Tk中,窗口在屏幕上的位置和大小称为其几何图形。宽度和高度(通常以像素为单位)是不言自明的。x(水平位置)用前导加号或减号指定,因此+25表示窗口左边缘距屏幕左边缘25像素,而-50表示窗口右边缘距屏幕右边缘50像素。类似地,y(垂直)位置为+10表示窗口的上边缘应低于屏幕顶部10个像素,而-100表示窗口的下边缘应高于屏幕底部100个像素。
window.geometry('300x200-5+5') #改变大小和位置。它将窗口放置在屏幕的右上角
可以用相同的方法检索当前几何体;只是不提供新的几何体值。但是,如果在更改几何体后立即尝试,您会发现它不更新。请记住,所有绘图都有效地发生在后台,通过事件循环响应空闲时间。在绘制之前,窗口的内部几何图形不会更新。如果你真的想强迫事情立即更新,你可以使用语句:window.update_idletasks()
1.3 调整大小行为
默认情况下,用户可以调整顶层窗口(包括根窗口)的大小。但是,有时您可能希望阻止用户调整窗口的大小。您可以通过resizable方法来实现这一点。它的第一个参数控制用户是否可以更改宽度,第二个参数控制用户是否可以更改高度。所以要禁用所有调整大小:window.resizable(FALSE,FALSE)
如果窗口可调整大小,则可以指定希望将窗口大小约束到的最小和/或最大大小(同样,参数是宽度和高度):
window.minsize(200,100)
window.maxsize(500,500)
想知道如果你没有指定它的几何图形,或者用户没有调整它的大小,它会有多大?您可以检索窗口请求的大小,即它从几何图形管理器请求的空间量。与绘图一样,几何计算只在事件循环的空闲时间进行,因此在小部件出现在屏幕上之前,您不会得到有用的响应。window.winfo_reqwidth() # or winfo_reqheight
1.4 拦截关闭按钮
大多数窗口的标题栏中都有“关闭”按钮。默认情况下,如果用户单击该按钮,Tk将销毁该窗口。但是,您可以提供一个将运行的回调进行拦截。window.protocol("WM_DELETE_WINDOW",callback)
1.5 透明度
可以通过指定alpha通道使窗口部分透明,范围从0.0(完全透明)到1.0(完全opqaque)。
window.attributes("-alpha", 0.5)
1.6 全屏
window.attributes("-fullscreen", 1)
1.7 图标化与提取
在大多数系统上,可以通过图标化将窗口从屏幕中临时删除。在Tk中,窗口是否被图标化被称为窗口的状态。窗口的可能状态包括正常和图标(对于图标化的窗口),以及其他几种状态:withdrawn, icon 或 zoomed。
您可以直接查询或设置当前窗口状态。还有iconify、deiconify和withdraw方法,它们分别是设置iconic, normal, 和withdrawn 状态的快捷方式。
thestate =window.state()
window.state('normal')
window.iconify()
window.deiconify()
window.withdraw()
1.8 堆叠顺序
堆叠顺序是指窗口从下到上“放置”在屏幕上的顺序。当两个窗口的位置相互重叠时,靠近堆叠顺序顶部的窗口将遮挡或重叠堆叠顺序中较低的窗口。
可以确保窗口始终位于堆叠顺序的顶部(或至少位于未设置此属性的所有其他窗口的顶部):
window.attributes("-topmost", 1)
您可以找到从最低到最高列出的当前堆叠顺序:
root.tk.eval('wm stackorder '+str(window))
这种方法在Tkinter中没有清晰地公开。它返回每个窗口的内部名称,而不是窗口对象。
您也可以只检查一个窗口是高于还是低于另一个窗口:
if (root.tk.eval('wm stackorder '+str(window)+' isabove '+str(otherwindow))=='1') ...
if (root.tk.eval('wm stackorder '+str(window)+' isbelow '+str(otherwindow))=='1') ...
您也可以将窗口升高或降低到堆叠顺序的最顶部(底部),或刚好位于指定窗口的上方(下方):
window.lift()
window.lift(otherwin)
window.lower()
window.lower(otherwin)
1.9 屏幕信息
您可以确定屏幕的颜色深度(每像素多少位)和颜色模型(在现代显示器上通常为真彩色)、像素密度和分辨率。
print("color depth=" + str(root.winfo_screendepth())+ " (" + root.winfo_screenvisual() + ")")
print("pixels per inch=" + str(root.winfo_pixels('1i')))
print("width=", str(root.winfo_screenwidth()) + " height=", str(root.winfo_screenheight()))
2. 对话框
对话框是应用程序中使用的一种窗口类型,用于从用户处获取某些信息、通知他们发生了某些事件、确认操作等。
2.1 选择文件和目录