zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    [基础规范]JavaBeans规范
    leetcode 114.Flatten Binary Tree to Linked List (将二叉树转换链表) 解题思路和方法
    sql 分组取每组的前n条或每组的n%(百分之n)的数据
    D3js-API介绍【中】
    微信公众平台开发 一 账号类别与申请
    Apple Swift编程语言新手教程
    iOS中xib与storyboard原理,与Android界面布局的异同
    Scala入门到精通——第十五节 Case Class与模式匹配(二)
    使用IDA破解TraceMe.exe
    21行python代码实现拼写检查器
  • 原文地址:https://www.cnblogs.com/hhh5460/p/5188527.html
Copyright © 2011-2022 走看看