canvas画布
canvas (画布)是一个矩形区域,可以放置图形、图像、组件等。
#coding:gbk
import random
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.createWidget()
def createWidget(self):
"""创建登录界面的组件"""
self.canvas=Canvas(self,width=300,height=200,bg="green")
self.canvas.pack()
#画一条直线
line=self.canvas.create_line(10,10,30,20,40,50)
#画一个矩形
rect=self.canvas.create_rectangle(50,50,100,100)
#画一个椭圆形,坐标为椭圆的边界矩形左上角和底部右下角
oval=self.canvas.create_oval(50,50,100,100)
global photo
photo=PhotoImage(file="pikaqiu.gif")
self.canvas.create_image(150,170,image=photo)
Button(self,text="画10个矩形",command=self.draw50Recg).pack(side="left")
def draw50Recg(self):
for i in range(0,10):
x1=random.randrange(int(self.canvas["width"])/2)
y1 = random.randrange(int(self.canvas["height"]) / 2)
x2= x1 + random.randrange(int(self.canvas["width"])/2)
y2=y1+random.randrange(int(self.canvas["height"]) / 2)
self.canvas.create_rectangle(x1,y1,x2,y2)
if __name__=='__main__':
root=Tk()
root.geometry("400x200+200+300")
app=Application(master=root)
root.mainloop()
布局管理器
一个GUI应用程序必然有大量的组件,津些组件如何排布?这时候,就需要使用tkinter提供的布局管理器帮助我们组织、管理在父组件中子组件的布局方式。tkinter提供了三种管理器: pack、 grid、 place.
grid表示表格布局,采用表格结构组织组件。子组件的位置由行和列的单元格来确定,并且可以跨行和跨列进行操作。
#coding:gbk
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.createWidget()
def createWidget(self):
self.label01=Label(self,text="用户名")
self.label01.grid(row=0,column=0)
self.entry01=Entry(self)
self.entry01.grid(row=0,column=1)
Label(self,text="用户名为手机号").grid(row=0,column=2)
Label(self,text="密码").grid(row=1,column=0)
Entry(self,show="*").grid(row=1,column=1)
Button(self,text="登录").grid(row=2,column=1,sticky=EW)
Button(self,text="取消").grid(row=2,column=2,sticky=E)
if __name__=='__main__':
root=Tk()
root.geometry("400x200+200+300")
app=Application(master=root)
root.mainloop()
通过grid实现计算器界面
#coding:utf-8
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.createWidget()
def createWidget(self):
btnText=(("MC","M+","M-","MR"),
("C","±","÷","×"),
(7,8,9,"-"),
(4,5,6,"+"),
(1,2,3,"="),
(0,".",))
Entry(self).grid(row=0,column=0,columnspan=4,pady=10)
for rindex,r in enumerate(btnText):
for cindex,c in enumerate(r):
if c=="=":
Button(self,text=c,width=2).grid(row=rindex+1,column=cindex,rowspan=2,sticky=NSEW)
elif c==0:
Button(self,text=c,width=2).grid(row=rindex+1,column=cindex,columnspan=2,sticky=NSEW)
elif c==".":
Button(self,text=c,width=2).grid(row=rindex+1,column=cindex+1,sticky=NSEW)
else:
Button(self,text=c,width=2).grid(row=rindex+1,column=cindex,sticky=NSEW)
if __name__=='__main__':
root=Tk()
root.geometry("200x200+200+300")
app=Application(master=root)
root.mainloop()
pack布局管理器
pack按照组件的创建顺序将子组件添加到父组件中,按照垂直或者水平的方向自然排布。如果不指定任何选项,默认在父组件中自顶向下垂直添加组件。
pack是代码量最少,最简单的一种,可以用于快速生成界面.
#coding:utf-8
#测试pack布局管理
from tkinter import *
root=Tk();root.geometry("700x220")
#Frame是一个矩形区域,就是用来放置其他子组件
f1=Frame(root);f1.pack()
f2=Frame(root);f2.pack()
btnText=("流行风","中国风","日本风","重金属","轻音乐")
for txt in btnText:
Button(f1,text=txt).pack(side="left",padx="10")
for i in range(1,20):
Label(f2,width=5,height=10,borderwidth=1,relief="solid",
bg="black" if i %2==0 else"white").pack(side="left",padx=2)
root.mainloop()
place布局管理器
可以通过坐标精确控制组件的位置。
事件处理
#coding:gbk
from tkinter import *
root=Tk();root.geometry("530x300")
c1=Canvas(root,width=200,height=200,bg="green")
c1.pack()
def mouseTest(event):
print("鼠标左键单击位置(相对于父容器):{0},{1}".
format(event.x,event.y))
print("鼠标左键单击位置(相对于屏幕):{0},{1}".
format(event.x_root, event.y_root))
print("事件绑定的组件:{0}".format(event.widget))
def testDrag(event):
c1.create_oval(event.x,event.y,event.x+1,event.y+1)#相当于在画一个个椭圆
def keyboardTest(event):
print("键的keycode:{0},键的char:{1},键的keysym:{2}"
.format(event.keycode,event.char,event.keysym))
def press_a_test(event):
print("press a")
def relase_a_test(event):
print("relase a ")
c1.bind("<Button-1>",mouseTest)
c1.bind("<B1-Motion>",testDrag)
root.bind("<KeyPress>",keyboardTest)
root.bind("<KeyPress-a>",press_a_test)
root.bind("<KeyRelease-a>",relase_a_test)
root.mainloop()
lambda表达式
lambda表达式定义的是一个匿名函数,只适合简单输入参数,简单计算返回结果,不适合功能复杂情况。
语法格式:
lambda 参数值列表:表达式
scale滑块
#coding:gbk
from tkinter import *
root=Tk()
root.geometry("400x200")
v=StringVar(root)
v.set("你喜欢的人")
om=OptionMenu(root,v,"ssl","lyh","zyq")
om["width"]=10
om.pack()
def test1():
print("你喜欢的人",v.get())
Button(root,text="确定",command=test1).pack()
root.mainloop()
#coding:gbk
from tkinter import *
root=Tk()
root.geometry("400x200")
def test1(value):
print("滑块的值",value)
newFont=("宋体",value)
a.config(font=newFont)
s1=Scale(root,from_=10,to=50,length=200,tickinterval=5,orient=HORIZONTAL
,command=test1)
s1.pack()
a=Label(root,text="jxlg",width=10,height=1,bg="black",fg="white")
a.pack()
root.mainloop()