• tkinter事件高级用法实例


    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()
  • 相关阅读:
    vba 填写 Workbok 名片
    VBA 插入和删除工作表
    VBA for each 循环语句
    VBA 中的各种循环
    VBA 的 Join 函数
    VBA 计算数组的最大索引和最小索引
    VBA 变量赋值
    VBA 声明变量
    观察样本的变异程度
    python 将数据写入 Excel 表格
  • 原文地址:https://www.cnblogs.com/hhh5460/p/5188527.html
Copyright © 2020-2023  润新知