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()
  • 相关阅读:
    2-2. 线性池技术优化
    2-1. 基于OpenSSL的传输子系统实现
    1-4. 嵌入式web服务器BOA的移植及应用
    1-3. Linux下移动图像监测系统——motion的移植及应用
    1-2. 摄像头驱动的使能配置、V4L2编程接口的设计应用
    1-1. OSS/ALSA 声卡的驱动与配置和 Madplay 嵌入式播放器的移植
    嵌入式Linux开发环境搭建,问题ping、nfs的解决
    并发服务器的设计
    WPF 子类访问主类(父类)MainWindow的属性和方法
    stm32 读取多路SDADC
  • 原文地址:https://www.cnblogs.com/hhh5460/p/5188527.html
Copyright © 2011-2022 走看看