文章目录
- 消息机制
- Tkinter事件绑定
- canvas画布
消息机制
- 消息的传递机制
- 自动发送消息/事件
- 消息由系统负责发送到队列
- 有相关组件进行绑定/设置
- 后端自动选择感兴趣的事件并作出反应
- 消息格式
- >[modifier-]—type—[-detail]>
- :Button表示按钮事件,1表示鼠标左键,2表示滑轮
- :键盘A键位
- :同时按下control+shift+A键
- :
import tkinter
def baseLabel(event):
global baseFrame
print("哈哈,我被点击了")
lb = tkinter.Label(baseFrame, text="谢谢点击")
lb.pack()
baseFrame = tkinter.Tk()
lb = tkinter.Label(baseFrame, text="模拟按钮")
lb.bind("", baseLabel)
lb.pack()
baseFrame.mainloop()
Tkinter事件绑定
- bind-all:全局范围的绑定,默认的是全局快捷键,比如F1是帮助文档
- bind-class:接受三个参数,第一个类名,第二个事件,第三个是操作
- w.bind_class(“Entry”, ", my_paste)
- bind:单独对某一个实例进行绑定
- unbind:解绑,一个参数,即你要解绑那个事件
Entry
- 输入框,功能单一
- entry[“show”] = “*”, 设置遮挡字符
import tkinter
def reg():
name = e1.get()
pwd = e2.get()
t1 = len(name)
t2 = len(pwd)
if name == "111" and pwd == "222":
lb3["text"] = "登录成功"
else:
lb3['text'] = "用户名或密码错误"
e1.delete(0,t1)
e2.delete(0,t2)
baseFrame = tkinter.Tk()
lb1 = tkinter.Label(baseFrame, text="用户名")
lb1.grid(row=0, column=0, stick=tkinter.W )
e1 = tkinter.Entry(baseFrame)
e1.grid(row=0, column=1, stick=tkinter.E)
lb2 = tkinter.Label(baseFrame, text="密码: ")
lb2.grid(row=1, column=0, stick=tkinter.W )
e2 = tkinter.Entry(baseFrame)
e2.grid(row=1, column=1, stick=tkinter.E)
e2['show'] = '*'
btn = tkinter.Button(baseFrame, text="登录", command=reg)
btn.grid(row=2, column=1, stick=tkinter.E)
lb3 = tkinter.Label(baseFrame, text="")
lb3.grid(row = 3)
baseFrame.mainloop()
菜单
- 普通菜单
- 第一个Menu类定义的是parent
- add_command添加菜单项,如果菜单时顶层菜单,则从作向右添加,否则就是下拉菜单
- label:指定菜单项名称
- command:点击后相应的调用函数
- acceletor:快捷键
- underline:指定是否菜单信息下有横线
- menu:属性指定使用哪一个作为顶级菜单
import tkinter
baseFrame = tkinter.Tk()
menubar = tkinter.Menu(baseFrame)
for item in ['File', 'Edit', 'View', 'About']:
menubar.add_command(label=item)
baseFrame['menu'] = menubar
baseFrame.mainloop()
- 级联菜单
- add_casecade:级联菜单,作用就是引出后面的菜单
- menu:把菜单级联到那个菜单上
- label: 名称
- 过程:
- 建立menu实例
- add_command
- add_cascade
import tkinter
baseFrame = tkinter.Tk()
menubar = tkinter.Menu(baseFrame)
emenu = tkinter.Menu(menubar)
for item in ['Copy', 'Past', 'Cut']:
emenu.add_command(label=item)
menubar.add_cascade(label='File')
menubar.add_cascade(label='Edit', menu=emenu)
menubar.add_cascade(label='About')
baseFrame['menu'] = menubar
baseFrame.mainloop()
弹出式菜单
- 也叫上下文菜单
- 思路:
- 建立菜单并添加各种功能
- 监听鼠标右键
- 如果点击右键,则根据位置判断弹出
- 调用Menu的pop方法
- add_separator: 添加分隔符
import tkinter
def makeLabel():
global baseFrame
tkinter.Label(baseFrame, text="PHP是最好的编程语言,我用Python").pack()
baseFrame = tkinter.Tk()
menubar = tkinter.Menu(baseFrame)
for x in ['麻辣香菇', '气锅鸡', '东坡肘子']:
menubar.add_separator()
menubar.add_command(label=x)
menubar.add_command(label='重庆火锅', command=makeLabel)
def pop(event):
menubar.post(event.x_root, event.y_root)
baseFrame.bind("", pop)
baseFrame.mainloop()
canvas画布
- 画布:可以自由的在上面画的小舞台
- 在画布上绘制对象,通常用create_xxxx, xxxx=对象类型, 例如line, rectangle
- 画布的作用是把一定组件画到画布上显示出来
- 画布所支持的组件:
- arc
- bitmap
- image(BitmapImage, PhotoImage)
- line
- oval
- polygon
- rectangle
- text
- winodw(组件)
- 每次调用create_xxx都会返回一个创建的组件的ID,同时也可以用tag属性指定其标签
- 通过调用canvas.move实现一个一次性动作
import tkinter
baseFrame = tkinter.Tk()
cvs = tkinter.Canvas(baseFrame, width=300, height=200)
cvs.pack()
cvs.create_line(23,23, 190,234)
cvs.create_text(56,67, text="I LOVE PYTHON")
baseFrame.mainloop()
import tkinter
import math as m
baseFrame = tkinter.Tk()
w = tkinter.Canvas(baseFrame, width=300, height=300, background="gray" )
w.pack()
center_x = 150
center_y = 150
r = 150
points = [
center_x - int(r * m.sin(2 * m.pi / 5)),
center_y - int(r * m.cos(2 * m.pi / 5)),
center_x + int(r * m.sin(2 * m.pi / 5)),
center_y - int(r * m.cos(2 * m.pi / 5)),
center_x - int(r * m.sin( m.pi / 5)),
center_y + int(r * m.cos( m.pi / 5)),
center_x,
center_y - r,
center_x + int(r * m.sin(m.pi / 5)),
center_y + int(r * m.cos(m.pi / 5)),
]
w.create_polygon(points, outline="green", fill="yellow")
w.create_text(150,150, text="五角星")
baseFrame.mainloop()
import tkinter
baseFrame = tkinter.Tk()
def btnClick(event):
global w
w.move(id_ball, 12,5)
w.move("fall", 0,5)
w = tkinter.Canvas(baseFrame, width=500, height=400)
w.pack()
w.bind("", btnClick)
id_ball = w.create_oval(20,20, 50,50, fill="green")
w.create_text(123,56, fill="red", text="ILovePython", tag="fall")
id_rectangle = w.create_rectangle(56,78,173,110, fill="gray")
w.addtag_withtag("fall", id_rectangle)
baseFrame.mainloop()