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中实现两个字典(dict)合并的方法
Sep 23 Python
尝试用最短的Python代码来实现服务器和代理服务器
Jun 23 Python
Python实现单词翻译功能
Jun 06 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
python入门教程 python入门神图一张
Mar 05 Python
python opencv minAreaRect 生成最小外接矩形的方法
Jul 01 Python
如何使用Python破解ZIP或RAR压缩文件密码
Jan 09 Python
Python如何发送与接收大型数组
Aug 07 Python
爬虫代理的cookie如何生成运行
Sep 22 Python
Python本地及虚拟解释器配置过程解析
Oct 13 Python
Python wordcloud库安装方法总结
Dec 31 Python
python使用pymysql模块操作MySQL
Jun 16 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 连接mysql连接被重置的解决方法
2011/02/15 PHP
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
php实现修改新闻时删除图片的方法
2015/05/12 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
JavaScript中的setMilliseconds()方法使用详解
2015/06/11 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
仿百度换肤功能的简单实例代码
2016/07/11 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
docker中编译nodejs并使用nginx启动
2017/06/23 NodeJs
利用Vue实现移动端图片轮播组件的方法实例
2017/08/23 Javascript
JS基于开关思想实现的数组去重功能【案例】
2019/02/18 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
python实现简单ftp客户端的方法
2015/06/28 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
Python for循环生成列表的实例
2018/06/15 Python
python中嵌套函数的实操步骤
2019/02/27 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
会计专业的自荐信
2013/12/12 职场文书
社团活动总结
2014/04/28 职场文书
林肯就职演讲稿
2014/05/19 职场文书
消防宣传口号
2014/06/16 职场文书
会计求职简历自我评价
2015/03/10 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
西安事变观后感
2015/06/12 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
2019个人年度目标制定攻略!
2019/07/12 职场文书
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python