本文实例讲述了Python tkinter事件高级用法。分享给大家供大家参考,具体如下:
先来看看运行效果:
完整实例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
# -*- 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程序设计有所帮助。
原文链接:http://www.cnblogs.com/hhh5460/p/5188527.html