Tkinter库的学习记录08- 容器控件

📅 发布时间:2026/7/11 1:35:13 👁️ 浏览次数:
Tkinter库的学习记录08- 容器控件
8、容器控件Frame可翻译为框架它在Widget中的类别名称就是Frame。LabelFrame可翻译为标签框架它在Widget中的类别名称就是LabelFrame。这两个控件主要是当作容器使用设计时LabelFrame可以在外观看到标签名称。本章要介绍的另一个Widget是Toplevel它与Frame类似但是将产生一个分离的窗口容器。8-1 框架Frame8-1-1 框架的基本概念这是一个容器控件当我们设计的GUI程序很复杂时此时可以考虑一系列相关的Widget组织在一个框架内这样可以方便管理。它的构造方法语法如下。Frame(父对象, option, ...)参数一同上options参数(1) bg或background背景颜色。(2) borderwidth或bd标签边界宽度默认是两个像素。(3) cursor当鼠标光标在框架上时的光标形状。(4) height框架的高度单位是像素。(5) highlightbackground当框架没有取得焦点时的背景颜色。(6) highlightcolor当框架取得焦点时的颜色。(7) highlighthickness当框架取得焦点时的厚度。(8) relief默认是reliefFLAT可由此控制框架外框可参考ch8_4。(9) width框架宽度单位是像素省略时会自行调整为实际宽度。程序实例ch8_1建立三个不同底色的框架。from tkinter import * root Tk() root.title(ch8_1) for fm in [red, green, blue]: Frame(root, bgfm, height50, width250).pack() root.mainloop()运行结果运行结果从上述实例应该了解框架也是一个Widget控件所以最后也需要使用控件配置管理员包装与定位此例中是使用pack()。下面程序在调用Frame构造方法时省略父对象。from tkinter import * root Tk() root.title(ch8_1) for fm in [red, green, blue]: Frame(bgfm, height50, width250).pack() root.mainloop()执行结果与ch8_1一致。程序实例ch8_2使用横向配置方式(sideLEFT)重新设计ch8_1同时让鼠标光标在不同的框架上有不同的形状。from tkinter import * root Tk() root.title(ch8_2) fms {red: cross, green: boat, blue: clock} for fmColor in fms: Frame(root, bgfmColor, cursorfms[fmColor], height50, width200).pack(sideLEFT) root.mainloop()运行结果8-1-2 在框架内创建Widget控件创建框架时会传回框架对象假设此对象是A此后在此框架内建立Widget控件时此对象A就是框架内Widget控件的父容器。下面是在框架内创建功能按钮对象的讲解。A Frame(root, ...) # 传回框架对象A btn Button(A, ...) # 框架对象A是btn功能按钮的父容器程序实例ch8_3建立两个框架同时在上层框架frameUpper内建三个功能按钮下层框架frameLower同时在此建立一个功能按钮。from tkinter import * root Tk() root.title(ch8_3) frameUpper Frame(root, bglightyellow) frameUpper.pack() btnRed Button(frameUpper, textred, fgred) btnRed.pack(sideLEFT, padx5, pady5) btnGreen Button(frameUpper, textgreen, fggreen) btnGreen.pack(sideLEFT, padx5, pady5) btnBlue Button(frameUpper, textblue, fgblue) btnBlue.pack(sideLEFT, padx5, pady5) frameLower Frame(root, bglightblue) frameLower.pack() btnPurple Button(frameLower, textpurple, fgpurple) btnPurple.pack(sideLEFT, padx5, pady5) root.mainloop()运行结果8-1-3 活用relief属性可以利用relief属性的特性将Widget控件建立在框架内。下面程序实例建立三个框架分别使用不同的relief属性。from tkinter import * root Tk() root.title(ch8_4) fm1 Frame(width150, height80, reliefGROOVE, borderwidth5) fm1.pack(sideLEFT, padx5, pady10) fm2 Frame(width150, height80, reliefRAISED, borderwidth5) fm2.pack(sideLEFT, padx5, pady10) fm3 Frame(width150, height80, reliefRIDGE, borderwidth5) fm3.pack(sideLEFT, padx5, pady10) root.mainloop()运行结果8-1-4 在含raised属性的框架内创建复选框下面程序实例创建一个含raised属性的框架同时在此框架内创建标签和复选框。from tkinter import * root Tk() root.title(ch8_5) fm Frame(width150, height80, reliefRAISED, borderwidth5) lab Label(fm, text请复选常用的程序语言) lab.pack() python Checkbutton(fm, textPython) python.pack(anchorW) java Checkbutton(fm, textJava) java.pack(anchorW) ruby Checkbutton(fm, textRuby) ruby.pack(anchorW) fm.pack() root.mainloop()运行结果8-1-5额外对relief属性的支持在标准的Frame框架中对于relief属性并没有完全支持例如solid和sunken属性此时可以使用tkinter.ttk的Frame和Style模块。下面将直接以实例展现。下面程序实例建立6个框架每个框架有不同的relief。from tkinter import * from tkinter.ttk import * root Tk() root.title(ch8_6) style Style() style.theme_use(alt) fm1 Frame(width150, height80, reliefflat) fm1.grid(row0, column0, padx5, pady5) fm2 Frame(width150, height80, reliefgroove) fm2.grid(row0, column1, padx5, pady5) fm3 Frame(width150, height80, reliefraised) fm3.grid(row0, column2, padx5, pady5) fm4 Frame(width150, height80, reliefridge) fm4.grid(row1, column0, padx5, pady5) fm5 Frame(width150, height80, reliefsolid) fm5.grid(row1, column1, padx5, pady5) fm6 Frame(width150, height80, reliefsunken) fm6.grid(row1, column2, padx5, pady5) root.mainloop()运行结果上述程序中需使用tkinter.ttk模块内的Frame作为支持才可正常显示relief外框同时留意第7行中的alt参数主要是此机制内对于relief支持的参数。8-2 标签框架LabelFrame8-2-1 标签框架的基本概念这也是一个容器控件主要是将一系列相关的Widget组织在一个标签框架内然后给它一个名称。它的构造语法如下LabelFrame(父对象, option, ...)参数一同上option参数(1) bg或background背景颜色。(2) borderwidth或bd标签边界宽度默认是2个像素。(3) cursor当鼠标光标在框架上时的光标形状。(4) font标签框架中文字的字形(5) height框架的高度单位是像素。(6) highlightbackground当框架没有取得焦点时的背景颜色。(7) highlightcolor当框架取得焦点时的颜色。(8) highlighthickness当框架取得焦点时的厚度。(9) labelAnchor设置放置标签的位置。(10) relief默认是reliefFLAT可由此控制框架外框。(11) text标签内容。(12) width框架宽度单位是像素省略时会自行调整为实际宽度。下面程序实例重新设计ch5_3将账号和密码字段使用标签框架起来此框架标签的文字是“数据验证”。from tkinter import * from tkinter.ttk import * root Tk() root.title(ch8_7) msg 欢迎进入Silicon Stone Education系统 tPng PhotoImage(filetubiao.png) logo Label(root, imagetPng, textmsg, compoundBOTTOM) logo.pack() labFrame LabelFrame(root, text数据验证) accontL Label(labFrame, text账号) accontL.grid(row0, column0) pwdL Label(labFrame, text密码) pwdL.grid(row1, column0) accountE Entry(labFrame) accountE.grid(row0, column1) pwdE Entry(labFrame, show*) pwdE.grid(row1, column1, padx10) labFrame.pack(padx10, pady5, ipadx5, ipady5) root.mainloop()运行结果8-2-2 将标签框架应用于复选框标签框架的应用范围很广泛也常应用将选项按钮或是复选框组织起来。下面将直接以实例讲解。下面实例重新设计ch7_8.py将复选框用标签框架框起来同时设置了root窗口的宽度和高度。from tkinter import * from tkinter.ttk import * def printInfo(): selection for i in checkboxes: if checkboxes[i].get() True: selection selection sport[i] \t print(selection) root Tk() root.title(ch8_8) root.geometry(400x220) labFrame LabelFrame(root, text选择最喜欢的运动) sports {0: 篮球, 1: 足球, 2: 羽毛球, 3: 网球} checkboxes {} for i in range(len(sports)): checkboxes[i] BooleanVar() Checkbutton(labFrame, textsports[i], variablecheckboxes[i]).grid(rowi1, stickyW) labFrame.pack(ipadx5, ipady5, pady10) btn Button(root, text确定, width 10, commandprintInfo) btn.pack() root.mainloop()运行结果8-3 顶层窗口Toplevel8-3-1 Toplevel窗口的基本概念这个控件的功能类似于Frame但是这个控件所产生的容器时一个独立的窗口有自己的标题栏和边框它的构造方法如下Toplevel(option, ...)下列是Toplevel()方法内其它常用的option参数。(1) bg或background背景颜色。(2) borderwidth或bd标签边界宽度默认是2个像素。(3) cursor当鼠标光标在框架上时的光标形状。(4) fg文字前景。(5) font标签框架中文字的字形(6) height窗口的高度。(7) width框架宽度。下面程序实例建立一个Toplevel窗口为了区分在Toplevel窗口为了区分在Toplevel窗口中增加字符串“I am a toplevel”。from tkinter import * root Tk() root.title(ch8_9) tl Toplevel() Label(tl, textI am a Toplevel).pack() root.mainloop()运行结果上面这个是顶层窗口下面这个是主窗口。Toplevel窗口建立完成后如果关闭Toplevel窗口原主窗口仍可以继续使用但是如果关闭了主窗口Toplevel窗口将自动关闭在第一章介绍建立主窗口时有介绍过窗口属性设置的方法这些方法中有些可以供Toplevel窗口使用。下面程序实例设置Toplevel窗口的标题和大小。from tkinter import * root Tk() root.title(ch8_10) tl Toplevel() tl.title(Toplevel) tl.geometry(200x200) Label(tl, textThis is a toplevel window.).pack() root.mainloop()运行结果8-3-2 使用Toplevel窗口仿真对话框下面程序实例这个程序实例执行时会有一个Click Me按钮当单击此按钮时会由一个随机数产生Yes、No、Exit字符串这些字符串会出现在Toplevel窗口内。from tkinter import * import random root Tk() root.title(ch8_11) msgYes, msgNo, msgExit 1, 2, 3 def Message(): msgType random.randint(1, 3) if msgType msgYes: labTxt Yes elif msgType msgNo: labTxt No else: labTxt Exit t1 Toplevel() t1.geometry(300x180) Label(t1, textlabTxt).pack(fillBOTH, expandTrue) btn Button(root, textClick Me, commandMessage) btn.pack() root.mainloop()运行结果