Tkinter 编程
Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。
由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能import tkinter
库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinter 还是能应付自如。
创建一个GUI程序
- 导入 Tkinter 模块 (Python3.x 版本使用的库名为 tkinter,即首写字母 T 为小写)
- 创建控件
- 指定这个控件的 master, 即这个控件属于哪一个
- 告诉 GM(geometry manager) 有一个控件产生了。
实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import tkinter
top = tkinter.Tk()
top.mainloop()# 进入消息循环
Tkinter 组件
控件 | 描述 | 属性 |
---|---|---|
Frame | 框架控件;在屏幕上显示一个矩形区域,多用来作为容器 | |
LabelFrame | labelframe 是一个简单的容器控件。常用与复杂的窗口布局 | text |
Label | 标签控件;可以显示文本和位图 | text, textvariable, image, compound, font, fg, justify=tkinter.LEFT, CENTER…对齐方式, padx, pady, |
Button | 按钮控件;在程序中显示按钮 | text, fg前景色, bg背景色, command , width, |
Checkbutton | 多选框控件;用于在程序中提供多项选择框 | text, variable按钮状态, |
Radiobutton | 单选按钮控件;显示一个单选的按钮状态 | text, variable, value, indicatoron=False按钮模式 |
Entry | 输入控件;用于显示简单的文本内容 | show=”, 验证(未学习),对象的方法:insert(),get(),delete() |
Listbox | 列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户, | selectmode=SINGLE,EXTENDED。。。 , 默认显示10项height=, |
Scrollbar | 滚动条控件,当内容超过可视化区域时使用,如列表框 | |
Scale | 范围控件;显示一个数值刻度,为输出限定范围的数字区间 | from_ =0与关键字重合,所以加_,to=200,orient=HORIZONTAL水平,默认垂直, tickinterval精度=5 ,resolution步长,length 对象的方法:get()获取当前位置 |
Text | 文本控件;用于显示多行文本;还可以插入window对象image对象 | width,height 方法:insert(INSERT/END,‘’) |
Canvas | 画布控件;显示图形元素如线条或文本 | width,height,background=’red’画布颜色 |
Menu | 菜单控件;显示菜单栏,下拉菜单和弹出菜单 | |
Menubutton | 菜单按钮控件,用于显示菜单项。 | 点击按钮显示下拉菜单 |
OptionMenu | 选择菜单 | |
Message | 消息控件;用来显示多行文本,与label比较类似 | |
Spinbox | 输入控件;与Entry类似,但是可以指定输入范围值 | |
Toplevel | 容器控件;用来提供一个单独的对话框,和Frame比较类似 | |
PanedWindow | PanedWindow是一个窗口布局管理的插件,可以包含一个或者多个子控件 |
from tkinter import *
def callback():
var.set('我才不信')
root = Tk()
root.title('警告')
var=StringVar()
var.set('您所下载的影片含有未成年人限制内容')
textLabel=Label(root,textvariable=var) #textvariable
textLabel.pack()
photo=PhotoImage(file='C:\\Users\\yue\\Desktop\\python\\18.GIF')
imgLabel=Label(root,image=photo) #image
imgLabel.pack()
theButton=Button(root,text='我已满18岁',command=callback) #command
theButton.pack()
root.mainloop()
from tkinter import *
root=Tk()
v=IntVar()
c=Checkbutton(root,text='测试一下',variable=v) #Checkbutton
c.pack()
l=Label(root,textvariable=v)
l.pack()
mainloop()
from tkinter import *
root=Tk()
frame=Frame(root)
Girls=['貂蝉','西施','王昭君','杨贵妃']
v=[]
for girl in Girls:
v.append(IntVar())
theButton = Checkbutton(frame,text=girl,variable=v[-1])
theButton.pack(anchor=W)
frame.pack()
root.mainloop()
from tkinter import *
root = Tk()
root.title('警告')
v=IntVar()
Radiobutton(root,text='1',variable=v,value=1,indicatoron=False).pack() #Radiobutton
Radiobutton(root,text='2',variable=v,value=2).pack()
Radiobutton(root,text='3',variable=v,value=3).pack()
thelabel=Label(root,textvariable=v).pack()
root.mainloop()
from tkinter import *
root=Tk()
group=LabelFrame(root,text='请问您最喜欢四大美女中的哪一个?',padx=5,pady=5) #LabelFrame
Girls=[('貂蝉',1),('西施',2),('王昭君',3),('杨贵妃',4)]
v=IntVar()
for girl,num in Girls:
theButton = Radiobutton(group,text=girl,variable=v,value=num,padx=10,pady=5)
theButton.pack(anchor=W)
group.pack()
root.mainloop()
from tkinter import *
root=Tk()
e=Entry(root) #Entry
e.pack()
e.delete(0,END)
e.insert(0,'默认')
root.mainloop()
from tkinter import *
root=Tk()
Label(root,text='作者').grid(row=0,column=0,padx=10,pady=5)
Label(root,text='单位').grid(row=1,column=0,padx=10,pady=5)
theentry1=Entry(root)
theentry1.grid(row=0,column=1,padx=10,pady=5)
theentry2=Entry(root,show='*') #show
theentry2.grid(row=1,column=1,padx=10,pady=5)
def show():
print('作者:《%s》'%theentry1.get())
print('单位:《%s》'%theentry2.get())
thebutton1=Button(root,text='获取信息',width=10,command=show).grid(row=2,column=0,sticky=W,padx=10,pady=5)
thebutton2=Button(root,text='退出',width=10,command=root.quit()).grid(row=2,column=1,sticky=E,padx=10,pady=5)
root.mainloop()
from tkinter import *
root = Tk()
theLB=Listbox(root,selectmode=EXTENDED) #Listbox
theLB.pack()
for item in ['西施','杨贵妃','钓船','猪猪','鸡蛋']:
theLB.insert(END,item)
theButton=Button(root,text='删除',command=lambda x=theLB:x.delete(ACTIVE))
theButton.pack()
root.mainloop()
from tkinter import *
root = Tk()
sb=Scrollbar() #Scrollbar
sb.pack(side=RIGHT,fill=Y)
theLB=Listbox(root,yscrollcommand=sb.set,selectmode=EXTENDED) #步骤一:设置该组件的yscrollcommand选项为Scrollbar组件的set()方法
theLB.pack()
for item in range(100):
theLB.insert(END,item)
sb.config(command=theLB.yview) #步骤二:设置Scrollbar组件的command选项为该组件的yview()方法
theButton=Button(root,text='删除',command=lambda x=theLB:x.delete(ACTIVE))
theButton.pack(side=LEFT,fill=BOTH)
root.mainloop()
from tkinter import *
root = Tk()
Scale(root,from_=0,to=42,tickinterval=5,resolution=2,length=200).pack() #Scale
Scale(root,from_=0,to=200,orient=HORIZONTAL,tickinterval=5 ).pack()
root.mainloop()
from tkinter import *
root = Tk()
text=Text(root,width=100,height=100) #Text
text.pack()
text.insert(INSERT,'i love\n')
text.insert(END,'fishc\n')
photo=PhotoImage(file='18.gif')
def show():
text.image_create(END,image=photo) #插入image对象
thebutton=Button(text,text='点我',command=show)
text.window_create(INSERT,window=thebutton) #插入window对象
root.mainloop()
from tkinter import *
root = Tk()
def callback():
print('你好')
m=Menu(root) #顶级菜单
filemenu=Menu(m,tearoff=False) #下拉菜单 tearoff=True可以撕开菜单
filemenu.add_command(label='打开',command=callback)
filemenu.add_command(label='保存',command=callback)
filemenu.add_separator()
filemenu.add_command(label='退出',command=root.quit)
m.add_cascade(label='文件',menu=filemenu)
editmenu=Menu(m,tearoff=False) #下拉菜单
editmenu.add_command(label='剪切',command=callback)
editmenu.add_command(label='拷贝',command=callback)
editmenu.add_command(label='粘贴',command=root.quit)
m.add_cascade(label='编辑',menu=editmenu)
menubar =Menu(root,tearoff=False)#弹出菜单
menubar.add_command(label='撤销',command=callback)
menubar.add_command(label='重做',command=callback)
frame=Frame(root,width=500,height=500)
frame.pack()
def popup(event): #事件
menubar.post(event.x_root,event.y_root)
frame.bind('<Button-3>',popup) #绑定事件: Button表示鼠标点击事件,1表示左键,2表示中间键,3表示右键。Key表示键盘按键。Motion表示鼠标位置事件
root.config(menu=m) #顶级菜单
root.mainloop()
from tkinter import *
root = Tk()
variable=StringVar()
variable.set('one') #默认值
w=OptionMenu(root,variable,'one','two','three') #OptionMenu
w.pack()
root.mainloop()
from tkinter import *
thelist=['one','two','three','four']
root = Tk()
variable=StringVar()
variable.set(thelist[0]) #默认值
w=OptionMenu(root,variable,*thelist) #*是一个解包过程 OptionMenu
w.pack()
root.mainloop()
from tkinter import *
root=Tk()
w=Spinbox(root,from_=0,to=10) #Spinbox
w.pack()
mainloop()
from tkinter import *
root=Tk()
w=Spinbox(root,value=['one','two','three','four'])
w.pack()
mainloop()
from tkinter import *
root=Tk()
def create():
top=Toplevel() #Toplevel
top.title('fishc')
msg=Message(top,text='i love you ,fishc.com') #Message
msg.pack()
Button(root,text='创建顶级窗口',command=create).pack()
mainloop()
标准对话框
控件 | 描述 |
---|---|
tkMessageBox | 用于显示你应用程序的消息框。 |
tkFileDialog | 文件打开 |
tkColorChooser | 选择颜色 |
python2.x中这些模块是独立的,需要导入,python3之后,全部被手拿到tkinter模块中,还是需要导入这些子模块。在一些教程中不需要导入,原因还未知。
from tkinter import *
from tkinter import messagebox #messagebox
messagebox.askokcancel('fishc','你成功了!')
mainloop()
from tkinter import *
from tkinter import filedialog #filedialog 与messagebox子模块一样,都要import
root=Tk()
def callback():
filename=filedialog.askopenfilename()
print(filename)
Button(root,text='打开文件',command=callback).pack()
mainloop()
from tkinter import *
from tkinter import colorchooser #colorchooser 与messagebox子模块一样,都要import
root=Tk()
def callback():
filename=colorchooser.askcolor()
print(filename)
Button(root,text='选择颜色',command=callback).pack()
mainloop()
事件
几何管理
Tkinter控件有特定的几何状态管理方法,管理整个控件区域组织,不可以混合使用。以下是Tkinter公开的几何管理类:包装、网格、位置
几何方法 | 描述 | 属性 |
---|---|---|
pack() | 包装,按照添加顺序排列组件 | side=tkinter.LEFT,RIGHT,TOP,BOTTOM, padx, pady, anchor=W,E,N,S,WE ,fill=X,Y横向填充纵向填充 |
grid() | 网格,按照行列排列组件 | row, column, rowspan跨行, columnspan, sticky=W,E,N,S,WE |
place() | 位置,允许指定组件的大小和位置 | relx,rely |
from tkinter import *
root=Tk()
Label(root,text='用户名').grid(row=0,column=0,sticky=W) #grid
Label(root,text='密码').grid(row=1,column=0,sticky=W)
e1=Entry(root)
e1.grid(row=0,column=1,padx=10)
e2=Entry(root,show='*')
e2.grid(row=1,column=1,padx=10)
def create():
print('用户名:',e1.get())
print('密码:',e2.get())
Button(root,text='提交',command=create,width=10).grid(row=2,columnspan=3)
photo=PhotoImage(file='18.gif')
Label(root,image=photo).grid(row=0,column=2,rowspan=2)
mainloop()
root.quit()
root.title(”)