📄 floatcanvas.py
字号:
wx.GetApp().Yield(True)
Range = (-10,10)
colors = self.colors
self.BindAllMouseEvents()
Canvas = self.Canvas
Canvas.InitAll()
#
## these set the limits for how much you can zoom in and out
Canvas.MinScale = 14
Canvas.MaxScale = 500
############# Random tests of everything ##############
# Rectangles
for i in range(3):
xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
lw = random.randint(1,5)
cf = random.randint(0,len(colors)-1)
wh = (random.randint(1,5), random.randint(1,5))
Canvas.AddRectangle(xy, wh, LineWidth = lw, FillColor = colors[cf])
# Ellipses
for i in range(3):
xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
lw = random.randint(1,5)
cf = random.randint(0,len(colors)-1)
h = random.randint(1,5)
w = random.randint(1,5)
Canvas.AddEllipse(xy, (h,w), LineWidth = lw,FillColor = colors[cf])
# Points
for i in range(5):
xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
D = random.randint(1,50)
cf = random.randint(0,len(colors)-1)
Canvas.AddPoint(xy, Color = colors[cf], Diameter = D)
# SquarePoints
for i in range(500):
xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
S = random.randint(1, 50)
cf = random.randint(0,len(colors)-1)
Canvas.AddSquarePoint(xy, Color = colors[cf], Size = S)
# Circles
for i in range(5):
xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
D = random.randint(1,5)
lw = random.randint(1,5)
cf = random.randint(0,len(colors)-1)
cl = random.randint(0,len(colors)-1)
Canvas.AddCircle(xy, D, LineWidth = lw, LineColor = colors[cl], FillColor = colors[cf])
Canvas.AddText("Circle # %i"%(i), xy, Size = 12, BackgroundColor = None, Position = "cc")
# Lines
for i in range(5):
points = []
for j in range(random.randint(2,10)):
point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1]))
points.append(point)
lw = random.randint(1,10)
cf = random.randint(0,len(colors)-1)
cl = random.randint(0,len(colors)-1)
Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl])
# Polygons
for i in range(3):
points = []
for j in range(random.randint(2,6)):
point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
points.append(point)
lw = random.randint(1,6)
cf = random.randint(0,len(colors)-1)
cl = random.randint(0,len(colors)-1)
Canvas.AddPolygon(points,
LineWidth = lw,
LineColor = colors[cl],
FillColor = colors[cf],
FillStyle = 'Solid')
## Pointset
for i in range(4):
points = []
points = RandomArray.uniform(Range[0],Range[1],(100,2))
cf = random.randint(0,len(colors)-1)
D = random.randint(1,4)
Canvas.AddPointSet(points, Color = colors[cf], Diameter = D)
# Text
String = "Unscaled text"
for i in range(3):
ts = random.randint(10,40)
cf = random.randint(0,len(colors)-1)
xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
Canvas.AddText(String, xy, Size = ts, Color = colors[cf], Position = "cc")
# Scaled Text
String = "Scaled text"
for i in range(3):
ts = random.random()*3 + 0.2
cf = random.randint(0,len(colors)-1)
Point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
Canvas.AddScaledText(String, Point, Size = ts, Color = colors[cf], Position = "cc")
# Arrows
N = 5
Points = RandomArray.uniform(Range[0], Range[1], (N,2) )
for i in range(N):
Canvas.AddArrow(Points[i],
random.uniform(20,100),
Direction = random.uniform(0,360),
LineWidth = random.uniform(1,5),
LineColor = colors[random.randint(0,len(colors)-1)],
ArrowHeadAngle = random.uniform(20,90))
# ArrowLines
for i in range(5):
points = []
for j in range(random.randint(2,10)):
point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1]))
points.append(point)
lw = random.randint(1,10)
cf = random.randint(0,len(colors)-1)
cl = random.randint(0,len(colors)-1)
Canvas.AddArrowLine(points, LineWidth = lw, LineColor = colors[cl], ArrowHeadSize= 16)
Canvas.ZoomToBB()
def TestAnimation(self,event=None):
"""
In this test, a relatively complex background is drawn, and
a simple object placed in the foreground is moved over
it. This demonstrates how to use the InForeground attribute
to make an object in the foregorund draw fast, without
having to re-draw the whole background.
"""
wx.GetApp().Yield(True)
Range = (-10,10)
self.Range = Range
self.UnBindAllMouseEvents()
Canvas = self.Canvas
Canvas.InitAll()
## Random tests of everything:
colors = self.colors
# Rectangles
for i in range(3):
xy = (random.uniform(Range[0],Range[1]), random.uniform(Range[0],Range[1]))
lw = random.randint(1,5)
cf = random.randint(0,len(colors)-1)
wh = (random.randint(1,5), random.randint(1,5) )
Canvas.AddRectangle(xy, wh, LineWidth = lw, FillColor = colors[cf])
# Ellipses
for i in range(3):
xy = (random.uniform(Range[0],Range[1]), random.uniform(Range[0],Range[1]))
lw = random.randint(1,5)
cf = random.randint(0,len(colors)-1)
wh = (random.randint(1,5), random.randint(1,5) )
Canvas.AddEllipse(xy, wh, LineWidth = lw, FillColor = colors[cf])
# Circles
for i in range(5):
xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
D = random.randint(1,5)
lw = random.randint(1,5)
cf = random.randint(0,len(colors)-1)
cl = random.randint(0,len(colors)-1)
Canvas.AddCircle(xy, D, LineWidth = lw, LineColor = colors[cl], FillColor = colors[cf])
Canvas.AddText("Circle # %i"%(i), xy, Size = 12, BackgroundColor = None, Position = "cc")
# Lines
for i in range(5):
points = []
for j in range(random.randint(2,10)):
point = (random.randint(Range[0],Range[1]),random.randint(Range[0],Range[1]))
points.append(point)
lw = random.randint(1,10)
cf = random.randint(0,len(colors)-1)
cl = random.randint(0,len(colors)-1)
Canvas.AddLine(points, LineWidth = lw, LineColor = colors[cl])
# Polygons
for i in range(3):
points = []
for j in range(random.randint(2,6)):
point = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
points.append(point)
lw = random.randint(1,6)
cf = random.randint(0,len(colors)-1)
cl = random.randint(0,len(colors)-1)
Canvas.AddPolygon(points,
LineWidth = lw,
LineColor = colors[cl],
FillColor = colors[cf],
FillStyle = 'Solid')
# Scaled Text
String = "Scaled text"
for i in range(3):
ts = random.random()*3 + 0.2
cf = random.randint(0,len(colors)-1)
xy = (random.uniform(Range[0],Range[1]),random.uniform(Range[0],Range[1]))
Canvas.AddScaledText(String, xy, Size = ts, Color = colors[cf], Position = "cc")
# Now the Foreground Object:
C = Canvas.AddCircle((0,0), 7, LineWidth = 2,LineColor = "Black",FillColor = "Red", InForeground = True)
T = Canvas.AddScaledText("Click to Move", (0,0), Size = 0.6, Position = 'cc', InForeground = True)
C.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.MoveMe)
C.Text = T
self.Timer = wx.PyTimer(self.ShowFrame)
self.FrameDelay = 50 # milliseconds
Canvas.ZoomToBB()
def ShowFrame(self):
Object = self.MovingObject
Range = self.Range
if self.TimeStep < self.NumTimeSteps:
x,y = Object.XY
if x > Range[1] or x < Range[0]:
self.dx = -self.dx
if y > Range[1] or y < Range[0]:
self.dy = -self.dy
Object.Move( (self.dx,self.dy) )
Object.Text.Move( (self.dx,self.dy))
self.Canvas.Draw()
self.TimeStep += 1
wx.GetApp().Yield(True)
else:
self.Timer.Stop()
def MoveMe(self, Object):
self.MovingObject = Object
Range = self.Range
self.dx = random.uniform(Range[0]/4,Range[1]/4)
self.dy = random.uniform(Range[0]/4,Range[1]/4)
#import time
#start = time.time()
self.NumTimeSteps = 200
self.TimeStep = 1
self.Timer.Start(self.FrameDelay)
#print "Did %i frames in %f seconds"%(N, (time.time() - start) )
def TestHitTest(self, event=None):
wx.GetApp().Yield(True)
self.UnBindAllMouseEvents()
Canvas = self.Canvas
Canvas.InitAll()
#Add a Hit-able rectangle
w, h = 60, 20
dx = 80
dy = 40
x, y = 20, 20
FontSize = 10
#Add one that is not HitAble
Canvas.AddRectangle((x,y), (w, h), LineWidth = 2)
Canvas.AddText("Not Hit-able", (x,y), Size = FontSize, Position = "bl")
x += dx
R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2)
R.Name = "Line Rectangle"
R.HitFill = False
R.HitLineWidth = 5 # Makes it a little easier to hit
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
Canvas.AddText("Left Click Line", (x,y), Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
x += dx
color = "Red"
R = Canvas.AddRectangle((x, y), (w, h), LineWidth = 2, FillColor = color)
R.Name = color + "Rectangle"
R.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.RectGotHit)
Canvas.AddText("Left Click Fill", (x, y), Size = FontSize, Position = "bl")
Canvas.AddText(R.Name, (x, y+h), Size = FontSize, Position = "tl")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -