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网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
Python编程中的异常处理教程
Aug 21 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
Feb 26 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
Aug 26 Python
Python 下载及安装详细步骤
Nov 04 Python
python3中TQDM库安装及使用详解
Nov 18 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
Feb 25 Python
python 递归相关知识总结
Mar 03 Python
python源文件的字符编码知识点详解
Mar 04 Python
python入门之算法学习
Apr 22 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
业余方法DIY电子管FM收音机
2021/03/02 无线电
php 动态多文件上传
2009/01/18 PHP
php后门URL的防范
2013/11/12 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
PHP多维数组排序array详解
2017/11/21 PHP
PHP实现简易计算器功能
2020/08/28 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
jquery 插件 人性化的消息显示
2008/01/21 Javascript
不要小看注释掉的JS 引起的安全问题
2008/12/27 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
js判断手机系统是android还是ios
2017/03/07 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
python 使用re.search()筛选后 选取部分结果的方法
2018/11/28 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
Python读取xlsx数据生成图标代码实例
2020/08/12 Python
销售类个人求职信范文
2013/09/25 职场文书
体育之星事迹材料
2014/05/11 职场文书
员工廉洁自律承诺书
2014/05/26 职场文书
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫