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发送Email方法实例
Aug 21 Python
Python中的is和id用法分析
Jan 26 Python
举例讲解Python中metaclass元类的创建与使用
Jun 30 Python
python中的随机函数小结
Jan 27 Python
python实现寻找最长回文子序列的方法
Jun 02 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
正确理解Python中if __name__ == '__main__'
Jan 24 Python
python 用for循环实现1~n求和的实例
Feb 01 Python
python处理excel绘制雷达图
Oct 18 Python
python中的split()函数和os.path.split()函数使用详解
Dec 21 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
简单谈谈Python面向对象的相关知识
Jun 28 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
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
javascript带回调函数的异步脚本载入方法实例分析
2015/07/02 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
js Canvas绘制圆形时钟教程
2017/02/06 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
Vue渲染过程浅析
2019/03/14 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
python: 自动安装缺失库文件的方法
2018/10/22 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
职工小家建设活动方案
2014/08/25 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
2014年大学生工作总结
2014/11/20 职场文书
2015年度物流工作总结
2015/04/30 职场文书
长征观后感
2015/06/09 职场文书
小时代观后感
2015/06/10 职场文书
党员证明信
2015/06/19 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
python获取对象信息的实例详解
2021/07/07 Python
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers