python tkinker库模块详解

1、脚本名称不能命名为模块名,否则会报:

Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/untitled/python/web/tkinter.py", line 1, in <module>
    import tkinter as tk
  File "C:\Users\Administrator\PycharmProjects\untitled\python\web\tkinter.py", line 2, in <module>
    root=tk.Tk()
AttributeError: module 'tkinter' has no attribute 'Tk'

2、tkinter基本用法

import tkinter as tk
#创建一个主窗口
root=tk.Tk()
#设置主窗口对象的标题栏
root.title("func")
#添加一个Label组件,可以显示文本、图标或者图片
theLabel=tk.Label(root,text='this is a funck you')
#然后调用Label组件下的pack()方法,用于自动调节组件自身的尺寸
theLabel.pack()
#显示窗口命令
root.mainloop()

Label组件:标签,用于界面输出描述的标签,用法:
theLabel=tk.Label(root,text='this is a funck you',justify=LEFT,padx=10,image=photo,compound=CENTER,font=('宋体',20),fg='white')
root为主窗口对象,text为界面显示的信息,justify为显示的信息的显示样式,padx为样式与边框之间的距离,image为加载的图片,compound为文本和图像的混合模式font 设置字体和字号,fg设置字体颜色,textvariable 为动态标签
theLabel.pack()

Button组件:用于实现一个按钮,点击按钮可以调用其他命令,需要重新定义主窗口
from tkinter import *
import sys
#创建一个主窗口
sys.stdout.flush()
root=Tk()
#标签对象
frame1=Frame(root)
#图像对象
frame2=Frame(root)
def callback():
    var.set("funck you")
var=StringVar()
var.set("this is a dangous pig")
textlabel=Label(root,text='dsfdasfdsfds',justify=LEFT)
textlabel.pack(side=LEFT)
photo=PhotoImage(file=r'C:\Users\Administrator\Desktop\106\data\pic\左中右\k线图.gif')
imglabel=Label(frame1,image=photo)
imglabel.pack(side=RIGHT)
thebutton=Button(frame2,text='fsdfgdsgdsgwerwr',command=callback)
thebutton.pack()
frame1.pack(padx=10,pady=10)
frame2.pack(padx=10,pady=10)
mainloop()

Checkbutton组件:多选按钮,Radiobutton是单选按钮
from tkinter import *
root=Tk()
#用于表示该按钮是否被选中
v=IntVar()
c=Checkbutton(root,text='测试一下',variable=v)
c.pack()
#如果选项被选中,那么变量v被赋值为1,否则为0
#可以用动态标签动态展示
l=Label(root,textvariable=v)
l.pack()
mainloop()

Checkbutton实现多选:选项的对齐方式使用anchor,N、NE、E、SE、S、SW、NW和CENTER  上北下南左西右东
from tkinter import *
root=Tk()
girls=['西施','王昭君','貂蝉','杨玉环']
v=[]
for girl in girls:
    v.append(IntVar())
    b=Checkbutton(root,text=girl,variable=v[-1],justify=LEFT)
    b.pack(anchor=W)
mainloop()
from tkinter import *
root=Tk()
langs=[("python",1),("python1",2),("python2",3),("python3",4)]
v=IntVar()
v.set(1)
for lang,num in langs:
    #indicatoron控制按钮形式,False为框,默认为小圆圈
    b=Radiobutton(root,text=lang,variable=v,value=num,indicatoron=False)
    b.pack(anchor=W)
mainloop()
LabelFrame组件:是Frame框架的进化版,从形态上来说,就是给label添加了Frame,
from tkinter import *
root=Tk()
group=LabelFrame(root,text='最好的脚本语言是?',padx=5,pady=5)
group.pack(padx=10,pady=10)
langs=[("python",1),("python1",2),("python2",3),("python3",4)]
v=IntVar()
v.set(1)
for lang,num in langs:
    b=Radiobutton(group,text=lang,variable=v,value=num)
    b.pack(anchor=W)
mainloop()
Entry组件,输入框,可以控制输入内容的合法性
from tkinter import *
root=Tk()
e=Entry(root)
e.pack(padx=20,pady=20)
e.delete(0,END)
e.insert(0,"默认")
mainloop()
from tkinter import *
root=Tk()
#tkinter总共提供了三种布局组件的方法,pack(),grid()和place()
#pack(fill=X) X表示横向 Y表示纵向 
#grid()方法允许你用表格的形式来管理组件
#place() relx rely
#row 行,column 列
Label(root,text='作品').grid(row=0)
Label(root,text='作者').grid(row=1)
v1=StringVar()
v2=StringVar()
e1=Entry(root,textvariable=v1)
e2=Entry(root,textvariable=v2,show='*')
e1.grid(row=0,column=1,padx=10,pady=5)
e2.grid(row=1,column=1,padx=10,pady=5)
def show():
    print("作品:《%s》"%(e1.get()))
    print("作者: %s"%(e2.get()))
    e1.delete(0,END)
    e2.delete(0, END)
#如果表格大于组件,那么可以使用sticky选项来设置组件的位置
Button(root,text='获取信息',width=10,command=show).grid(row=3,column=0,sticky=W,padx=10,pady=5)
Button(root,text='退出',width=10,command=root.quit).grid(row=3,column=1,sticky=E,padx=10,pady=5)
mainloop()

focus:当Entry组件获得或者失去焦点的时候验证
focusin 当Entry组件获得焦点的时候验证
focusout 当Entry组件失去焦点
key 当输入框被编辑的时候验证
all 当出现上面任何一种情况的时候验证
none 关闭验证功能。默认为关闭,none为字符串,而非None
from tkinter import *
root=Tk()
def test():
    if e1.get()=='小甲鱼':
        print("正确")
        return True
    else:
        print("错误")
        e1.delete(0,END)
        return False
#文本变量
v=StringVar()
#validate 验证
#validatecommand 验证方法
e1=Entry(root,textvariable=v,validate='focusout',validatecommand=test)
e2=Entry(root)
e1.pack(padx=10,pady=10)
e2.pack(padx=10,pady=10)
mainloop()
from tkinter import *
root=Tk()
def test():
    if e1.get()=='小甲鱼':
        print("正确")
        return True
    else:
        print("错误")
        e1.delete(0,END)
        return False
def test1():
    print("我被调用了")
    return True
#文本变量
v=StringVar()
#validate 验证
#validatecommand 验证方法
e1=Entry(root,textvariable=v,validate='focusout',validatecommand=test,invalidcommand=test1)
e2=Entry(root)
e1.pack(padx=10,pady=10)
e2.pack(padx=10,pady=10)
mainloop()

#validatecommand方法只有在返回值为False的时候才被调用
当你输入任何值的时候,只有把焦点转移到第二个输入框的时候,验证功能才会被触发,invalidcommand命令只有在validatecommand返回False时才能被调用。

'%d' 操作代码:0表示删除操作;1表示插入操作;2表示获得、失去焦点或textvariable变量的值被修改
'%i' 当用户尝试或删除操作的时候,该选项表示插入或删除的位置(索引号),如果是由于获得、失去焦点或textvaliable变量的值被修改而调用验证函数,那么该值为-1
'%P' 当输入框的值允许改变的时候,该值有效,该选项表示文本被插入和删除的内容
'%s' 该值为调用验证函数前输入框的文本内容
'%S' 当插入或者删除操作触发验证函数的时候,该值有效
该选项表示文本被插入和删除的内容
'%v' 该组件当前的validate选项的值
'%V' 调用验证函数的原因,该值是focusin、focusout、key、forced中的一个
'%W' 该组件的名称
validatecommand=(f,s1,s2,...)
f是验证函数,s1,s2,s3是额外的选项,这些参数会依次传给f函数,需要调用register()方法将验证函数包装起来.


from tkinter import *
root=Tk()
frame=Frame(root)
frame.pack(padx=10,pady=10)
v1=StringVar()
v2=StringVar()
v3=StringVar()
def test(content):
    if content.isdigit():
        return True
    else:
        return False
#register将函数封装起来
testCMD=root.register(test)
Entry(frame,textvariable=v1,width=10,validate='key',validatecommand=(testCMD,'%P')).grid(row=0,column=0)
Label(frame,text='+').grid(row=0,column=1)
Entry(frame,textvariable=v2,width=10,validate='key',validatecommand=(testCMD,'%P')).grid(row=0,column=2)
Label(frame,text='=').grid(row=0,column=3)
Entry(frame,textvariable=v3,width=10,validate='key',validatecommand=(testCMD,'%P')).grid(row=0,column=4)
def calc():
    result=int(v1.get())+int(v2.get())
    v3.set(result)
Button(frame,text='计算结果',command=calc).grid(row=1,column=2,pady=5)
mainloop()
Listbox组件:对于Checkbutton多选按钮和Radiobutton单选按钮,固定窗口满足不了,可以使用Listbox,配合使用insert方法
from tkinter import *
root=Tk()
theLB=Listbox(root,setgrid=True)
theLB.pack()
for item in ['鸡蛋','鸭蛋','鹅蛋','李狗蛋']:
    theLB.insert(END,item)
#ACTIVE表示特殊的索引,表示当前被选中的项目
#Listbox组件根据selectmode选项提供了4种模式,SINGLE(单选),BROWSE(单选,拖到鼠标键或者方向键),MULTIPLE(多选),EXTENDED(多选,但需要同时按住Shift和Ctrl),默认是BROWSE
theButton=Button(root,text='删除',command=lambda x=theLB:x.delete(ACTIVE))
theButton.pack()
mainloop()

Scrollbar组件:为了在某一个独立的组件而存在,1、设置该组件的yscrollbarcommand选项为Scrollbar组件的set()方法:
2、设置Scrollbar组件的command选项为该组件的yview()方法   设置滚动条
from tkinter import *
root=Tk()
sb=Scrollbar(root)
sb.pack(side=RIGHT,fill=Y)
lb=Listbox(root,yscrollcommand=sb.set)
for i in range(1000):
    lb.insert(END,i)
lb.pack(side=LEFT,fill=BOTH)
sb.config(command=lb.yview)
mainloop()

Scale组件:主要是通过滑块来表示某个范围内的一个数字,可以通过修改选项,当用户输入
from tkinter import *
root=Tk()
sb=Scrollbar(root)
sb.pack(side=RIGHT,fill=Y)
lb=Listbox(root,yscrollcommand=sb.set)
for i in range(1000):
    lb.insert(END,i)
lb.pack(side=LEFT,fill=BOTH)
sb.config(command=lb.yview)
mainloop()
Text组件:用于显示和处理多行文本,主要目的是显示多行文本,也常常用为简单的文本编辑器和网页浏览器使用.不仅支持插入和编辑文本,它还支持插入image对象和window组件.
from tkinter import *
root=Tk()
text=Text(root,width=30,height=20) #宽高设置必须大于图片实际大小
text.pack()
text.insert(INSERT,"I funck you")
photo=PhotoImage(file=r'C:\Users\Administrator\Desktop\106\data\pic\左中右\k线图.png')
def show():
    text.image_create(END,image=photo)
b1=Button(text,text="显示K线图",command=show)
text.window_create(INSERT,window=b1)
mainloop()

Indexes用法:用来指向Text组件中文本的位置,Text组件索引也是对应实际字符之间的位置
1、line.column:用行号和列号组成的字符串是常用的索引方式,他们将索引位置的行号和列号以字符串的形式表示出来,行号以1开始,列号以0开始.   "%d.%d"%(line,column)
指定超出现有文本的最后一行的行号,或超出一行中列数的列号都不会引发错误。解释为已有内容末尾的下一个位置。也可以使用为浮点值。
2、line.end 行号加上字符串表示改行的最后一个字符。
text.insert(INSERT,"I funck you")
print(text.get("1.2","1.end"))
3、INSERT:对应插入光标的位置
4、CURRENT:对应与鼠标坐标最接近的位置。不过,直到松开才会生效。
5、END:对应的Text组件的文本缓冲区最后一个字符的下一个位置
6、user-defined tags:代表可以分配给Text组件的特殊事件绑定和风格。
"%s.first"%tagname   使用tag的文本的第一个字符之前
"%s.last"%tagname    使用tag的文本的最后一个字符之后,语法表示标签的范围
Marks用法:嵌入到text组件文本中的不可见对象。Marks是指定字符间的位置,并且跟随相应的字符一起移动。其中INSERT 和CURRENT和user-defined marks
tags用法:用于改变文本的字体、颜色、尺寸、SEL表示选中的内容
canvas通常用于显示和编辑图像
from tkinter import *
import webbrowser
root=Tk()
w=Canvas(root,width=200,height=100)
w.pack()
#画一条黄色的横线
line1=w.create_line(0,50,200,50,fill='yellow')
#画一条红色的竖线(虚线)
line2=w.create_line(100,0,100,100,fill='red',dash=(4,4))
#中间画一个矩形
rec1=w.create_rectangle(50,25,150,75,fill='blue')
#移动线图
w.coords(line1,0,25,200,25)
#更改尺寸
w.itemconfig(rec1,fill='red')
w.delete(line2)
Button(root,text='删除全部',command=(lambda x=ALL:w.delete(x))).pack()
mainloop()
当需要对Canvas对象进行修改的时候,可以使用coords、itemconfig()、move()方法 来移动画布上的对象,或者使用delete()方法来删除
w.create_rectangle 画框   w.create_oval 绘制椭圆或者圆形  w.create_text 编辑文本  w.create_polygon 绘制多边形
w.create_arc 弧形、弦、扇形  w.create_bitmap 内建的位图文件 w.create_line 画线 w.create_window 组件

Menu组件:实现菜单功能.
from tkinter import *
import webbrowser
root=Tk()
def callback():
    print("被调用了....")
def popup(event):
    menu.post(event.x_root,event.y_root)
#创建一个顶级菜单
menubar=Menu(root)
#创建一个下拉菜单"文件",然后将它加入顶级菜单里面
filemenu=Menu(menubar,tearoff=False)
filemenu.add_command(label='打开',command=callback)
filemenu.add_command(label='保存',command=callback)
filemenu.add_separator()
filemenu.add_command(label='退出',command=root.quit)
menubar.add_cascade(label='文件',menu=filemenu)
editmenu=Menu(menubar,tearoff=False)
editmenu.add_command(label='剪切',command=callback)
editmenu.add_command(label='拷贝',command=callback)
editmenu.add_command(label='粘贴',command=callback)
menubar.add_cascade(label='编辑',menu=editmenu)
root.config(menu=menubar)
frame=Frame(root,width=512,height=512)
frame.pack()
frame.bind("<Button -3>",popup)
mainloop()

#Menubutton组件 和menu组件一致,但可以放在窗口的任意位置,并且按下出现弹出窗口。

from tkinter import *
root=Tk()
def callback():
    print("被调用了....")
mb=Menubutton(root,text='点我',relief=RAISED)
mb.pack()
#创建一个顶级菜单
menubar=Menu(mb,tearoff=False)
#创建一个下拉菜单"文件",然后将它加入顶级菜单里面
filemenu=Menu(menubar,tearoff=False)
filemenu.add_checkbutton(label='打开',command=callback,selectcolor='yellow')
filemenu.add_command(label='保存',command=callback)
filemenu.add_separator()
filemenu.add_command(label='退出',command=root.quit)
mb.config(menu=filemenu)
mainloop()
OptionMebu组件:下拉菜单的改进版,弥补了Listbox组件无法实现下拉列表框的遗憾。
from tkinter import *
options=['california','458','dfasf','dasd']
root=Tk()
variable=StringVar()
variable.set('you are a bitch')
w=OptionMenu(root, variable,*options)
w.pack()
def callback():
    print(variable.get())
Button(root,text='点我',command=callback).pack()
mainloop()

Message组件:是Label组件的变体,用于多行文本消息显示,并且能够自动换行,调整文本尺寸使其适应给定的尺寸
from tkinter import *
root=Tk()
w1=Message(root,text='这是一则消息',width=100)
w1.pack()
w2=Message(root,text='这是一则骇人听闻的长春出差吃醋尺寸长春出差',width=100)
w2.pack()
mainloop()
Spinbox组件:是Entry组件的变体,用于从一些固定的值中选取一个。,区别:Spinbox可以通过范围或者元祖指定用户输入内容。
from tkinter import *
root=Tk()
w=Spinbox(root,from_=0,to=10)
#values可以设置显示特定的值#w=Spinbox(root,values=("傻逼",'逗比','二逼'))w.pack()
mainloop()

PanedWINDOW组件:是一个空间管理组件,和Frame类似,但允许让用户调整应用程序的空间划分。
from tkinter import *
root=Tk()
m=PanedWindow(orient=VERTICAL)
m.pack(fill=BOTH,expand=1)
top=Label(m,text='top pane')
m.add(top)
bottom=Label(m,text='bottom pane')
m.add(bottom)
mainloop()

Toplevel组件:类似Frame组件,用在显示额外的窗口、对话框和其他弹出窗口,attributes()方法用于设置和获取窗口属性,如果给出选项名,将返回当前窗口该选项的值。注意:以下选项不支持关键字参数,需要在选项前添加横杠 并用字符串的方式表示,用逗号隔开选项和值
from tkinter import *
root=Tk()
def create():
    top=Toplevel()
    top.title("Fishc Demo")
    top.attributes('-alpha',0.5)
    msg=Message(top,text=" fuck you")
    msg.pack()
Button(root,text='创建顶级窗口',command=create).pack()
mainloop()

事件绑定:包括用户触发的鼠标、键盘操作和窗口管理器触发的重绘事件,可以通过bind()方法将函数或者方法绑定到具体的事件上。当被触发的事件满足该组件绑定的事件时,Tkinter就会带着事件描述去调用handler()方法。
from tkinter import *
root=Tk()
def callback(event):
    print("点击位置是:",event.x,event.y)
frame=Frame(root,width=200,height=200)
#bind是将函数绑定事件
frame.bind("<Button>",callback)
frame.pack()
mainloop()

事件序列:使用bind()方法将具体的事件序列与自定义的方法绑定。事件序列是以字符串的形式表示的,可以表示一个或多个相关的事件。
事件序列使用语法:<modifier-type-detail>
type描述普通的事件类型,比如鼠标的单击或者键盘的单击
modifier 可选,通常用于描述组合键
detail可选,用于描述具体的按键
<Button-1> 表示用户单击鼠标左键
<KeyPress-H> 表示用户按下H键
<Control-Shift-KeyPress-H> 表示用户按下ctrl+shift+H
-----------------------------------------------------------------------------------------------
type:列举部分常用的关键词及含义:
Activate 当组件的状态从未激活变成激活的时候触发该事件。
Button 当用户单击鼠标按键的时候触发该事件。detail部分指定具体哪个按键:
<Button-1>鼠标左键  <Button-2>鼠标中键 <Button-3> 鼠标右键 <Button-4>滚轮上滚(Linux) <Button-5>滚轮下滚
ButtonRelease当用户释放鼠标按键的时候触发该事件。
Configure 当组件的尺寸发生变化的时候触发该事件。
Deactivate 当组件的状态从激活变成未激活的时候触发该事件。
Destroy 当组件被销毁的时候触发该事件
Enter 当鼠标指针进入组件的时候触发该事件。注意:不是用户按下回车键
Expose 当窗口或者组件的某部分不再被覆盖的时候触发该事件
FocusOut 当组件失去焦点的时候触发该事件
FocusIn 当组件获得焦点的时候触发该事件
KeyPress 当用户按下键盘按键的时候触发该事件
Leave 当鼠标指针离开组件的时候触发该组件
Map 当组件被映射的时候触发该事件
Motion 当鼠标在组件内移动的整个过程均触发该事件
MouseWheel 当鼠标滚动的时候触发该事件 
modifier:
Alt:当按下Alt按键的时候
Any:表示任何类型的按键被按下的时候。<Any-KeyPress> 表示当用户按下任何按键的时候触发该事件
Control:当按下Ctrl按键的时候
Double:当后续两个事件被连续触发的时候。例如<Double-Button-1> 表示用户双击鼠标左键时触发该事件
Lock当打开大写字母锁定键的时候(CapsLock)
Shift 当按下Shift按键的时候
Triple 跟Double类似,当后续三个事件被连续触发的时候


 

猜你喜欢

转载自blog.csdn.net/qq_24726509/article/details/84290477
今日推荐