Tkinter中的消息机制、事件绑定、菜单和canvas画布

文章目录

      • 消息机制
      • Tkinter事件绑定
        • Entry
        • 菜单
        • 弹出式菜单
      • 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="模拟按钮")

# label绑定相应的消息和处理函数
# 自动获取左键点击,并启动相应的处理函数baseLabel
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'] = "用户名或密码错误"
        # 输入框删除掉用户输入的内容
        # 注意delete的两个参数,表示从第几个删除到第几个
        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'] = '*'

# Button参数command的意思是,当按钮被点击后启动相应的处理函数
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)
# 启动主Frame
baseFrame.mainloop()

菜单

  1. 普通菜单
  • 第一个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()
  1. 级联菜单
  • 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):
    # 注意使用 event.x 和 event.x_root的区别 
    #menubar.post(event.x_root, event.y_root)
    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()

# 一条线需要两个点指明起始
# 参数数字的单位是px
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 = [
        #左上点
        # pi是一个常量数字,3.1415926
        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
id_ball  = w.create_oval(20,20, 50,50, fill="green")
# 创建组件使用tag属性
w.create_text(123,56, fill="red", text="ILovePython", tag="fall")
# 创建的时候如果没有指定tag可以利用addtag_withtag添加
# 同类函数还有 addtag_all, addtag_above, addtag_xxx等等
id_rectangle = w.create_rectangle(56,78,173,110, fill="gray")
w.addtag_withtag("fall", id_rectangle)
baseFrame.mainloop()

你可能感兴趣的:(Python全栈学习)