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 Trueelse: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 Trueelse: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 Trueelse: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类似,当后续三个事件被连续触发的时候

python tkinker库模块详解相关推荐

  1. python之sys模块详解_(转)python之os,sys模块详解

    python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...

  2. 【Python】python之subprocess模块详解

    [Python]python之subprocess模块详解 subprocess模块 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/out ...

  3. Python标准库time详解

    Python标准库time详解 1.time库 时间戳(timestamp)的方式:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量 结构化时间(struct_time ...

  4. Python的pickle模块详解(包括优缺点及和JSON的区别)

    文章目录 一.pickle是什么? 1.pickle的优缺点 2.pickle和JSON的区别 3.pickle的应用总结 二.pickle的用法 1. pickle接口 2. pickle实例 结语 ...

  5. python中logging模块详解_python logging日志模块详解

    logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...

  6. python当中时间模块详解,包括time,timeit,datatime

    目录 time 模块 -- 时间获取和转换 以下三个比较常见: time.perf_counter() time.process_time() time.sleep(secs) timeit 模块详解 ...

  7. python re正则模块详解

    一. 正则表达式 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子 ...

  8. Python的PyYAML模块详解

    文章目录 注:原文链接 简介 安装 简单安装 从源码安装 最常被问到的问题 使用详解 加载YAML 转储YAML 构造.表示和解析 YAML语法 文档 块序列 块映射 流集合 标量 别名 标签 YAM ...

  9. Python中hashlib模块详解

    文章目录 一.hashlib的简介 二.hashlib的使用 1.常用属性 2.常用方法 3.使用示例 三.hashlib的特点 四.代码实操 1.举例子 2.应用场景案例 一.hashlib的简介 ...

最新文章

  1. java.lang.NoSuchMethodError: org.apache.log4j.Logger.isTraceEnabled()Z
  2. go设计模式之代理模式
  3. 一文了解自然语言生成演变史!
  4. python 抓取“煎蛋妹子图”并分页存在本地(普通版和多线程版)
  5. 神经网络 | 网络优化-线性神经网络-delta学习规则-梯度下降法(单层感知器-异或问题Python源代码)
  6. JVM实战与原理---类加载机制
  7. Play! Framework 系列(二):play 的项目结构
  8. [react] 请描述下你对react的新特性Hooks的理解?它有哪些应用场景?
  9. 如何从Microsoft SQL Server生成C#类
  10. JMETER性能测试从入门到精通高级篇 - 分布式压测部署之负载机的设置(详解教程)
  11. 消防荷载楼板按弹性还是塑性计算_技术周刊 | 关于荷载输入若干问题的解答
  12. 国产DP1363F替代CLRC663非接触式读写器芯片
  13. Windows server资源分享
  14. 产品经理学习一(定义、分类、成员配合、调研、3D文档、竞品分析、SWOT分析)
  15. 飞天特效腾云驾雾特效手机软件制作特效视频的教程
  16. 【HANA系列】SAP 一位SAP培训顾问的建议:SAP HANA应该如何学习?
  17. RSE2021/云检测:基于小波变换和连续多尺度空间注意的上下块深度网络云检测
  18. java 二进制最大值_java int型最大值/最小值,最大值+1,最小值-1
  19. 基于medianflow的半自动标注数据程序
  20. 视频马赛克的实时检测

热门文章

  1. java调用obs直播_OBS JAVA SDK Demo:设置桶策略
  2. hpm1005能扫描不能打印_浅谈如何选购人像扫描仪
  3. 命令行方式往docker起的mysql导入sql文件
  4. 《Photoshop Lightroom5经典教程》—第1课1.7节帮助
  5. 二十不惑的年纪,竟靠着这份前端面试指南,有幸拿到字节跳动实习offer,简直在起飞
  6. 中职学校计算机课教学模式,最新中职学校计算机课程教学模式和方法探索
  7. Ural1776: Anniversary Firework(概率DP)
  8. adobe app语言_在Adobe Photoshop中设计Web App UI Kit
  9. 微信小程序-录音文件无法播放问题
  10. 用python输出12和8的最大公_32个 Python 实用函数