Label组件
Label(win,text='文本',justify='center)
win指定Label组件的父容器;text指定标签中的文本;justify指定标签中拥有多行文本时,最后一行文本的对齐方式。
from tkinter import *
from PIL import Image,ImageTk
root = Tk()
root.title("compound")
root.state("zoomed") #全屏
GText = "\n床前明月光,疑是地上霜\n举头望明月,低头思故乡"
G_gif = ImageTk.PhotoImage(file='h.jpg')
"""
使用Label的compound参数让文字与标签共存,compound参数设置图像的位置。
compound参数可以是下列值
left:图像在左
right:图像在右
top:图像在顶部
bottom:在下
center:文字覆盖在图像上方
"""
label = Label(root, text=GText, image = G_gif, bg='lightyellow',
compound="left", font=("simsun", 20))
label.pack()
root.mainloop()
Entry组件
Entry组件用于添加单行文本框,其特点是可以添加少量文字
from tkinter import *
from PIL import Image,ImageTk
win=Tk()
win.configure(bg='lightyellow')
user=ImageTk.PhotoImage(file='h.jpg')
Label(win,text='用户账号',font=14,image=user).grid(pady=10,row=0,column=0)
Entry(win).grid(row=0,column=1)
password=ImageTk.PhotoImage(file='h.png')
Label(win,text='密码',font=14,image=password).grid(pady=10,row=1,column=0)
# Entry组件中,可以通过show参数将用户输入的内容隐藏起来,并且显示为用户指定的字符
entry=Entry(win,show='*')
entry.grid(row=1,column=1)
"""
Entry组件提供了三种方法,分别是get()、insert()和delete()方法,通过这三种方法可以实现获取、插入及删除文本框组件中内容的功能
"""
# 使用insert()在文本框的指定位置添加内容
entry.insert(INSERT,'password123')
# 使用delete()删除文本框中指定内容
def back():
length=len(entry.get()) #获取文本框的内容的长度
entry.delete(0,END)
def show():
str=entry.get() #获取文本框的内容
print('密码',str)
Button(win,text='显示',command=show).grid(row=1,column=2) #定义一个按钮
Button(win,text='清除',command=back).grid(row=1,column=3)
win.mainloop()
from tkinter import *
from PIL import Image,ImageTk
win=Tk()
win.configure(bg='lightyellow')
def add():
re.delete(0,END)
add1=int(op1.get())
add2=int(op2.get())
re.insert(INSERT,add1+add2)
op1=Entry(win,width=5)
op1.grid(row=0,pady=20)
Label(win,text='+').grid(row=0,column=1)
op2=Entry(win,width=5)
op2.grid(row=0,column=2)
Label(win,text='=').grid(row=0,column=3)
re=Entry(win,width=5)
re.grid(row=0,column=4)
Button(win,text='计算',command=add).grid(row=1,column=5)
win.mainloop()
Text组件
Text组件内可以输入多行文本,当文本内容较多时,它可以自动换行。事实上,Text组件中不仅可以放置纯文本,还可以添加图片、按钮
from tkinter import *
from PIL import Image,ImageTk
i=0
def show():
global i
i+=1
label.config(text='你点了我\t'+str(i)+'下')
win=Tk()
win.configure(bg='lightyellow')
text=Text(win,width=45,height=10,bg='lightyellow',relief='solid') #创建多行文本框
photo=ImageTk.PhotoImage(file='h.jpg') #创建一个图象对象
text.image_create(END,image=photo) #text中插入图片
text.insert(INSERT,'在这里添加文本') #添加文本
text.pack()
bt=Button(win,text='你点我试试',command=show,padx=10) #创建一个按钮
label=Label(win,padx=10,text='你点了我0下')
"""
Text组件提供了index()方法,用于指向Text组件中文本的位置,
它与Python的序列索引一样,也是对应实际字符之间的位置。
Text组件中,文本的索引值通常为字符串类型,并且指定Text索引的方式有多种,
下面列举常见的几种方式:
☑ line.column:这种方式将索引位置的行号和列号以字符串的形式表示出来,并且中间以“.”分隔,例如“2.3”表示第2行第4列。
☑ insert:插入光标的位置。
☑ end:最后一个字符的位置,如果字符串为“end”,表示所有文本的最后一个字符位置;
如果字符串为“line.end”,就表示第line行的最后一个字符位置。
☑+count chars:指定位置向后移动count个字符。例如“2.1+2 chars”表示第2行第4个字符的位置。
☑-count chars:指定位置向前移动count个字符。例如“2.3-2 chars”表示第2行第2个字符的位置。
"""
text.window_create('2.1',window=bt) #将按钮放在text中
text.window_create('2.2',window=label)
print(text.get(1.1,1.9))
win.mainloop()
from tkinter import *
win=Tk()
def undo1(event):
text.edit_undo() #撤销之前的操作
def redo1(enent):
text.edit_redo()
def callback(event):
print('hh')
text.edit_separator() #单击一次键盘就加一个分割线
text=Text(win,width=50,height=30,undo=True,autoseparators=False)
text.pack()
text.insert(INSERT,'在下方添加文本,通过键盘 <ctrl+z>撤销操作 和<ctrl+y回复操作\n\n>')
text.bind('<Key>',callback)
text.bind('<Control-Z>',undo1)
text.bind('<Control-Y>',redo1) #按下组合键执行操作
win.mainloop()
Spinbox组件
Spinbox组件不仅可以添加文本,还可以在给定的值中选择一个
from tkinter import *
win=Tk()
win.title('购买道具')
Label(win,text='购买道具:').grid(row=0,column=0,pady=10)
#通过元组定义可以选择的值
Spinbox(win,values=('绿水晶','红宝石','生命水')).grid(row=0,column=1,pady=10)
Label(win,text='购买数量').grid(row=1,column=0,pady=10)
#通过from_to 定义可选的数值范围
Spinbox(win,from_=1,to=5).grid(row=1,column=1,pady=10)
Label(win,text='限购5件').grid(row=1,column=1,pady=10)
Label(win,text='支付方式').grid(row=2,column=1,pady=10)
Spinbox(win,values=('金币','钻石','点券')).grid(row=2,column=1,pady=10)
win.mainloop()
from tkinter import *
win=Tk()
win.title('留言本')
def show():
info.insert('insert','\t时间:{}月{}日{}\n'.format(spmon.get(),spdat.get(),spwek.get()))
print(info.get('1.0',END))
mess=Label(win,text='请添加你的留言').grid(row=0,column=0,columnspan=5,pady=10)
spmon=Spinbox(win,from_=1,to=12,width=10) #选择月份
spmon.grid(row=1,column=0,pady=10)
mon=Label(win,text='月').grid(row=1,column=1,pady=10)
spdat=Spinbox(win,from_=1,to=30,width=10) #选择日期
spdat.grid(row=1,column=2,pady=10)
dat=Label(win,text='日').grid(row=1,column=3,pady=10)
spwek=Spinbox(win,values=('星期一','星期二','星期三','星期四','星期五','星期六','星期日'))
spwek.grid(row=1,column=5,columnspan=3,pady=10)
info=Text(win,bg='lightyellow',width=50,height=10)
get1=Button(win,text='提交',command=show).grid(row=3,columnspan=10)
info.grid(row=2,columnspan=10)
win.mainloop()
Scale组件
Scale组件可以规定数值范围,用户只需要拖动滑块就可以选择数值
from tkinter import *
win=Tk()
num=0
def up1():
if scale1.get()<50:
val=scale1.get()+1
scale1.set(val)
num=val*5
txt.config(text='爱心暴击'+str(num))
def down1():
if scale1.get()>0:
val=scale1.get()-1
scale1.set(val)
num=val*5
txt.config(text='爱心暴击'+str(num))
def hit(widget):
num=scale1.get()*5
txt.config(text='爱心暴击'+str(num))
txt=Label(text='爱心暴击+0')
txt.pack(side=TOP)
btndown=Button(win,text='-',command=down1,width=2).pack(side='left')
# from_和to表示数值范围,resolution=1表示每次滑块移动增加或减小1
"""
win为指定的父容器;form_和to指定Scale组件中值的范围,其中from_为最小值,to为最大值;
resolution定义滑块每次更改的数值;
orient定义组件垂直显示或水平显示,若值为HORIZONTAL,表示水平显示,若值为VERTICAL,表示垂直显示
"""
scale1=Scale(win,from_=0,to=50,resolution=1,orient=HORIZONTAL,showvalue=0,command=hit)
scale1.pack(side='left')
btnup=Button(win,text='+',command=up1,width=2).pack(side='left')
win.mainloop()