📄 plot3.py
字号:
from Tkinter import *
from Canvas import Line, CanvasText, Rectangle
import string, math
from utils import *
from math import pi
import Pmw
class GraphPoints:
def __init__(self, points, attr):
self.points = points
self.scaled = self.points
self.attributes = {}
for name, value in self._attributes.items():
try:
value = attr[name]
except KeyError: pass
self.attributes[name] = value
def boundingBox(self):
return minBound(self.points), maxBound(self.points)
def fitToScale(self, scale=(1,1), shift=(0,0)):
self.scaled = []
for x,y in self.points:
self.scaled.append((scale[0]*x)+shift[0],
(scale[1]*y)+shift[1])
self.attributes.get('anchor', 0.0)
self.anchor = scale[1]*self.attributes.get('anchor', 0.0)\
+ shift[1]
class GraphLine(GraphPoints):
def __init__(self, points, **attr):
GraphPoints.__init__(self, points, attr)
_attributes = {'color': 'black',
'width': 1,
'smooth': 0,
'splinesteps': 12}
def draw(self, canvas, multi):
color = self.attributes['color']
width = self.attributes['width']
smooth = self.attributes['smooth']
steps = self.attributes['splinesteps']
arguments = (canvas,)
if smooth:
for i in range(len(self.points)):
x1, y1 = self.scaled[i]
arguments = arguments + (x1, y1)
else:
for i in range(len(self.points)-1):
x1, y1 = self.scaled[i]
x2, y2 = self.scaled[i+1]
arguments = arguments + (x1, y1, x2, y2)
apply(Line, arguments, {'fill': color, 'width': width,
'smooth': smooth,
'splinesteps': steps})
class GraphSymbols(GraphPoints):
def __init__(self, points, **attr):
GraphPoints.__init__(self, points, attr)
_attributes = {'color': 'black',
'width': 1,
'fillcolor': 'black',
'size': 2,
'fillstyle': '',
'outline': 'black',
'marker': 'circle'}
def draw(self, canvas, multi):
color = self.attributes['color']
size = self.attributes['size']
fillcolor = self.attributes['fillcolor']
marker = self.attributes['marker']
fillstyle = self.attributes['fillstyle']
self._drawmarkers(canvas, self.scaled, marker, color,
fillstyle, fillcolor, size)
def _drawmarkers(self, c, coords, marker='circle', color='black',
fillstyle='', fillcolor='', size=2):
l = []
f = eval('self._' +marker)
for xc, yc in coords:
id = f(c, xc, yc, outline=color, size=size,
fill=fillcolor, fillstyle=fillstyle)
if type(id) is type(()):
for item in id: l.append(item)
else:
l.append(id)
return l
def _circle(self, c, xc, yc, size=1, fill='', outline='black',
fillstyle=''):
id = c.create_oval(xc-0.5, yc-0.5, xc+0.5, yc+0.5,
fill=fill, outline=outline,
stipple=fillstyle)
c.scale(id, xc, yc, size*5, size*5)
return id
def _dot(self, c, xc, yc, size=1, fill='', outline='black',
fillstyle=''):
id = c.create_oval(xc-0.5, yc-0.5, xc+0.5, yc+0.5,
fill=fill, outline=outline,
stipple=fillstyle)
c.scale(id, xc, yc, size*2.5, size*2.5)
return id
def _square(self, c, xc, yc, size=1, fill='', outline='black',
fillstyle=''):
id = c.create_rectangle(xc-0.5, yc-0.5, xc+0.5, yc+0.5,
fill=fill, outline=outline,
stipple=fillstyle)
c.scale(id, xc, yc, size*5, size*5)
return id
def _triangle(self, c, xc, yc, size=1, fill='', outline='black',
fillstyle=''):
id = c.create_polygon(-0.5, 0.288675134595,
0.5, 0.288675134595,
0.0, -0.577350269189, fill=fill,
outline=outline, stipple=fillstyle)
c.move(id, xc, yc)
c.scale(id, xc, yc, size*5, size*5)
return id
def _triangle_down(self, c, xc, yc, size=1, fill='',
outline='black', fillstyle=''):
id = c.create_polygon(-0.5, -0.288675134595,
0.5, -0.288675134595,
0.0, 0.577350269189, fill=fill,
outline=outline, stipple=fillstyle)
c.move(id, xc, yc)
c.scale(id, xc, yc, size*5, size*5)
return id
def _cross(self, c, xc, yc, size=1, fill='black', outline=None,
fillstyle=''):
if outline: fill=outline
id1 = c.create_line(xc-0.5, yc-0.5, xc+0.5, yc+0.5,
fill=fill)
id2 = c.create_line(xc-0.5, yc+0.5, xc+0.5, yc-0.5,
fill=fill)
c.scale(id1, xc, yc, size*5, size*5)
c.scale(id2, xc, yc, size*5, size*5)
return id1, id2
def _plus(self, c, xc, yc, size=1, fill='black', outline=None,
fillstyle=''):
if outline: fill=outline
id1 = c.create_line(xc-0.5, yc, xc+0.5, yc, fill=fill)
id2 = c.create_line(xc, yc+0.5, xc, yc-0.5, fill=fill)
c.scale(id1, xc, yc, size*5, size*5)
c.scale(id2, xc, yc, size*5, size*5)
return id1, id2
class GraphBars(GraphPoints):
def __init__(self, points, **attr):
GraphPoints.__init__(self, points, attr)
_attributes = {'color': 'black',
'width': 1,
'fillcolor': 'yellow',
'size': 3,
'fillstyle': '',
'outline': 'black'}
def draw(self, canvas, multi):
color = self.attributes['color']
width = self.attributes['width']
fillstyle = self.attributes['fillstyle']
outline = self.attributes['outline']
spread = self.attributes['size']
arguments = (canvas,)
p1, p2 = self.boundingBox()
for i in range(len(self.points)):
x1, y1 = self.scaled[i]
canvas.create_rectangle(x1-spread, y1, x1+spread,
self.anchor, fill=color,
width=width, outline=outline,
stipple=fillstyle)
class GraphPie(GraphPoints):
def __init__(self, points, **attr):
GraphPoints.__init__(self, points, attr)
_attributes = {'color': 'black',
'width': 1,
'fillcolor': 'yellow',
'size': 2,
'fillstyle': '',
'outline': 'black'}
def draw(self, canvas, multi):
width = self.attributes['width']
fillstyle = self.attributes['fillstyle']
outline = self.attributes['outline']
colors = Pmw.Color.spectrum(len(self.scaled))
arguments = (canvas,)
x1 = string.atoi(canvas.cget('width'))
y1 = string.atoi(canvas.cget('height'))
adj = 0
if multi: adj = 15
xy = 25+adj, 25+adj, x1-25-adj, y1-25-adj
xys = 25+adj, 25+adj+10, x1-25-adj, y1-25-adj+10
tt = 0.0
i = 0
for point in self.points:
tt = tt + point[1]
start = 0.0
if not x1 == y1:
canvas.create_arc(xys, start=0.0, extent=359.99,
fill='gray60', outline=outline,
style='pieslice')
for point in self.points:
x1, y1 = point
extent = (y1/tt)*360.0
canvas.create_arc(xy, start=start, extent=extent,
fill=colors[i], width=width,
outline=outline, stipple=fillstyle,
style='pieslice')
start = start + extent
i = i+1
class GraphObjects:
def __init__(self, objects):
self.objects = objects
self.multiple = len(objects)-1
def boundingBox(self):
c1, c2 = self.objects[0].boundingBox()
for object in self.objects[1:]:
c1o, c2o = object.boundingBox()
c1 = minBound([c1, c1o])
c2 = maxBound([c2, c2o])
return c1, c2
def fitToScale(self, scale=(1,1), shift=(0,0)):
for object in self.objects:
object.fitToScale(scale, shift)
def draw(self, canvas):
for object in self.objects:
object.draw(canvas, self.multiple)
class GraphBase(Frame):
def __init__(self, master, width, height,
background='white', **kw):
apply(Frame.__init__, (self, master), kw)
self.canvas = Canvas(self, width=width, height=height,
background=background)
self.canvas.pack(fill=BOTH, expand=YES)
border_w = self.canvas.winfo_reqwidth() - \
string.atoi(self.canvas.cget('width'))
border_h = self.canvas.winfo_reqheight() - \
string.atoi(self.canvas.cget('height'))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -