本次内容: python图形化编程+常用类
图形化界面:Tkiner
先给出一个简单的案例,点击运行后会出现一个空的窗口:
import tkinter
top = tkinter.Tk() # 初始化一个窗体
# 进入消息循环
top.mainloop()
下面给出Tkiner中较为常用的一些组件和方法,更加详细的可以访问网址:https://www.runoob.com/python/python-gui-tkinter.html
'''Tkinter'''
组件:
Button:按钮控件;在程序中显示按钮。
Canvas:画布控件;显示图形元素如线条或文本
Checkbutton:多选框控件;用于在程序中提供多项选择框
Entry:输入控件;用于显示简单的文本内容
Frame:框架控件;在屏幕上显示一个矩形区域,多用来作为容器
Label:标签控件;可以显示文本和位图
Listbox:列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户
Menubutton:菜单按钮控件,用于显示菜单项。
Menu:菜单控件;显示菜单栏,下拉菜单和弹出菜单
Message:消息控件;用来显示多行文本,与label比较类似
Radiobutton:单选按钮控件;显示一个单选的按钮状态
Scrollbar:滚动条控件,当内容超过可视化区域时使用,如列表框。.
Text:文本控件;用于显示多行文本
Toplevel:容器控件;用来提供一个单独的对话框,和Frame比较类似
Spinbox:输入控件;与Entry类似,但是可以指定输入范围值
PanedWindow:PanedWindow是一个窗口布局管理的插件,可以包含一个或者多个子控件。
tkMessageBox:用于显示你应用程序的消息框。
共同属性:
Dimension 控件大小;
Color 控件颜色;
Font 控件字体;
几何方法:
pack() 包装;
grid() 网格;
place() 位置;
新建一个文件,编写一个新的案例:
- 创建一个窗口,
- 初始化两个列表,创建两个列表部件
- 将列表的内容循环加入列表部件中
- 将列表部件放在窗口中显示
from tkinter import *
# 创建一个窗口对象
root = Tk()
li = ['机电学院', '数学与统计学院', '体育学院', '音乐学院', '美术学院', '外国语学院', '计算机学院']
movie = ['计算机科学与技术', '软件工程']
# 创建两个列表组件,用来存储两个列表的信息内容
listb = Listbox(root)
listb2 = Listbox(root)
for item in li:
listb.insert(0, item) # 第一个小部件插入数据
for item in movie:
listb2.insert(0, item)
# 将更新后的组件放置在主窗体中
listb.pack() # 将小部件放置到主窗口中
listb2.pack()
root.mainloop()
button按钮组件
- Tkinter按钮组件用于在python中添加按钮,按钮可以放置文本或者图像
- 按钮可用于监听用户行为能够与一个python函数关联
- 当按钮被点击时,自动调用该函数
下面给出button按钮组件的常用属性及方法:
w = Button ( master, option=value, ... )
option:
activebackground:当鼠标放上去时,按钮的背景色
activeforeground:当鼠标放上去时,按钮的前景色
bd:按钮边框的大小,默认为 2 个像素
bg:按钮的背景色
command:按钮关联的函数,当按钮被点击时,执行该函数
fg:按钮的前景色(按钮文本的颜色)
font:文本字体
height:按钮的高度
image:按钮上要显示的图片
underline:下划线。
width:按钮的宽度,如未设置此项,其大小以适应按钮
text:按钮的文本内容
组件方法:
deselect() 清除单选按钮的状态
flash() 在激活状态颜色和正常颜色之间闪烁几次单选按钮,但保持它开始时的状态。
invoke() 可以调用此方法来获得与用户单击单选按钮以更改其状态时发生的操作相同的操作
select() 设置单选按钮为选中。
下面给一个按钮案例:设定一个按钮,点击后弹出文字内容
import tkinter
import tkinter.messagebox # 消息框模块,在python3.4中,模块名称tkMessageBox
# 创建一个窗体,top
top = tkinter.Tk()
# 创建一个函数
def hello():
tkinter.messagebox.showinfo("py", "Hello,python")
# 创建一个按钮
button = tkinter.Button(top, text="点我", command=hello, bg='green', foreground='yellow',
activebackground='white', activeforeground='black')
button.pack()
top.mainloop()
效果图:
复选框Checkbutton
下面给出复选框Checkbutton组件中常用的属性和方法:
'''复选框Checkbutton
activebackground:当鼠标放上去时,按钮的背景色
activeforeground:当鼠标放上去时,按钮的前景色
bg:按钮的背景色
bitmap:位图
bd:边框的大小,默认为 2 个像素
command:关联的函数,当按钮被点击时,执行该函数
font:文本字体
fg:选项的前景色
height:复选框文本行数,默认为 1。
image:是否使用图标
padx:按钮在x轴方向上的内边距(padding),是指按钮的内容与按钮边缘的距离,默认为 1 像素。
pady:按钮在y轴方向上的内边距(padding),默认为 1 像素。
selectcolor:选中后的颜色,默认为 selectcolor="red"。
selectimage:选中后的图片
state:状态,默认为 state=NORMAL
text:显示的文本,使用 "\n" 来对文本进行换行。
underline:下划线。
variable:变量,variable 的值为 1 或 0,代表着选中或不选中
width:默认宽度是复选框的文本或图像决定的,你可以设置指定字符数。
offvalue:Checkbutton 的值不仅仅是 1 或 0,可以是其他类型的数值,
可以通过 onvalue 和 offvalue 属性设置 Checkbutton 的状态值。
onvalue:Checkbutton 的值不仅仅是 1 或 0,可以是其他类型的数值,
可以通过 onvalue 和 offvalue 属性设置 Checkbutton 的状态值。
给出一个复选框的案例:出现两个可选的选项
from tkinter import *
top = Tk()
check_var1 = IntVar()
check_var2 = IntVar()
c1 = Checkbutton(top, text = '01', variable = check_var1, onvalue = 1, offvalue = 0,height = 5, width = 20)
c2 = Checkbutton(top, text = '02', variable = check_var2, onvalue = 1, offvalue = 0,height = 5, width = 20)
c1.pack()
c2.pack()
top.mainloop()
效果图:
画布类组件
画布组件都是如下几种:
create_rectangle() # 空心矩形
create_arc() # 扇形
create_oval() # 圆形
create_polygon() # 多边形
常用的画布组件属性Option:
bd:边框宽度,单位像素,默认为 2 像素。
bg:背景色
confine:如果为 true (默认), 画布不能滚动到可滑动的区域外。
cursor:光标的形状设定,如arrow, circle, cross, plus 等
height:高度
highlightcolor:要高亮的颜色
width:画布在 X 坐标轴上的大小。
- 下面给出一个案例:画出一些图形
from tkinter import *
root = Tk()
# 创建个Canvas,设置其背景色为白色
cv = Canvas(root, bg='green', bd = '4')
# ...(x0, y0, x1, y1, ..., xn, yn, options)
cv.create_rectangle(10, 10, 150, 150) # 空心矩形
cv.create_arc(30, 30, 100, 100) # 扇形
cv.create_oval(70, 80, 90, 100) # 圆形
cv.create_polygon(100, 150, 200, 250, 150, 160) # 三边形
cv.create_polygon(200, 20, 200, 50, 300, 60, 300, 30) # 多边形
cv.pack()
root.mainloop()
效果图:
- 第二个案例:使用一些属性修饰图形
# 绘制椭圆
from tkinter import *
def main():
root = Tk()
w = Canvas(root, width = 200, height = 200, background = "white")
# 绘制正方形,边框用虚线来表示
w.create_rectangle(40, 40, 100, 100, dash = (4, 4))
# 绘制粉红色椭圆
w.create_oval(40, 40, 100, 70, fill = 'pink')
w.pack()
mainloop()
if __name__ == '__main__':
main()
效果图:
登录案例Login
使用tkiner,画出登录界面内容,包括用户名和密码输入文本框,登录按钮,从文件中读取数据,进行检查。
# 登录界面案例
import tkinter as tk
from tkinter import messagebox
class Login(tk.Frame):
def __init__(self):
# 全局变量:用户名-密码 信息
global user
user = {}
self.file()
global root
root = tk.Tk()
# 设置窗口大小
root.geometry("300x200")
# 设置窗体的大小固定不可被修改,1为可以,0为不可以
# 第一个参数宽度是否可以被修改,第二个参数高度是否可以被修改
root.resizable(0, 0)
super().__init__()
# 用户名输入框
self.username = tk.StringVar()
self.password = tk.StringVar()
self.pack()
# 布局的方法
self.main_login()
# 显示
root.mainloop()
# 主体布局的方法
def main_login(self):
global root
'''place是设置位置'''
user_title_lable = tk.Label(root, text="登录窗口", font=('宋体', 13)).place(x=120, y=10)
username_lable = tk.Label(root, text="用户名:", font=('宋体', 13)).place(x=20, y=50)
'''textvariable是指这个控件的值绑定的变量'''
username = tk.Entry(root, width=16, textvariable=self.username).place(x=90, y=50)
password_lable = tk.Label(root, text="密码:", font=('宋体', 13)).place(x=20, y=90)
password = tk.Entry(root, show="*", width=16, textvariable=self.password).place(x=90, y=90)
'''command是点击按钮触发后的函数'''
login_lable = tk.Button(root, text="登录", command=self.check_login, font=('宋体', 13)).place(x=80, y=130)
cancel_table = tk.Button(root, text="取消", font=('宋体', 13)).place(x=160, y=130)
# 验证函数
def check_login(self):
# 监控输入框
print("user", self.username.get())
print("password", self.password.get())
# 判断字典中对应的value和输入的密码是否一致
if user.get(self.username.get()) == self.password.get():
messagebox.showinfo("通知", "登陆成功!")
else:
messagebox.showinfo("通知", "用户名或密码错误!")
# 文件读取信息
def file(self):
global f
try:
f = open("user.data", 'r', encoding="utf-8")
except:
f = open("user.data", 'w', encoding="utf-8")
else:
# 读取文件
data = f.read()
# eval()函数,用来执行一个字符串表达式,并返回表达式的值
new_dict = eval(data)
'''查看一下eval函数的返回字符串
这里自动加上了(),就是tuple元组类型
所以下面需要用tuple转换
'''
print(new_dict) # ({'张三': '123'}, {'李四': '456'})
'''第一种写法:
类型转换,加入字典中
user.data内容:
{'张三','123'},{'李四','456'}
'''
# for i in tuple(new_dict):
# user.update(i)
'''第二种写法:
使用推导式+items方法进行赋值
user.data内容:
{'张三':'123','李四':'456'}
'''
# 全局变量
global user
user = {key: value for key, value in dict(new_dict).items()}
finally:
f.close()
if __name__ == '__main__':
Login()
user.data:
{'张三':'123', '李四':'456'}
通过上述的实用案例,可以体会到tkiner的好处,相对于控制台的文字输出非常方便,且可视化