出于总结归纳所学习的知识、完成老师布置作业的需要,在这介绍一下如何使用python的图形界面工具包--tkinter完成一个登录界面,和相关知识。
首先,介绍一下tkinter的一些重要概念:
1、控件
Tkinter 用户界面是由一个个控件组成的。每个控件都由相应的 Python 对象表示,由 ttk.Frame(框架), ttk.Label(标签)以及ttk.Button(按钮)这样的类来实例化。
2、控件层级结构
控件按层级结构来组织。标签和按钮包含在框架中,框架又包含在根窗口中。 当创建每个子控件时,它的父控件会作为控件构造器的第一个参数被传入。
3、配置选项
控件具有配置选项,配置选项会改变控件的外观和行为,例如要在标签
或按钮中显示的文本。不同的控件类会具有不同的选项集。
4、几何布局管理
小部件在创建时不会自动添加到用户界面。tkinter提供了pack、grid和place这三个几何管理器控制这些小部件在用户界面的位置。
5、事件循环
只有主动运行一个事件循环,Tkinter 才会对用户的输入做出反应,改变你的程序,以及刷新显示。如果你的程序没有运行事件循环,你的用户界面不会更新。
接下来我们看一波代码:
from tkinter import *
from tkinter import ttk
root = Tk()
root.geometry("200x200")
frm = ttk.Frame(root,height=100,width=100)
frm.grid()
ttk.Label(frm, text="你好!").grid(column=0, row=0)
ttk.Button(frm, text="退出", command=root.destroy).grid(column=1, row=0)
root.mainloop()
在导入语句之后,第三行语句创建了一个 Tk 类的实例,它会初始化 Tk 并创建与其关联的 Tcl 解释器。 它还会创建一个顶层窗口,名为 root 窗口,它将被作为应用程序的主窗口。
第四行代码配置了root窗口的大小。
第五行行创建了一个框架控件,在本示例中它会包含我们即将创建的一个标签和一个按钮。 框架被嵌在 root 窗口内部。
第七行行创建了一个包含静态文本字符串的标签控件。标签即Label组件用于在窗口中显示文本或位图;而grid()方法被用来指明标签在包含它的框架控件中的相对布局(定位),作用类似于 HTML 中的表格。
接下来创建了一个按钮控件,并被放置到标签的右侧。按钮即Button是一个标准的Tkinter部件,用于实现各种按钮。 传参中的command=root.destroy是设置该按钮被按下时,它将调用 root 窗口的destroy()方法。
最后,mainloop() 方法将所有控件显示出来,并响应用户输入直到程序终结。
运行结果如图:
这样,一个没什么用的图形界面就搞出来了。
然后,我们看看如何写出一个登录界面。首先,教科书上的代码:
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("登录")
root['width']=200
root['height']=80
Label(root,text='用户名',width=6).place(x=1,y=1)
Entry(root,width=20).place(x=45,y=1)
Label(root,text='密码',width=6).place(x=1,y=20)
Entry(root,width=20,show='*').place(x=45,y=20)
Button(root,text='登录',width=8).place(x=40,y=40)
Button(root,text='取消',width=8).place(x=110,y=40)
root.mainloop()
代码中的Entry是单行文本框,主要用于输入单行内容和显示文本,可以方便的传递用户参数。当然这个代码中的单行文本框是传不了啥参数的。代码中Entry用到了两个参数:width、show。Width不必多说,设置组件的宽度;而show这个属性主要用于密码输入,如代码中设置为“*”,则输入文本框中内容就显示为“*”。
其它常用的属性如下:
fg:设置字体前景颜色
bg:设置背景颜色
State:设置组件状态,默认为norma,可设置为:disabled禁用组件,readonly只读。
insertbackground和selectforeground:选中文本的背景色与前景色。
Insertbackground:插入光标的颜色,默认为黑色。
代码运行结果如图:
如果你觉得place这个布局管理器让你有点摸不着头脑,你可以跟我一样用简单粗暴的pack。
root = Tk()
root.title("登录")
root['width']=200
root['height']=80
Label(root,text='用户名',width=6).pack()
Entry(root,width=20).pack()
Label(root,text='密码',width=6).pack()
Entry(root,width=20,show='*').pack()
Button(root,text='登录',width=8).pack()
Button(root,text='取消',width=8).pack()
root.mainloop()
运行结果:
不过效果确实有点一言难尽,这提醒我们:懒有懒的代价。
当然,pack方法还是有几个参数选项可供你调整:
side: 决定组件停靠的方向。
选项:left, right, top, bottom
la1.pack( side=’top’) # 向上停靠 默认
la1.pack( side=’bottom) # 向下停靠
la1.pack( side=’left’) # 向左停靠
la1.pack( side=’right’) # 向右停靠
fill: 决定组件是否填充,以及填充的方向
选项:x, y, both, none
fill=”none” # 不填充 默认
fill=”x” # 横向填充
fill=”y” # 纵向填充
fill=”both” # 横向纵向都填充
padx/pady: 组件外,组件跟邻近组件或窗体边界的距离(外边距)
默认值:0
ipadx/ipady: 组件内,组件文本跟组件边界之间的距离(内边距)
默认值:0
anchor: 决定组件停靠的位置
选项:n,nw,ne,s,nw,ne,center 默认值:center (居中显示)
expand: 决定组件的“势力范围”是否扩大到“扩展范围”
选项:True, False
默认值:False (标签只在自己的势力范围内活动)
我相信掌握以上内容就能弄出一个朴素的登录界面,这篇文章虽然没什么用但我相信还是有点用的。
参考书籍及资料:
Python程序设计应用教程 中国铁道出版社
Python官网:https://docs.python.org/zh-cn/3/library/tkinter.html