Python tkinter事件高级用法实例


Posted in Python onJanuary 31, 2018

本文实例讲述了Python tkinter事件高级用法。分享给大家供大家参考,具体如下:

先来看看运行效果:

Python tkinter事件高级用法实例

完整实例代码:

# -*- coding:utf-8-*-
#! python3
from tkinter import *
import threading, time
trace = 0
class CanvasEventsDemo:
  def __init__(self, parent=None):
    canvas = Canvas(width=300, height=300, bg='beige')
    canvas.pack()
    canvas.bind('<ButtonPress-1>', self.onStart)   # click
    canvas.bind('<B1-Motion>',   self.onGrow)    # and drag
    canvas.bind('<Double-1>',   self.onClear)   # delete all
    canvas.bind('<ButtonPress-3>', self.onMove)    # move latest
    self.canvas = canvas
    self.drawn = None
    self.kinds = [canvas.create_oval, canvas.create_rectangle]
  def onStart(self, event):
    self.shape = self.kinds[0]
    self.kinds = self.kinds[1:] + self.kinds[:1]   # start dragout
    self.start = event
    self.drawn = None
  def onGrow(self, event):               # delete and redraw
    canvas = event.widget
    if self.drawn: canvas.delete(self.drawn)
    objectId = self.shape(self.start.x, self.start.y, event.x, event.y)
    if trace: print(objectId)
    self.drawn = objectId
  def onClear(self, event):
    event.widget.delete('all')            # use tag all
  def onMove(self, event):
    if self.drawn:                  # move to click spot
      if trace: print(self.drawn)
      canvas = event.widget
      diffX, diffY = (event.x - self.start.x), (event.y - self.start.y)
      canvas.move(self.drawn, diffX, diffY)
      self.start = event
class CanvasEventsDemoTags(CanvasEventsDemo):
  def __init__(self, parent=None):
    CanvasEventsDemo.__init__(self, parent)
    self.canvas.create_text(100, 8, text='Press o and r to move shapes')
    self.canvas.master.bind('<KeyPress-o>', self.onMoveOvals)
    self.canvas.master.bind('<KeyPress-r>', self.onMoveRectangles)
    self.kinds = self.create_oval_tagged, self.create_rectangle_tagged
  def create_oval_tagged(self, x1, y1, x2, y2):
    objectId = self.canvas.create_oval(x1, y1, x2, y2)
    self.canvas.itemconfig(objectId, tag='ovals', fill='blue')
    return objectId
  def create_rectangle_tagged(self, x1, y1, x2, y2):
    objectId = self.canvas.create_rectangle(x1, y1, x2, y2)
    self.canvas.itemconfig(objectId, tag='rectangles', fill='red')
    return objectId
  def onMoveOvals(self, event):
    print('moving ovals')
    self.moveInSquares(tag='ovals')      # move all tagged ovals
  def onMoveRectangles(self, event):
    print('moving rectangles')
    self.moveInSquares(tag='rectangles')
  def moveInSquares(self, tag):         # 5 reps of 4 times per sec
    for i in range(5):
      for (diffx, diffy) in [(+20, 0), (0, +20), (-20, 0), (0, -20)]:
        self.canvas.move(tag, diffx, diffy)
        self.canvas.update()       # force screen redraw/update
        time.sleep(0.25)         # pause, but don't block gui
class CanvasEventsDemoThread(CanvasEventsDemoTags):
  def moveEm(self, tag):
    for i in range(5):
      for (diffx, diffy) in [(+20, 0), (0, +20), (-20, 0), (0, -20)]:
        self.canvas.move(tag, diffx, diffy)
        time.sleep(0.25)           # pause this thread only
  def moveInSquares(self, tag):
    threading.Thread(self.moveEm, (tag,)).start()
if __name__ == '__main__':
  CanvasEventsDemoThread()
  mainloop()

更多关于Python相关内容可查看本站专题:《Python数学运算技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中的zipfile模块使用详解
Jun 25 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
Apr 11 Python
python中字符串比较使用is、==和cmp()总结
Mar 18 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
python 三元运算符使用解析
Sep 16 Python
python3图片文件批量重命名处理
Oct 31 Python
Python FFT合成波形的实例
Dec 04 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 Python
pip安装tensorflow的坑的解决
Apr 19 Python
Python 实现二叉查找树的示例代码
Dec 21 Python
Python深度学习之实现卷积神经网络
Jun 05 Python
Python NumPy灰度图像的压缩原理讲解
Aug 04 Python
pyqt5自定义信号实例解析
Jan 31 #Python
Python使用flask框架操作sqlite3的两种方式
Jan 31 #Python
pyqt5简介及安装方法介绍
Jan 31 #Python
Python实现的圆形绘制(画圆)示例
Jan 31 #Python
Python Json序列化与反序列化的示例
Jan 31 #Python
Python实现JSON反序列化类对象的示例
Jan 31 #Python
python删除过期log文件操作实例解析
Jan 31 #Python
You might like
php用正则表达式匹配URL的简单方法
2013/11/12 PHP
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
js相册效果代码(点击创建即可)
2013/04/16 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
关于vue项目中搜索节流的实现代码
2019/09/17 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
2019/09/23 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
九步学会Python装饰器
2015/05/09 Python
python 列表,数组和矩阵sum的用法及区别介绍
2018/06/28 Python
python实现弹跳小球
2019/05/13 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
python实现一个猜拳游戏
2020/04/05 Python
如何使用scrapy中的ItemLoader提取数据
2020/09/30 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
波兰在线运动商店:YesSport
2020/07/23 全球购物
高三自我鉴定怎么写
2013/10/19 职场文书
设计总监岗位职责
2013/12/07 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
2015年小学生新年寄语
2014/12/08 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS