码迷,mamicode.com
首页 > 其他好文 > 详细

tkinter事件高级用法实例

时间:2016-02-14 06:50:09      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

 

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(75, 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()

 

tkinter事件高级用法实例

标签:

原文地址:http://www.cnblogs.com/hhh5460/p/5188527.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!