赞
踩
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可以通过范围或者元祖指定用户输入内容。
#w=Spinbox(root,values=("傻逼",'逗比','二逼'))
from tkinter import * root=Tk() w=Spinbox(root,from_=0,to=10) #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类似,当后续三个事件被连续触发的时候
-
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。