在前一教程,我们了解了Tkinter中的窗口小部件,并设计了一个空白的GUI主窗口(它不是GUI应用程序中任何其他窗口的子窗口)。子窗口用作其他小部件的容器
没有空白窗口,因此窗口小部件中必须包含其他小部件,以促进与用户的交互。窗口小部件中包含的小部件是该窗口的子窗口。
Tk小部件
Tk是一个跨平台的用户界面工具包。它可以用于为X11、Microsoft Windows和Mac OS X系统设计图形用户界面。目前,使用Tk作为GUI工具包的编程语言包括Python、Ruby、Pearl和Tcl。
GUI由几个布局在容器小部件中的小部件组成。小部件可以被视为图形元素,在用户界面中提供特定类型的交互和功能。顶级容器小部件始终是一个窗口。
Tk为填写式表单类型接口以及菜单、窗口、标准对话框和图像提供了几个小部件。它还支持用户界面的颜色、字体、样式和主题。
最初包含在包中的小部件称为经典小部件,并打包为Tkinter模块。Tk 8.5最近添加了一组新的主题小部件,它们作为ttk包提供。但是,如果想在Tkinter中使用这些新小部件,则需要单独导入ttk包。
小部件作为类对象包含在GUI应用程序中,每一个都有自己的外观和功能。这意味着所有小部件都是Tkinter/ttk的子类,需要实例化这些类的对象,以便在GUI中包含小部件。
Tkinter没有WYSIWYG编辑器。因此,为了创建每个小部件,我们需要为其编写代码,并在该代码中管理小部件。任何小部件的管理通常涉及三个操作:
1.设置小部件的外观
2.设置小部件的布局
3.向小部件添加功能或行为
在Tkinter中,可以通过设置小部件可用的配置选项来建立小部件的外观。在代码中,通过设置小部件类对象的可用属性来确定这些配置。
设置小部件的布局意味着小部件必须在容器小部件中出现的位置和方式(例如,在窗口或框架中)。Tkinter提供三种类型的布局(几何)管理:绝对定位、包布局和网格布局。
通过调用place()、pack()或grid()方法,可以将小部件组织为这些类型之一。可以在调用小部件上的布局管理方法之前或之后的任何时间设置小部件的配置选项。但是,在小部件对象调用其中一个布局管理方法(位置、包或网格)之前,它不会出现在容器小部件上。
GUI应用程序总是事件驱动的,每个小部件都有自己的事件集。这些事件是由用户交互触发的。例如,用户可能触发一个事件,然后将执行一段代码来响应该事件。
为(小部件)事件编写代码行为的过程称为事件绑定。响应(小部件)事件而执行的代码块称为事件处理程序。事件处理程序必须是可调用的,以便它可以是类对象的函数或可调用属性/方法。
在Tkinter中向小部件添加功能或代码行为与为该小部件绑定事件相同。可以通过将可调用(函数或类方法)分配给命令属性(如果对该小部件可用)或使用bind()方法来完成对小部件的事件绑定。
带有ttk的Tkinter包(除了窗口、标准对话框、菜单和图像)提供了这些基本的小部件:
- 框架
- 标签
- 按钮
- Checkbutton
- Radiobutton
- 条目
- 组合框
- 列表框
- 滚动条
- Sizegrip
- 文本
- Progressbar
- 规模
- Spinbox
- 分隔符
- Labelframe
- Panedwindow
- 笔记本
- 帆布
- 树状视图
框架、标签、按钮、复选按钮、单选按钮、条目和组合框都是用于填充表单类型接口的小部件。Listbox, Scrollbar, Sizegrip, Text, Progressbar, Scale和Spinbox是用于特定目的的附加小部件。Frame、Labelframe、Panedwindow和Notebook作为窗口小部件中的容器小部件。
Treeview小部件显示按层次顺序排列的项目列表。画布小部件是一个功能强大的小部件,可用于绘图、绘制图表或创建其他复杂的小部件。Separator是一个表示小部件,可用于分隔两组不同的小部件。
在上述的小部件中,Combobox、Notebook、Separator、Progressbar、Sizegrip和Treeview都是只随ttk包提供的新小部件。
我们将经常使用图形用户界面中的框架、标签、组合框、条目、文本、复选按钮、单选按钮和按钮小部件来制作树莓派食谱。这些小部件描述如下:
框架-作为窗口小部件中的容器小部件。它们是矩形容器,非常适合对其他小部件进行分组和排序。框架被用作包含在其中的其他小部件(类)对象的父类。
框架看起来是这样的:
一个框架可以通过实例化一个框架对象来创建。帧对象可以使用tkinter的frame()方法或ttk类实例化。框架对象的定义有这样的语法:
var = Frame(parent, [configuration options, ....)
这是一个创建框架的有效例子:
LED_def = Frame(root) # root是父窗口的名称:
框架本身是一个容器小部件,只能在窗口小部件内部创建。框架对象的父窗口可以是主窗口或任何子窗口。“parent”是一个必须传递给框架定义的强制参数。改变小部件外观的配置选项是可选参数。
frame对象有以下配置选项:
Tkinter中的颜色(如bg)被赋值为字符串,可以是颜色的十六进制值(如“#fff,”#fdfdfd等),也可以是颜色名称(如“红色”、“蓝色”、“绿色”等)。
应该注意的是,设置为整数的所有尺寸(边框宽度、填充等)都假定其值为像素。通过在值后面加上下列指标,可将尺寸分配为一个单位:
缺省情况下,帧没有任何边框。如果一个“bd”属性被赋值,一个“relief”属性被赋值(不包括平面),框架将有一个相同宽度和样式的边框。浮雕属性决定了边框的样式。
Tkinter支持的浮雕样式有平面、凸起、凹陷、凹槽和山脊。如果框架的浮雕样式指定为“flat”,则其边框将无法显示。
Tkinter支持的鼠标光标包括:箭头,圆圈,时钟,十字,dotbox, exchange, fleur, heart, man, mouse, pirate, plus, shuttle, sizing, spider, spraycan, star, target, tcross, trek和watch。默认光标是“arrow”。
帧的配置选项可以设置为帧定义中的键值对参数,也可以显式定义。这里有两个设置帧配置选项的有效例子:
LED_def = Frame(root, padx = 25, pady = 10)
LED_def.grid ()
或
LED_def =帧(根)
LED_def.grid ()
LED_def(“padx”)= 25
LED_def(“pady”)= 10
框架仅作为其他基本部件的容器小部件,不涉及事件绑定。
标签-用作文本和图像的容器。标签内的文本可以更新或更改。通常,标签用于指示界面中其他小部件的用途。
标签是这样的:
标签可以通过实例化一个标签对象来创建。标签对象可以使用Tkinter的label()方法或ttk类实例化。label对象的定义有这样的语法:
var = Label(parent,[配置选项,....)
下面是一个创建标签的有效示例:
label_LED_gpio = Label(LED_def, text = " Select GPIO ") # LED_def是父窗口或帧的名称
标签对象的父对象可以是主窗口、子窗口或框架。标签对象有以下配置选项:
标签中文本的字体可以指定为一个元组,其中第一个元素必须是字体族,第二个元素必须是打印机点中的字体大小。然后,还有其他可能的可选样式修饰符,如重量、倾斜、下划线或超击。
还可以在导入Tkinter的字体包之后创建一个字体对象。可以通过使用以下语法实例化一个字体对象来创建字体:
Font1 = font。字体(任一用途……)
选项是:
- 字体族——标准的、特定于平台的或命名的字体
- 字体大小-在打印机的点
- 权重-正常或粗体
- 斜体——罗马体或斜体
- 下划线—为带下划线的文本设置为“1”,为普通文本设置为“0”
- 超划-设置“1”为超划文本,“0”为正常文本
在字体定义中,字体族和大小是强制选项,其他选项是可选的。创建字体对象后,可以将其分配给任何小部件的字体属性。这是一个创建和使用字体对象的有效示例:
从tkinter导入字体
Labels_font = font。字体(family= ' Helvetica ', size=12, weight= ' bold ')
Label(LED_def, text = " Select GPIO ", font=labels_font)
也可以在标签中显示位图或静态图像。Tkinter中可用的位图包括:错误,沙漏,信息,客人头,问题,警告,灰色75,灰色50,灰色25和灰色12。
如果将位图分配给标签,则不在其中显示文本。相反,位图显示在文本的位置。标签中文本的字体可以指定为一个元组,其中第一个元素必须是字体族,第二个元素必须是打印机点中的字体大小。还有其他可选的样式修饰符,如重量、倾斜、下划线或超击。
在导入Tkinter的字体包后,可以通过使用以下语法实例化一个字体对象来创建一个字体对象:
Font1 = font。字体(任一用途……)
选项是:
- 字体族——标准的、特定于平台的或命名的字体
- 字体大小-在打印机的点
- 权重-正常或粗体
- 斜体——罗马体或斜体
- 下划线—为带下划线的文本设置为“1”,为普通文本设置为“0”
- 超划-设置“1”为超划文本,“0”为正常文本
在字体定义中,字体族和大小是强制选项,其他选项是可选的。创建字体对象后,可以将其分配给任何小部件的字体属性。这是一个创建和使用字体对象的有效示例:
从tkinter导入字体
Labels_font = font。字体(family= ' Helvetica ', size=12, weight= ' bold ')
Label(LED_def, text = " Select GPIO ", font=labels_font)
要包含静态图像,必须导入Tkinter的Python映像库(PIL)或其最新版本Pillow。然而,PIL包并没有与Python捆绑在一起。所以,你必须在shell(树莓派上的Bash shell)中执行以下命令来安装它:
PIP安装枕
该语句可以导入PIL或其最新版本,称为Pillow:
从PIL导入ImageTk, Image
接下来,您需要使用ImageTk类的PhotoImage()方法创建一个图像对象。必须将图像对象分配给它的image属性。下面是一个在标签中包含图像的有效例子:
从PIL导入ImageTk, Image
myimg = ImageTk.PhotoImage(Image.open(' myimage.png '))
label = label (root, image=myimg)
label.grid ()
对于在图像对象中打开图像,也可以使用此语法:
myimg = ImageTk。PhotoImage(file = ' myimage.png ')
Tk支持GIF和PPM/PNM图像。Tk 8.6也支持PNG图像。安装PIL之后,还包括对许多其他图像格式的支持(如BMP、JPEG、PNG、TIFF)。
当使用PIL/Pillow时,图像可以填充在标签中,或者作为父窗口的子窗口或父窗口内框架的子画布。但是,PIL/Pillow不会填充这个层次结构之外的图像。例如,它无法将一个帧中的图像填充到父窗口的子帧中的另一个帧中。
标签的文本可以使用textvariable属性绑定到变量。通过这种方式,可以在代码中更新或更改文本。这是一个将标签的文本绑定到StringVar类型变量的有效示例:
从tkinter import *
从tkinter导入TTK
def func ():
全局变量
var.set("文本已更改! ")
root = Tk()
根。标题(“标签的动态文本”)
根。minsize(200、200)
var = StringVar()
label = label (root = var, padx = 50, pady = 50)
var.set("单击按钮更改此标签的文本")
label.pack ()
button = button (root, text = " Change text ", command = func)
button.pack ()
root.mainloop ()
这些标签充当文本和图像的容器,用于指示其他小部件的功能或用途。但是仍然可以将鼠标事件绑定到它们。
组合框,来自TTK包。它显示一个文本值列表,用户可以从中选择一个。
组合框看起来是这样的:
可以通过实例化combobox对象来创建一个组合框。可以使用ttk类的combobox()方法实例化一个组合框对象。combobox对象的定义有这样的语法:
Var = ttk。组合框(parent, [configuration options, ….) #ttk is reference to ttk class
这是一个创建组合框的有效例子:
combo_LED_config = ttk。组合框(LED_def, values=[“Source Mode”, “Sink Mode”])
组合框对象的父对象可以是主窗口、子窗口或框架。组合框对象有以下配置选项:
组合框的值可以通过Python列表或元组指定。还可以使用textvariable属性在组合框中动态填充值。值可以是字符串或数字。
组合框用于让用户从值列表(文本或数字)中进行选择。还可以使用组合框绑定键盘和鼠标事件。然而,最重要的是与之相关的虚拟事件。这个虚拟事件是" <
可以在组合框中使用current()方法来选择默认值,并将所需值的索引作为参数传递。由于组合框中的值取自列表或元组,因此索引从“0”开始。
如果current()方法在组合框对象上不带参数,它将返回当前选择值的索引,如果没有选择值则返回“-1”。get()方法返回组合框当前选择的值。set(value)方法允许将组合框的选定值设置为作为参数传递的值。
在下面的例子中,我们可以使用组合框填充RPI的GPIO引脚。
可用于组合框对象的其他方法包括:cget()、configure()、identify()、instate()和state()。
组合框是Entry的子类。从Entry类中,它继承了bbox()、delete()、icursor()、index()、insert()、selection()和xview()方法。
条目,从用户接收文本字符串的单行。
它看起来像这样:
可以通过使用Tkinter的entry()方法或ttk类实例化一个条目对象来创建条目。条目对象的定义有这样的语法:
var =条目(父项,[配置选项,....)
这是一个创建Entry的有效示例:
entry_LED_duration =条目(LED_def)
条目对象的父对象可以是主窗口、子窗口或框架。条目对象有以下配置选项:
条目用于从用户获得数字或单行文本输入。可以使用Entry的get()方法检索用户输入的数值或文本值。可调用对象可以通过将状态(条目内容的状态-而不是小部件的状态)的任何更改绑定到条目上,从而将其分配给命令属性。
通常,通过命令属性将可调用对象绑定到Entry以进行数据验证。键盘或鼠标事件可以使用bind()方法绑定到条目。在这种情况下,可调用对象(事件处理程序)将把事件作为其参数之一。
这些方法可用于Entry小部件:
文本- - - - - -接受来自用户的多行文本作为字符串对象。
它看起来像这样:
可以通过实例化文本对象来创建文本小部件。可以使用Tkinter的text()方法或ttk类实例化文本对象。文本对象的定义有这样的语法:
var = Text(parent,[配置选项,....)
这是一个创建文本小部件的有效示例:
cLCD_init是父帧或窗口的名称
文本对象的父对象可以是主窗口、子窗口或框架。文本对象有以下配置选项:
应该注意的是,文本小部件没有命令和文本变量属性。用户在text小部件中输入的多行文本可以使用get()方法检索。可以使用bind()方法将键盘或鼠标事件绑定到Text小部件。文本小部件支持一些辅助结构,如tab、Marks和Index,它们在文本内容的格式化中很有用。以下方法可用于Text小部件:
文本小部件有用于制表符、标记和索引的附加方法。
文本小部件的索引的格式为line_number.character_position。因此,“1.0”指的是“1”行上“0”位置的字符。
关键字——例如linstart、lineend、insert、end、wordstart、wordend和chars——可以用作索引或索引的一部分。
例如:
- “2.2 linestart”指第2行的第一个字符
- " 2.2 lineend "指的是第2行末尾的换行
- “2.0 + 3个字符”指的是超过第2行的3个字符……以此类推
Checkbutton -允许用户为一个选项选择值,该选项一次可以有多个值。这些按钮包含用户可以切换的二进制值。当用户切换该值时,可以调用命令回调。
复选按钮看起来像这样:
可以通过实例化Checkbutton对象来创建Checkbutton。Checkbutton对象可以使用Tkinter的Checkbutton()方法或ttk类实例化。Checkbutton对象的定义有这样的语法:
var =检查按钮(父,[配置选项,....)
这是一个创建Checkbutton的有效例子:
animation_flag = StringVar()
check_cLCD_animate = Checkbutton(cLCD_int, text = " Animate text ", command = cLCD_Text_Animation, variable = animation_flag) #cLCD_init是父帧或窗口的名称
Checkbutton的父窗口可以是主窗口、子窗口或框架。Checkbutton有以下配置选项:
check按钮可以一次设置或清除,并与一个变量配对,以保持对其切换状态的检查。通过设置“onvalue”和“offvalue”属性,当非布尔值的状态发生变化时,可以检索到它。
可调用对象可以被分配给它的命令属性,以在用户交互期间执行代码行为。也可以使用invoke()方法执行可调用对象。
将键盘或鼠标事件绑定到Checkbutton上没有任何逻辑。但是,鼠标事件可以使用bind()方法绑定到check按钮,以实现某种图形效果。
Checkbutton有以下可用的方法:
Radiobutton -允许用户从一个选项的多个值中仅选择一个值。这可以使用tab键来导航可用的值。一组radiobutton应该与单个变量相关联,并且每个变量必须具有唯一的值。
radiobutton看起来是这样的:
可以通过实例化Radiobutton对象来创建Radiobutton。可以使用Tkinter的Radiobutton()方法或ttk类实例化Radiobutton对象。Radiobutton对象的定义有这样的语法:
var = Radiobutton(父按钮,[配置选项,....)
这是一个创建Radiobutton的有效示例:
watch_mode = StringVar()
radio_datetime_mode = Radiobutton(watch_int, variable = watch_mode, text = " Display only Date and Time "
radio_datetimetemp_mode = Radiobutton(watch_int, variable = watch_mode, text = "显示日期时间和温度")
(watch_int,变量= watch_mode,文本= "显示日期时间,温度和湿度")
Radiobutton的父窗口可以是主窗口、子窗口或框架。Radiobutton有以下配置选项:
此外,控制变量可以跟踪Radiobutton的状态,并保存分配给所选Radiobutton的数值或字符串值。代码行为可以通过给Radiobutton对象的命令属性分配一个可调用对象来添加。
也可以使用invoke()方法执行可调用对象。然而,使用bind()方法将键盘或鼠标事件绑定到Radiobutton是没有意义的,尽管可以使用一些鼠标事件使Radiobutton上的某些图形效果动画化。
Radiobutton有以下方法:
按钮,允许用户执行某些操作。可以在按钮中显示文本或图像来表明它们的用途。这些按钮与用户按下它时必须执行的可调用对象相关联。
这些按钮看起来像这样:
可以通过实例化Button对象来创建Button。Button对象可以使用Tkinter的Button()方法或ttk类实例化。Button对象的定义有这样的语法:
var =按钮(父,[配置选项,....)
下面是一个创建Button的有效示例:
button_LED_signal = Button(LED_def, text = " Generate Signal ", command = thread_generate_LED_signal) #LED_def为父窗口或帧的名称
Button的父窗口可以是主窗口、子窗口或框架。该按钮有以下配置选项:
通过将可调用对象分配给按钮的命令属性,可以将代码行为添加到按钮。还可以使用Button对象上的invoke()方法执行可调用对象。
默认情况下,当用户按下按钮时必须执行一个可调用对象。不需要将其他键盘或鼠标事件绑定到Button对象。但是,当需要通过键盘快捷键执行操作时,使用bind()方法将一些键盘事件绑定到按钮会很有用。
我们可以用这些小部件为我们的RPi配方设计大多数接口。如果我们在食谱的GUI中包含任何其他小部件,我们将在此介绍它们。
在下一个教程,我们将讨论Tkinter/ttk菜单、布局管理、事件绑定和多线程。这将足以测试我们的第一个树莓派配方——一个LED驱动器。
自己动手
如果您有微控制器背景,请尝试猜测在控制嵌入式操作时使用不同的Tkinter/ttk小部件。例如,我们可以使用缩放小部件来控制PWM信号的占空比或控制直流电机的速度。
我们还可以使用Entry或Text小部件来包含在按下按钮时可能传递到字符LCD的文本消息。从您的微控制器经验来看,考虑可以在嵌入式应用程序中使用不同Tkinter/ttk小部件的情况。另外,回想一下从传感器读取数据的情况。
尝试评估这些情况,以及在使用Tkinter/ttk小部件控制不同硬件组件时可能面临的困难。
一个例子是Text小部件没有“textvariable”或命令属性。在这种情况下,是否有可能将动态文本消息从文本小部件传递到字符LCD?开始头脑风暴!
了下:188app彩票
与本文相关的问题?
询问和讨论Electro-Tech-Online.com而且EDAboard.com论坛。
告诉我们你的想法!!
你一定是登录发表评论。