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之编写类之一创建实例
Oct 11 Python
python实现超简单端口转发的方法
Mar 13 Python
python执行子进程实现进程间通信的方法
Jun 02 Python
Python自动调用IE打开某个网站的方法
Jun 03 Python
Python探索之爬取电商售卖信息代码示例
Oct 27 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
Python中使用遍历在列表中添加字典遇到的坑
Feb 27 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
Aug 15 Python
Python基于Twilio及腾讯云实现国际国内短信接口
Jun 18 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
Oct 27 Python
python基础之匿名函数详解
Apr 21 Python
Python闭包的定义和使用方法
Apr 11 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 中的输出缓冲
2006/12/21 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
2013/10/26 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
Javascript var变量隐式声明方法
2009/10/19 Javascript
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
详细解读Jquery各Ajax函数($.get(),$.post(),$.ajax(),$.getJSON())
2016/08/15 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
实例详解vue中的$root和$parent
2019/04/29 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
Python selenium 三种等待方式解读
2016/09/15 Python
深入理解python对json的操作总结
2017/01/05 Python
深入理解Python中的super()方法
2017/11/20 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
python机器学习实现决策树
2019/11/11 Python
python 实现超级玛丽游戏
2020/11/25 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
自荐信格式的六要素
2013/09/21 职场文书
水利学院求职自荐书
2014/02/01 职场文书
开学寄语大全
2014/04/08 职场文书
房屋出租协议书
2014/04/10 职场文书
优秀团员自我评价范文
2014/04/23 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书