当前位置:   article > 正文

python tkinker库模块详解

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基本用法

  1. import tkinter as tk
  2. #创建一个主窗口
  3. root=tk.Tk()
  4. #设置主窗口对象的标题栏
  5. root.title("func")
  6. #添加一个Label组件,可以显示文本、图标或者图片
  7. theLabel=tk.Label(root,text='this is a funck you')
  8. #然后调用Label组件下的pack()方法,用于自动调节组件自身的尺寸
  9. theLabel.pack()
  10. #显示窗口命令
  11. root.mainloop()
  12. Label组件:标签,用于界面输出描述的标签,用法:
  13. theLabel=tk.Label(root,text='this is a funck you',justify=LEFT,padx=10,image=photo,compound=CENTER,font=('宋体',20),fg='white')
  14. root为主窗口对象,text为界面显示的信息,justify为显示的信息的显示样式,padx为样式与边框之间的距离,image为加载的图片,compound为文本和图像的混合模式font 设置字体和字号,fg设置字体颜色,textvariable 为动态标签
  15. theLabel.pack()
  16. Button组件:用于实现一个按钮,点击按钮可以调用其他命令,需要重新定义主窗口
  1. from tkinter import *
  2. import sys
  3. #创建一个主窗口
  4. sys.stdout.flush()
  5. root=Tk()
  6. #标签对象
  7. frame1=Frame(root)
  8. #图像对象
  9. frame2=Frame(root)
  10. def callback():
  11. var.set("funck you")
  12. var=StringVar()
  13. var.set("this is a dangous pig")
  14. textlabel=Label(root,text='dsfdasfdsfds',justify=LEFT)
  15. textlabel.pack(side=LEFT)
  16. photo=PhotoImage(file=r'C:\Users\Administrator\Desktop\106\data\pic\左中右\k线图.gif')
  17. imglabel=Label(frame1,image=photo)
  18. imglabel.pack(side=RIGHT)
  19. thebutton=Button(frame2,text='fsdfgdsgdsgwerwr',command=callback)
  20. thebutton.pack()
  21. frame1.pack(padx=10,pady=10)
  22. frame2.pack(padx=10,pady=10)
  23. mainloop()
  24. Checkbutton组件:多选按钮,Radiobutton是单选按钮
  1. from tkinter import *
  2. root=Tk()
  3. #用于表示该按钮是否被选中
  4. v=IntVar()
  5. c=Checkbutton(root,text='测试一下',variable=v)
  6. c.pack()
  7. #如果选项被选中,那么变量v被赋值为1,否则为0
  8. #可以用动态标签动态展示
  9. l=Label(root,textvariable=v)
  10. l.pack()
  11. mainloop()
  12. Checkbutton实现多选:选项的对齐方式使用anchor,N、NE、E、SE、S、SW、NW和CENTER 上北下南左西右东
  1. from tkinter import *
  2. root=Tk()
  3. girls=['西施','王昭君','貂蝉','杨玉环']
  4. v=[]
  5. for girl in girls:
  6. v.append(IntVar())
  7. b=Checkbutton(root,text=girl,variable=v[-1],justify=LEFT)
  8. b.pack(anchor=W)
  9. mainloop()
  1. from tkinter import *
  2. root=Tk()
  3. langs=[("python",1),("python1",2),("python2",3),("python3",4)]
  4. v=IntVar()
  5. v.set(1)
  6. for lang,num in langs:
  7. #indicatoron控制按钮形式,False为框,默认为小圆圈
  8. b=Radiobutton(root,text=lang,variable=v,value=num,indicatoron=False)
  9. b.pack(anchor=W)
  10. mainloop()
LabelFrame组件:是Frame框架的进化版,从形态上来说,就是给label添加了Frame,
  1. from tkinter import *
  2. root=Tk()
  3. group=LabelFrame(root,text='最好的脚本语言是?',padx=5,pady=5)
  4. group.pack(padx=10,pady=10)
  5. langs=[("python",1),("python1",2),("python2",3),("python3",4)]
  6. v=IntVar()
  7. v.set(1)
  8. for lang,num in langs:
  9. b=Radiobutton(group,text=lang,variable=v,value=num)
  10. b.pack(anchor=W)
  11. mainloop()
Entry组件,输入框,可以控制输入内容的合法性
  1. from tkinter import *
  2. root=Tk()
  3. e=Entry(root)
  4. e.pack(padx=20,pady=20)
  5. e.delete(0,END)
  6. e.insert(0,"默认")
  7. mainloop()
  1. from tkinter import *
  2. root=Tk()
  3. #tkinter总共提供了三种布局组件的方法,pack(),grid()和place()
  4. #pack(fill=X) X表示横向 Y表示纵向
  5. #grid()方法允许你用表格的形式来管理组件
  6. #place() relx rely
  7. #row 行,column 列
  8. Label(root,text='作品').grid(row=0)
  9. Label(root,text='作者').grid(row=1)
  10. v1=StringVar()
  11. v2=StringVar()
  12. e1=Entry(root,textvariable=v1)
  13. e2=Entry(root,textvariable=v2,show='*')
  14. e1.grid(row=0,column=1,padx=10,pady=5)
  15. e2.grid(row=1,column=1,padx=10,pady=5)
  16. def show():
  17. print("作品:《%s》"%(e1.get()))
  18. print("作者: %s"%(e2.get()))
  19. e1.delete(0,END)
  20. e2.delete(0, END)
  21. #如果表格大于组件,那么可以使用sticky选项来设置组件的位置
  22. Button(root,text='获取信息',width=10,command=show).grid(row=3,column=0,sticky=W,padx=10,pady=5)
  23. Button(root,text='退出',width=10,command=root.quit).grid(row=3,column=1,sticky=E,padx=10,pady=5)
  24. mainloop()
  25. focus:当Entry组件获得或者失去焦点的时候验证
  26. focusin 当Entry组件获得焦点的时候验证
  27. focusout 当Entry组件失去焦点
  28. key 当输入框被编辑的时候验证
  29. all 当出现上面任何一种情况的时候验证
  30. none 关闭验证功能。默认为关闭,none为字符串,而非None
  1. from tkinter import *
  2. root=Tk()
  3. def test():
  4. if e1.get()=='小甲鱼':
  5. print("正确")
  6. return True
  7. else:
  8. print("错误")
  9. e1.delete(0,END)
  10. return False
  11. #文本变量
  12. v=StringVar()
  13. #validate 验证
  14. #validatecommand 验证方法
  15. e1=Entry(root,textvariable=v,validate='focusout',validatecommand=test)
  16. e2=Entry(root)
  17. e1.pack(padx=10,pady=10)
  18. e2.pack(padx=10,pady=10)
  19. mainloop()
  1. from tkinter import *
  2. root=Tk()
  3. def test():
  4. if e1.get()=='小甲鱼':
  5. print("正确")
  6. return True
  7. else:
  8. print("错误")
  9. e1.delete(0,END)
  10. return False
  11. def test1():
  12.   print("我被调用了")
  13.   return True
  14. #文本变量
  15. v=StringVar()
  16. #validate 验证
  17. #validatecommand 验证方法
  18. e1=Entry(root,textvariable=v,validate='focusout',validatecommand=test,invalidcommand=test1)
  19. e2=Entry(root)
  20. e1.pack(padx=10,pady=10)
  21. e2.pack(padx=10,pady=10)
  22. mainloop()
  23. #validatecommand方法只有在返回值为False的时候才被调用
  24. 当你输入任何值的时候,只有把焦点转移到第二个输入框的时候,验证功能才会被触发,invalidcommand命令只有在validatecommand返回False时才能被调用。
  25. '%d' 操作代码:0表示删除操作;1表示插入操作;2表示获得、失去焦点或textvariable变量的值被修改
  26. '%i' 当用户尝试或删除操作的时候,该选项表示插入或删除的位置(索引号),如果是由于获得、失去焦点或textvaliable变量的值被修改而调用验证函数,那么该值为-1
  27. '%P' 当输入框的值允许改变的时候,该值有效,该选项表示文本被插入和删除的内容
  28. '%s' 该值为调用验证函数前输入框的文本内容
  29. '%S' 当插入或者删除操作触发验证函数的时候,该值有效
  30. 该选项表示文本被插入和删除的内容
  31. '%v' 该组件当前的validate选项的值
  32. '%V' 调用验证函数的原因,该值是focusin、focusout、key、forced中的一个
  33. '%W' 该组件的名称
  34. validatecommand=(f,s1,s2,...)
  35. f是验证函数,s1,s2,s3是额外的选项,这些参数会依次传给f函数,需要调用register()方法将验证函数包装起来.
  1. from tkinter import *
  2. root=Tk()
  3. frame=Frame(root)
  4. frame.pack(padx=10,pady=10)
  5. v1=StringVar()
  6. v2=StringVar()
  7. v3=StringVar()
  8. def test(content):
  9. if content.isdigit():
  10. return True
  11. else:
  12. return False
  13. #register将函数封装起来
  14. testCMD=root.register(test)
  15. Entry(frame,textvariable=v1,width=10,validate='key',validatecommand=(testCMD,'%P')).grid(row=0,column=0)
  16. Label(frame,text='+').grid(row=0,column=1)
  17. Entry(frame,textvariable=v2,width=10,validate='key',validatecommand=(testCMD,'%P')).grid(row=0,column=2)
  18. Label(frame,text='=').grid(row=0,column=3)
  19. Entry(frame,textvariable=v3,width=10,validate='key',validatecommand=(testCMD,'%P')).grid(row=0,column=4)
  20. def calc():
  21. result=int(v1.get())+int(v2.get())
  22. v3.set(result)
  23. Button(frame,text='计算结果',command=calc).grid(row=1,column=2,pady=5)
  24. mainloop()
Listbox组件:对于Checkbutton多选按钮和Radiobutton单选按钮,固定窗口满足不了,可以使用Listbox,配合使用insert方法
  1. from tkinter import *
  2. root=Tk()
  3. theLB=Listbox(root,setgrid=True)
  4. theLB.pack()
  5. for item in ['鸡蛋','鸭蛋','鹅蛋','李狗蛋']:
  6. theLB.insert(END,item)
  7. #ACTIVE表示特殊的索引,表示当前被选中的项目
  8. #Listbox组件根据selectmode选项提供了4种模式,SINGLE(单选),BROWSE(单选,拖到鼠标键或者方向键),MULTIPLE(多选),EXTENDED(多选,但需要同时按住Shift和Ctrl),默认是BROWSE
  9. theButton=Button(root,text='删除',command=lambda x=theLB:x.delete(ACTIVE))
  10. theButton.pack()
  11. mainloop()
  12. Scrollbar组件:为了在某一个独立的组件而存在,1、设置该组件的yscrollbarcommand选项为Scrollbar组件的set()方法:
  13. 2、设置Scrollbar组件的command选项为该组件的yview()方法 设置滚动条
  1. from tkinter import *
  2. root=Tk()
  3. sb=Scrollbar(root)
  4. sb.pack(side=RIGHT,fill=Y)
  5. lb=Listbox(root,yscrollcommand=sb.set)
  6. for i in range(1000):
  7. lb.insert(END,i)
  8. lb.pack(side=LEFT,fill=BOTH)
  9. sb.config(command=lb.yview)
  10. mainloop()
  11. Scale组件:主要是通过滑块来表示某个范围内的一个数字,可以通过修改选项,当用户输入
  1. from tkinter import *
  2. root=Tk()
  3. sb=Scrollbar(root)
  4. sb.pack(side=RIGHT,fill=Y)
  5. lb=Listbox(root,yscrollcommand=sb.set)
  6. for i in range(1000):
  7. lb.insert(END,i)
  8. lb.pack(side=LEFT,fill=BOTH)
  9. sb.config(command=lb.yview)
  10. mainloop()
  11. Text组件:用于显示和处理多行文本,主要目的是显示多行文本,也常常用为简单的文本编辑器和网页浏览器使用.不仅支持插入和编辑文本,它还支持插入image对象和window组件.
  1. from tkinter import *
  2. root=Tk()
  3. text=Text(root,width=30,height=20) #宽高设置必须大于图片实际大小
  4. text.pack()
  5. text.insert(INSERT,"I funck you")
  6. photo=PhotoImage(file=r'C:\Users\Administrator\Desktop\106\data\pic\左中右\k线图.png')
  7. def show():
  8. text.image_create(END,image=photo)
  9. b1=Button(text,text="显示K线图",command=show)
  10. text.window_create(INSERT,window=b1)
  11. mainloop()
  12. Indexes用法:用来指向Text组件中文本的位置,Text组件索引也是对应实际字符之间的位置
  13. 1、line.column:用行号和列号组成的字符串是常用的索引方式,他们将索引位置的行号和列号以字符串的形式表示出来,行号以1开始,列号以0开始. "%d.%d"%(line,column)
  14. 指定超出现有文本的最后一行的行号,或超出一行中列数的列号都不会引发错误。解释为已有内容末尾的下一个位置。也可以使用为浮点值。
  15. 2、line.end 行号加上字符串表示改行的最后一个字符。
  16. text.insert(INSERT,"I funck you")
  17. print(text.get("1.2","1.end"))
  18. 3、INSERT:对应插入光标的位置
  19. 4、CURRENT:对应与鼠标坐标最接近的位置。不过,直到松开才会生效。
  20. 5、END:对应的Text组件的文本缓冲区最后一个字符的下一个位置
  21. 6、user-defined tags:代表可以分配给Text组件的特殊事件绑定和风格。
  22. "%s.first"%tagname 使用tag的文本的第一个字符之前
  23. "%s.last"%tagname 使用tag的文本的最后一个字符之后,语法表示标签的范围
  1. Marks用法:嵌入到text组件文本中的不可见对象。Marks是指定字符间的位置,并且跟随相应的字符一起移动。其中INSERT 和CURRENT和user-defined marks
  2. tags用法:用于改变文本的字体、颜色、尺寸、SEL表示选中的内容
  3. canvas通常用于显示和编辑图像
  1. from tkinter import *
  2. import webbrowser
  3. root=Tk()
  4. w=Canvas(root,width=200,height=100)
  5. w.pack()
  6. #画一条黄色的横线
  7. line1=w.create_line(0,50,200,50,fill='yellow')
  8. #画一条红色的竖线(虚线)
  9. line2=w.create_line(100,0,100,100,fill='red',dash=(4,4))
  10. #中间画一个矩形
  11. rec1=w.create_rectangle(50,25,150,75,fill='blue')
  12. #移动线图
  13. w.coords(line1,0,25,200,25)
  14. #更改尺寸
  15. w.itemconfig(rec1,fill='red')
  16. w.delete(line2)
  17. Button(root,text='删除全部',command=(lambda x=ALL:w.delete(x))).pack()
  18. mainloop()
  1. 当需要对Canvas对象进行修改的时候,可以使用coords、itemconfig()、move()方法 来移动画布上的对象,或者使用delete()方法来删除
  2. w.create_rectangle 画框 w.create_oval 绘制椭圆或者圆形 w.create_text 编辑文本 w.create_polygon 绘制多边形
  3. w.create_arc 弧形、弦、扇形 w.create_bitmap 内建的位图文件 w.create_line 画线 w.create_window 组件
Menu组件:实现菜单功能.
  1. from tkinter import *
  2. import webbrowser
  3. root=Tk()
  4. def callback():
  5. print("被调用了....")
  6. def popup(event):
  7. menu.post(event.x_root,event.y_root)
  8. #创建一个顶级菜单
  9. menubar=Menu(root)
  10. #创建一个下拉菜单"文件",然后将它加入顶级菜单里面
  11. filemenu=Menu(menubar,tearoff=False)
  12. filemenu.add_command(label='打开',command=callback)
  13. filemenu.add_command(label='保存',command=callback)
  14. filemenu.add_separator()
  15. filemenu.add_command(label='退出',command=root.quit)
  16. menubar.add_cascade(label='文件',menu=filemenu)
  17. editmenu=Menu(menubar,tearoff=False)
  18. editmenu.add_command(label='剪切',command=callback)
  19. editmenu.add_command(label='拷贝',command=callback)
  20. editmenu.add_command(label='粘贴',command=callback)
  21. menubar.add_cascade(label='编辑',menu=editmenu)
  22. root.config(menu=menubar)
  23. frame=Frame(root,width=512,height=512)
  24. frame.pack()
  25. frame.bind("<Button -3>",popup)
  26. mainloop()
  27. #Menubutton组件 和menu组件一致,但可以放在窗口的任意位置,并且按下出现弹出窗口。
  1. from tkinter import *
  2. root=Tk()
  3. def callback():
  4. print("被调用了....")
  5. mb=Menubutton(root,text='点我',relief=RAISED)
  6. mb.pack()
  7. #创建一个顶级菜单
  8. menubar=Menu(mb,tearoff=False)
  9. #创建一个下拉菜单"文件",然后将它加入顶级菜单里面
  10. filemenu=Menu(menubar,tearoff=False)
  11. filemenu.add_checkbutton(label='打开',command=callback,selectcolor='yellow')
  12. filemenu.add_command(label='保存',command=callback)
  13. filemenu.add_separator()
  14. filemenu.add_command(label='退出',command=root.quit)
  15. mb.config(menu=filemenu)
  16. mainloop()
OptionMebu组件:下拉菜单的改进版,弥补了Listbox组件无法实现下拉列表框的遗憾。
  1. from tkinter import *
  2. options=['california','458','dfasf','dasd']
  3. root=Tk()
  4. variable=StringVar()
  5. variable.set('you are a bitch')
  6. w=OptionMenu(root, variable,*options)
  7. w.pack()
  8. def callback():
  9. print(variable.get())
  10. Button(root,text='点我',command=callback).pack()
  11. mainloop()
  12. Message组件:是Label组件的变体,用于多行文本消息显示,并且能够自动换行,调整文本尺寸使其适应给定的尺寸
  1. from tkinter import *
  2. root=Tk()
  3. w1=Message(root,text='这是一则消息',width=100)
  4. w1.pack()
  5. w2=Message(root,text='这是一则骇人听闻的长春出差吃醋尺寸长春出差',width=100)
  6. w2.pack()
  7. mainloop()
  8. Spinbox组件:是Entry组件的变体,用于从一些固定的值中选取一个。,区别:Spinbox可以通过范围或者元祖指定用户输入内容。
  1. from tkinter import *
  2. root=Tk()
  3. w=Spinbox(root,from_=0,to=10)
  4. #values可以设置显示特定的值
#w=Spinbox(root,values=("傻逼",'逗比','二逼'))
  1. w.pack()
  2. mainloop()
  3. PanedWINDOW组件:是一个空间管理组件,和Frame类似,但允许让用户调整应用程序的空间划分。
  1. from tkinter import *
  2. root=Tk()
  3. m=PanedWindow(orient=VERTICAL)
  4. m.pack(fill=BOTH,expand=1)
  5. top=Label(m,text='top pane')
  6. m.add(top)
  7. bottom=Label(m,text='bottom pane')
  8. m.add(bottom)
  9. mainloop()
  10. Toplevel组件:类似Frame组件,用在显示额外的窗口、对话框和其他弹出窗口,attributes()方法用于设置和获取窗口属性,如果给出选项名,将返回当前窗口该选项的值。注意:以下选项不支持关键字参数,需要在选项前添加横杠 并用字符串的方式表示,用逗号隔开选项和值
  1. from tkinter import *
  2. root=Tk()
  3. def create():
  4. top=Toplevel()
  5. top.title("Fishc Demo")
  6. top.attributes('-alpha',0.5)
  7. msg=Message(top,text=" fuck you")
  8. msg.pack()
  9. Button(root,text='创建顶级窗口',command=create).pack()
  10. mainloop()
  11. 事件绑定:包括用户触发的鼠标、键盘操作和窗口管理器触发的重绘事件,可以通过bind()方法将函数或者方法绑定到具体的事件上。当被触发的事件满足该组件绑定的事件时,Tkinter就会带着事件描述去调用handler()方法。
  1. from tkinter import *
  2. root=Tk()
  3. def callback(event):
  4. print("点击位置是:",event.x,event.y)
  5. frame=Frame(root,width=200,height=200)
  6. #bind是将函数绑定事件
  7. frame.bind("<Button>",callback)
  8. frame.pack()
  9. mainloop()
  10. 事件序列:使用bind()方法将具体的事件序列与自定义的方法绑定。事件序列是以字符串的形式表示的,可以表示一个或多个相关的事件。
  1. 事件序列使用语法:<modifier-type-detail>
  2. type描述普通的事件类型,比如鼠标的单击或者键盘的单击
  3. modifier 可选,通常用于描述组合键
  4. detail可选,用于描述具体的按键
  5. <Button-1> 表示用户单击鼠标左键
  6. <KeyPress-H> 表示用户按下H键
  7. <Control-Shift-KeyPress-H> 表示用户按下ctrl+shift+H
  8. -----------------------------------------------------------------------------------------------
  9. type:列举部分常用的关键词及含义:
  10. Activate 当组件的状态从未激活变成激活的时候触发该事件。
  11. Button 当用户单击鼠标按键的时候触发该事件。detail部分指定具体哪个按键:
  12. <Button-1>鼠标左键 <Button-2>鼠标中键 <Button-3> 鼠标右键 <Button-4>滚轮上滚(Linux) <Button-5>滚轮下滚
  13. ButtonRelease当用户释放鼠标按键的时候触发该事件。
  14. Configure 当组件的尺寸发生变化的时候触发该事件。
  15. Deactivate 当组件的状态从激活变成未激活的时候触发该事件。
  16. Destroy 当组件被销毁的时候触发该事件
  17. Enter 当鼠标指针进入组件的时候触发该事件。注意:不是用户按下回车键
  18. Expose 当窗口或者组件的某部分不再被覆盖的时候触发该事件
  19. FocusOut 当组件失去焦点的时候触发该事件
  20. FocusIn 当组件获得焦点的时候触发该事件
  21. KeyPress 当用户按下键盘按键的时候触发该事件
  22. Leave 当鼠标指针离开组件的时候触发该组件
  23. Map 当组件被映射的时候触发该事件
  24. Motion 当鼠标在组件内移动的整个过程均触发该事件
  25. MouseWheel 当鼠标滚动的时候触发该事件 
  1. modifier:
  2. Alt:当按下Alt按键的时候
  3. Any:表示任何类型的按键被按下的时候。<Any-KeyPress> 表示当用户按下任何按键的时候触发该事件
  4. Control:当按下Ctrl按键的时候
  5. Double:当后续两个事件被连续触发的时候。例如<Double-Button-1> 表示用户双击鼠标左键时触发该事件
  6. Lock当打开大写字母锁定键的时候(CapsLock)
  7. Shift 当按下Shift按键的时候
  8. Triple 跟Double类似,当后续三个事件被连续触发的时候
  9.  
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/761054
推荐阅读
相关标签
  

闽ICP备14008679号