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 正则表达式(转义问题)
Dec 15 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
Mar 31 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
Django contenttypes 框架详解(小结)
Aug 13 Python
python实现多进程代码示例
Oct 31 Python
Python设计模式之简单工厂模式实例详解
Jan 22 Python
elasticsearch python 查询的两种方法
Aug 04 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
PyTorch-GPU加速实例
Jun 23 Python
Python字符串三种格式化输出
Sep 17 Python
python 对一幅灰度图像进行直方图均衡化
Oct 27 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截取指定2个字符之间字符串的方法
2015/04/15 PHP
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
详解JavaScript语法对{}处理的坑爹之处
2014/06/05 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
node.js从数据库获取数据
2016/05/08 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
vuejs如何配置less
2017/04/25 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
vue项目接口域名动态获取操作
2020/08/13 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python XlsxWriter模块创建aexcel表格的实例讲解
2018/05/03 Python
利用python求积分的实例
2019/07/03 Python
德国家具折扣店:POCO
2020/02/28 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
一些.net面试题
2014/10/06 面试题
心理健康教育制度
2014/01/27 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
2014坚持党风廉政建设思想汇报
2014/09/18 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
2015民办小学年度工作总结
2015/05/26 职场文书
2016年会开场白台词
2015/06/01 职场文书
2015年物流客服工作总结
2015/07/27 职场文书
大学生就业指导课心得体会
2016/01/15 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
Win11 21h2可以升级22h2吗?看看你的电脑符不符合要求
2022/07/07 数码科技