Python Tkinter学习
Python Tkinter学习 之 标签和按钮
主要实现:
点击按钮后,标签内容改变
主程序:
import tkinter as tk
# 更改标签文字内容
def hit_me():
global on_hit
if on_hit == False:
# 设置变量
var.set('hello world')
on_hit = True
else:
var.set('')
on_hit = False
on_hit = False
# 创建窗口
window = tk.Tk()
# 设置标题
window.title('hello world')
# 设置窗口大小
window.geometry('500x500')
#设置不可更改窗口大小,禁用全屏
window.resizable(False, False)
# tk中的字符串变量定义
var = tk.StringVar()
# 创建一个标签
lable1 = tk.Label(window, textvariable=var, bg='green', font='Arial,12', width=15, height=2)
# 创建一个按钮
button1 = tk.Button(window, text='biubiu', width=10, height=2, command=hit_me)
# 放置标签
lable1.pack()
# 放置按钮
button1.pack()
# 循环刷新,运行窗口,直至退出
window.mainloop()
运行结果:
Python Tkinter学习 之 输入框和文本框
主要实现:
点击按钮1,将输入框的内容插入到文本框中的光标所在位置
点击按钮2,将输入框的内容插入到文本框中的末尾所在位置
主程序:
import tkinter as tk
# 添加到光标函数
def insert():
var = entry1.get()
text1.insert('insert', var) # insert光标位置,0首位,5从第5个字符开始插入,end末尾
# 添加到末尾位置
def end():
var = entry1.get()
text1.insert('end', var)
window = tk.Tk()
window.title('hello world')
window.geometry('200x200')
# 创建输入框
entry1 = tk.Entry(window, show=None) # 密码show='*'
# 创建按钮1
button1 = tk.Button(window, text='添加到光标位置', width=15, height=2, command=insert)
# 创建按钮2
button2 = tk.Button(window, text='添加到末尾位置', width=15, height=2, command=end)
# 创建文本框
text1 = tk.Text(window, show=None)
# 放置
entry1.pack()
button1.pack()
button2.pack()
text1.pack()
# 循环刷新,运行
window.mainloop()
运行结果:
Python Tkinter学习 之 列表部件
主要实现:
列表中选中某内容,点击按钮,在标签显示该内容
主程序:
import tkinter as tk
# 获取光标点击的内容,并设置为标签的内容
def selection():
value = listbox1.get(listbox1.curselection())
var1.set(value)
window = tk.Tk()
window.title('hello world')
window.geometry('200x200')
# 初始化变量
var1 = tk.StringVar()
var2 = tk.StringVar()
# 设置变量初始值
var2.set((11, 22, 33, 44, 55, 66))
# 创建标签
lable1 = tk.Label(window, bg='yellow', width=15, textvariable=var1)
# 创建按钮1
button1 = tk.Button(window, text='输出选择', width=15, height=2, command=selection)
# 创建列表
listbox1 = tk.Listbox(window, listvariable=var2)
# 循环增加到列表
list_items = [1, 2, 3, 4]
for item in list_items:
listbox1.insert('end', item)
# 删除列表第三个内容
listbox1.delete(2)
# 放置
lable1.pack()
button1.pack()
listbox1.pack()
# 循环刷新,运行
window.mainloop()
运行结果:
Python Tkinter学习 之 尺度scale
主要实现:
显示一个横向的尺度,左右拖动改变标签内容
主程序:
import tkinter as tk
def selection(v):
lable1.config(text=rf'你选择的是{v}')
window = tk.Tk()
window.title('hello world')
window.geometry('200x200')
# 创建标签
lable1 = tk.Label(window, bg='yellow', width=50, text='请选择')
# 创建尺度, from_和to是范围 方向定位(横向) length像素长度 showvalue是否显示value tickinterval隔几个单位显示一个数值 resolution控制小数点
scale = tk.Scale(window, label='try me', from_=5, to=11, orient=tk.HORIZONTAL, length=200, showvalue=0, tickinterval=3,
resolution=0.01, command=selection)
# 放置
lable1.pack()
scale.pack()
# 循环刷新,运行
window.mainloop()
运行结果:
Python Tkinter学习 之 选择按钮
主要实现:
当按钮被点击时,将按钮的值设置为标签的内容
主程序:
import tkinter as tk
def selection():
lable1.config(text=rf'你选择的是{var.get()}')
window = tk.Tk()
window.title('hello world')
window.geometry('200x200')
# 初始化变量
var = tk.StringVar()
# 创建标签
lable1 = tk.Label(window, bg='yellow', width=50, text='请选择')
# 创建选择按钮 ,当按钮被选中时,将value的值传给var
radiob1 = tk.Radiobutton(window, text='option A', variable=var, value='A', command=selection)
radiob2 = tk.Radiobutton(window, text='option B', variable=var, value='B', command=selection)
radiob3 = tk.Radiobutton(window, text='option C', variable=var, value='C', command=selection)
# 放置
lable1.pack()
radiob1.pack()
radiob2.pack()
radiob3.pack()
# 循环刷新,运行
window.mainloop()
运行结果:
Python Tkinter学习 之 勾选项checkbutton
主要实现:
创建多选按钮,当选中一个按钮时,在标签显示已选择该按钮,当选中全部按钮时,在标签显示已选择全部按钮
主程序:
import tkinter as tk
def selection():
# var1.get()获取var的值
if (var1.get() == 1) & (var2.get() == 0):
lable1.config(text=rf'你只选择的是Python')
if (var1.get() == 0) & (var2.get() == 1):
lable1.config(text=rf'你只选择的是C++')
if (var1.get() == 1) & (var2.get() == 1):
lable1.config(text=rf'你选择了全部')
if (var1.get() == 0) & (var2.get() == 0):
lable1.config(text=rf'你没有选择')
window = tk.Tk()
window.title('hello world')
window.geometry('200x200')
var1 = tk.IntVar()
var2 = tk.IntVar()
# 创建标签
lable1 = tk.Label(window, bg='yellow', width=50, text='选择你喜欢的')
# 创建多选按钮,勾选按钮,勾选按钮时onvalue值传给var,取消勾选按钮时offvalue值传给var,
c1 = tk.Checkbutton(window, text='python', variable=var1, onvalue=1, offvalue=0, command=selection)
c2 = tk.Checkbutton(window, text='c++', variable=var2, onvalue=1, offvalue=0, command=selection)
# 放置
lable1.pack()
c1.pack()
c2.pack()
# 循环刷新,运行
window.mainloop()
运行结果:
Python Tkinter学习 之 画布canvas
主要实现:
创建一个画布,将图片添加到画布,在画布里画图形,点击按钮图形移动
主程序:
import tkinter as tk
# 画布内的组件移动
def moveit():
canvas.move(line, 0, 2)
window = tk.Tk()
window.title('hello world')
window.geometry('200x200')
# 创建画布
canvas = tk.Canvas(window, bg='blue', height=100, width=200)
# 创建按钮
button = tk.Button(window, text='move', command=moveit)
# 打开图片
image_file = tk.PhotoImage(file='0.gif')
# 将图片添加到画布
imge = canvas.create_image(10, 10, anchor='nw', image=image_file) # nw锚定的点是图像而不是画布
# 定义坐标变量
x0, y0, x1, y1 = 50, 50, 80, 80
# 画一条直线
line = canvas.create_line(x0, y0, x1, y1)
# 画一个圆
oval = canvas.create_oval(x0, y0, x1, y1, fill='red')
# 画一个扇形
arc = canvas.create_arc(x0 + 30, y0 + 30, x1 + 30, y1 + 30, start=0, extent=180)
# 画一个方形
rect = canvas.create_rectangle(x0 + 0, y0 + 10, x1 + 30, y1 + 30)
# 放置
canvas.pack()
button.pack()
# 循环刷新,运行
window.mainloop()
运行结果:
注意:
tkinter只能使用gif图片文件,如需兼容其他图片格式,可使用PIL的Image,和ImageTk
将
img_gif = tkinter.PhotoImage(file = '0.gif')
修改为:from PIL import Image, ImageTk
img_open = Image.open("0.png")
img_png = ImageTk.PhotoImage(img_open)
Python Tkinter学习 之 菜单menubar
主要实现:
创建一个菜单栏,并实现菜单项的功能
主程序:
import tkinter as tk
count = 0
def do_job():
global count
label.config(text=f'do {count}')
count += 1
window = tk.Tk()
window.title('hello world')
window.geometry('200x200')
# 创建一个标签
label = tk.Label(window, bg='yellow', text='')
# 创建一个菜单栏,可以将他理解成一个容器,在窗口上方
menubar = tk.Menu(window)
# 创建一个菜单项,tearoff=0设置菜单项不能分离出去
filemenu = tk.Menu(menubar, tearoff=0)
# 将菜单项命名为File,并add_cascade添加到菜单栏容器中
menubar.add_cascade(label='File', menu=filemenu)
# 命名并添加功能到file菜单项
filemenu.add_command(label='NEW', command=do_job)
filemenu.add_command(label='open', command=do_job)
filemenu.add_command(label='save', command=do_job)
# 添加一条分割线
filemenu.add_separator()
# quitt()是kinter内的退出函数
filemenu.add_command(label='exit', command=window.quit)
# 创建一个菜单项
editmenu = tk.Menu(menubar, tearoff=0)
# 将菜单项命名为edit,并add_cascade添加到菜单栏容器中
menubar.add_cascade(label='edit', menu=filemenu)
# 命名并添加功能到edit菜单项
editmenu.add_command(label='cut', command=do_job)
editmenu.add_command(label='copy', command=do_job)
editmenu.add_command(label='paste', command=do_job)
# 创建一个二级菜单项,即在菜单项内创建菜单
submenu = tk.Menu(filemenu, tearoff=0)
# 将菜单项命名为import,并添加到edit菜单项中
filemenu.add_cascade(label='import', menu=submenu, underline=0)
# 命名并添加菜单功能到二级菜单
submenu.add_command(label='submenu1', command=do_job)
# 显示菜单栏
window.config(menu=menubar)
# 放置标签
label.pack()
# 循环刷新,运行显示窗口
window.mainloop()
运行结果:
Python Tkinter学习 之 框架frame
简单说明:
Frame:框架,用来承载放置其他GUI元素,就是一个容器,是一个在 Windows 上分离小区域的部件, 它能将 Windows 分成不同的区,然后存放不同的其他部件. 同时一个 Frame 上也能再分成两个 Frame, Frame 可以认为是一种容器.
什么时候用:
在比如像软件或网页交互界面等,有不同的界面逻辑层级和功能区域划分时可以用到,让交互界面逻辑更加清晰。
主程序:
import tkinter as tk # 使用Tkinter前需要先导入
# 第1步,实例化object,建立窗口window
window = tk.Tk()
# 第2步,给窗口的可视化起名字
window.title('My Window')
# 第3步,设定窗口的大小(长 * 宽)
window.geometry('500x300') # 这里的乘是小x
# 第4步,在图形界面上创建一个标签用以显示内容并放置
tk.Label(window, text='on the window', bg='red', font=('Arial', 16)).pack() # 和前面部件分开创建和放置不同,其实可以创建和放置一步完成
# 第5步,创建一个主frame,长在主window窗口上
frame = tk.Frame(window)
frame.pack()
# 第6步,创建第二层框架frame,长在主框架frame上面
frame_l = tk.Frame(frame)# 第二层frame,左frame,长在主frame上
frame_r = tk.Frame(frame)# 第二层frame,右frame,长在主frame上
frame_l.pack(side='left')
frame_r.pack(side='right')
# 第7步,创建三组标签,为第二层frame上面的内容,分为左区域和右区域,用不同颜色标识
tk.Label(frame_l, text='on the frame_l1', bg='green').pack()
tk.Label(frame_l, text='on the frame_l2', bg='green').pack()
tk.Label(frame_l, text='on the frame_l3', bg='green').pack()
tk.Label(frame_r, text='on the frame_r1', bg='yellow').pack()
tk.Label(frame_r, text='on the frame_r2', bg='yellow').pack()
tk.Label(frame_r, text='on the frame_r3', bg='yellow').pack()
# 第8步,主窗口循环显示
window.mainloop()
运行结果:
Python Tkinter学习 之 弹窗messagebox
简单说明:
messageBox:消息框,用于显示你应用程序的消息框。(Python2中为tkMessagebox),其实这里的messageBox就是我们平时看到的弹窗。 我们首先需要定义一个触发功能,来触发这个弹窗,这里我们就放上以前学过的button按钮,通过触发功能,调用messagebox吧,点击button按钮就会弹出提示对话框。
下面给出messagebox提示信息的几种形式:
tk.messagebox.showinfo(title='Hi', message='你好!') # 提示信息对话窗tk.messagebox.showwarning(title='Hi', message='有警告!') # 提出警告对话窗tk.messagebox.showerror(title='Hi', message='出错了!') # 提出错误对话窗print(tk.messagebox.askquestion(title='Hi', message='你好!')) # 询问选择对话窗return 'yes', 'no'
print(tk.messagebox.askyesno(title='Hi', message='你好!')) # return 'True', 'False'
print(tk.messagebox.askokcancel(title='Hi', message='你好!')) # return 'True', 'False'
print(tk.messagebox.askretrycancel(title='Hi', message='你好!')) # return 'True', 'False'
什么时候用:
在比如像软件或网页交互界面等,有不同的界面逻辑层级和功能区域划分时可以用到,让交互界面逻辑更加清晰。主程序:
import tkinter as tk # 使用Tkinter前需要先导入
import tkinter.messagebox # 要使用messagebox先要导入模块
# 第1步,实例化object,建立窗口window
window = tk.Tk()
# 第2步,给窗口的可视化起名字
window.title('My Window')
# 第3步,设定窗口的大小(长 * 宽)
window.geometry('500x300') # 这里的乘是小x
# 第5步,定义触发函数功能
def hit_me():
tk.messagebox.showinfo(title='Hi', message='你好!') # 提示信息对话窗
tk.messagebox.showwarning(title='Hi', message='有警告!') # 提出警告对话窗
tk.messagebox.showerror(title='Hi', message='出错了!') # 提出错误对话窗
print(tk.messagebox.askquestion(title='Hi', message='你好!')) # 询问选择对话窗return 'yes', 'no'
print(tk.messagebox.askyesno(title='Hi', message='你好!')) # return 'True', 'False'
print(tk.messagebox.askokcancel(title='Hi', message='你好!')) # return 'True', 'False'
print(tk.messagebox.askretrycancel(title='Hi', message='你好!')) # return 'True', 'False'
# 第4步,在图形界面上创建一个标签用以显示内容并放置
tk.Button(window, text='hit me', bg='green', font=('Arial', 14), command=hit_me).pack()
# 第6步,主窗口循环显示
window.mainloop()
测试效果:
Python Tkinter学习 之 放置方式pack/grid/place
简单说明:
pack 边界布局,由side控制,默认居中,上top,下bottom,左left,右right。
grid 网格布局,所有的内容会被放在这些规律的方格中,row行,column列,ipadx/ipady网格大小长和宽。
place 自定义位置,由坐标点控制,anchor设置锚点,anchor='nw’的含义是“将控件的左上角的点安放在指定坐标位置”。 x/y是绝对坐标,relx/rely是相对坐标值,是相对父组件的坐标,取值范围为0-1,
窗体界面左上角坐标:relx=0,rely=0
窗体界面右上角坐标:relx=1,rely=1
窗体界面正中间坐标:relx=0.5,rely=0.5
窗体界面左下角坐标:relx=0,rely=1
窗体界面右下角坐标:relx=1,rely=1
主程序:
import tkinter as tk
window = tk.Tk()
window.title('hello world')
window.geometry('200x200')
# grid 网格布局
for i in range(3):
for j in range(3):
tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10, ipadx=10, ipady=10)
# pack 边界布局
tk.Label(window, text='P', fg='red').pack(side='top') # 上
tk.Label(window, text='P', fg='red').pack(side='bottom') # 下
tk.Label(window, text='P', fg='red').pack(side='left') # 左
tk.Label(window, text='P', fg='red').pack(side='right') # 右
tk.Label(window, text='P', fg='red').pack() # 中
# place 自定义位置坐标
tk.Label(window, text='hello Place2').place(x=0, y=0, anchor='nw') # 绝对位置,将控件的左上角的点安放在指定坐标位置
tk.Label(window, text='hello Place1').place(relx=0.5, rely=0.5, anchor='nw') # 相对位置,自适应,居中,窗口改变位置不变
# 循环刷新,运行显示窗口
window.mainloop()