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运行时间的几种方法
Jun 17 Python
Python中文件I/O高效操作处理的技巧分享
Feb 04 Python
MySQL适配器PyMySQL详解
Sep 20 Python
Python及Django框架生成二维码的方法分析
Jan 31 Python
python正则表达式之对号入座篇
Jul 24 Python
Linux CentOS Python开发环境搭建教程
Nov 28 Python
使用python对文件中的数值进行累加的实例
Nov 28 Python
python学生管理系统的实现
Apr 05 Python
python异步Web框架sanic的实现
Apr 27 Python
python删除指定列或多列单个或多个内容实例
Jun 28 Python
利用python对mysql表做全局模糊搜索并分页实例
Jul 12 Python
python 解决微分方程的操作(数值解法)
May 26 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读取msn上的用户信息类
2008/12/05 PHP
php中去除所有js,html,css代码
2010/10/12 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
2014/11/06 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
vue接口请求加密实例
2020/08/11 Javascript
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
linecache模块加载和缓存文件内容详解
2018/01/11 Python
django文档学习之applications使用详解
2018/01/29 Python
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
C#可否对内存进行直接的操作
2015/02/26 面试题
科研先进个人典型材料
2014/01/31 职场文书
学校文明单位申报材料
2014/05/06 职场文书
应届毕业生求职信范文
2014/05/08 职场文书
爱心捐书倡议书
2015/04/27 职场文书
家长会主持词开场白
2015/05/29 职场文书
会计做账心得体会
2016/01/22 职场文书
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python
nginx配置之并发频次限制
2022/04/18 Servers