📄 stripchart.py
字号:
return
else:
self.threadRunning = TRUE
self.gotData = FALSE
thread.start_new(self.getMETAR, (noaa_url,metar_dir,
self.wStation))
self.frame.after(1000, self.doPlot) # Spin for data
return
if self.report:
self.decodeMETAR(self.report)
self.pollTime = time.time()
for xf, yf, af, label, low, high, dataType, datalist, yAxisLabel, \
ticklist in self.cells:
x0=(self.cellWidth*xf)+self.xindent
x1=(self.cellWidth*xf)+self.xindent+self.axisWidth
y0=(self.cellHeight*yf)+self.yindent+self.titlespace+1
y1=(self.cellHeight*yf)+self.yindent+self.titlespace+\
(self.axisHeight*af)+1
if low <= 0:
spread=abs(low)+abs(high)
else:
spread = high-low
negcomp=self.calculate_negative_component(low, high)
for data in datalist:
dataPoint = getattr(self, '%s' % data)
if dataPoint or dataPoint == 0.0:
if self.pollTime > self.maxSpan:
self.canvas.delete(self.plottedData) # Remove previous
self.baseTime = self.pollTime
self.setDisplayRange(self.displayItems)
xfactor = float(self.axisWidth) / (self.maxSpan - \
self.baseTime)
xv = self.pollTime - self.baseTime
if not dataPoint == float(BLANK_VALUE):
centerx = x0 + ((xv * xfactor)-1) +2
centery=((float(spread-(dataPoint+negcomp))/ \
float(spread))*(self.axisHeight*af))+y0-1
lastX, lastY = getattr(self, 'last%s' % data)
if not lastY == -999.0:
if not lastX >= centerx:
self.canvas.create_line(lastX,lastY,centerx,
centery,fill=self.Line,width=2,
tags=self.plottedData)
pstr = 'self.last%s = (%d,%d)' % (data,centerx,centery)
else:
pstr = 'self.last%s = (-999.0,-999.0)' % data
else:
pstr = 'self.last%s = (-999.0,-999.0)' % data
exec(pstr)
drawinterval = 1000*self.refreshRate
self.frame.after(drawinterval, self.doPlot)
def setDisplayRange(self, display):
doSetup = FALSE
if not self.displayItems == display:
doSetup = TRUE
self.displayItems = display
[value, units] = string.splitfields(display, ' ')
mult = 1
if units[:1] == 'M':
mult = 60
if units[:1] == 'H':
mult = 3600
self.maxSpan = self.baseTime + (string.atoi(value) * mult)
self.canvas.delete(self.plottedData) # Remove previous data...
if doSetup:
self.setup_plot(restart=0)
def setDisplayRate(self, rate):
newRate = 10
if not rate == 'Default':
[value, units] = string.splitfields(rate, ' ')
mult = 1
if units[:1] == 'M':
mult = 60
newRate = string.atoi(value) * mult
self.set_refreshRate(newRate)
self.baseTime = time.time()
self.setDisplayRange(self.displayItems)
def setStation(self, station):
self.wStation = station[:4]
self.master.title("Weather Monitor (%s)" % self.wStation)
def calculate_negative_component(self, low, high):
if low < 0:
negcomp = abs(low)
elif low > 0:
negcomp = -low
else:
negcomp = low
return negcomp
def set_refreshRate(self, rate):
self.refreshRate = rate
def getMETAR(self, url=noaa_url, directory=metar_dir,
station='KPVD'):
## UNCOMMENT the next line to inject test data (saves net bandwidth!)
## return self.getTestData()
tmp = '%s/wtemp' % temp_dir
if os.path.exists(tmp) == 1:
os.remove(tmp)
data = open(tmp,'w')
try:
ftp = FTP(url)
ftp.login()
ftp.cwd(directory)
ftp.retrbinary('RETR %s.TXT' % station, data.write)
ftp.quit
except:
print 'FTP failed...'
data.close()
report = open(tmp, 'r')
self.report = report.read()
self.gotData = TRUE
def decodeMETAR(self, report):
self.Temp = None
self.Press = None
self.WSpeed = None
self.Humidity = None
self.Visibility = None
self.WDir = None
self.CLow = None
self.CHigh = None
station = dtime = wind = visib = runway = weather = temp = alt = '--'
lines = string.split(report, '\n')
data = string.split(lines[1], ' ')
station = data[0]
dtime = data[1]
if not data[2][0] in 'CSA': # COR, AUTO, SPEC
wind = data[2]
next = 3
else:
wind = data[3]
next = 4
if data[next][-2:] == 'SM':
visib = data[next]
else:
next = next + 1 #SKIP
visib = data[next]
next = next + 1
if data[next][0] == 'R':
runway = data[next]
next = next + 1
if data[next][:2] in ['MI','BC','PR','TS','BL','SH','DR','FZ','DZ',
'IC','UP','RA','PE','SN','GR','SG','GS','BR',
'SA','FG','HZ','FU','PY','VA','DU','SQ','FC',
'SS','DS','PO']:
weather = data[next]
next = next + 1
cloud = []
while 1:
if data[next][:3] in ['SKC','SCT','FEW','BKN','OVC','TCC','CLR']:
cloud.append(data[next])
next = next + 1
else:
break
temp = data[next]
next = next + 1
alt = data[next]
if not wind[:3] == 'VRB':
self.WDir = atoi(wind[:3])
self.WSpeed = atoi(wind[3:])*23.0/20.0
if self.WDir == 0 and self.WSpeed == 0.0:
self.WDir = None # Calm
self.WSpeed = 0.0
if len(cloud) == 1 or len(cloud) == 2 or len(cloud) == 3:
if cloud[0] == 'CLR':
self.CLow = None
else:
self.CLow = atoi(cloud[0][3:6])/10
if len(cloud) == 2 or len(cloud) == 3:
if cloud[1] == 'CLR':
self.CLow = None
else:
self.CHigh = atoi(cloud[1][3:6])/10
elif len(cloud) == 3:
if cloud[2] == 'CLR':
self.CLow = None
else:
self.CVHigh = atoi(cloud[2][3:6])/10
self.Visibility = atoi(visib)
t, dpC = string.split(temp, '/')
self.Temp = (atoi(t)*(9.0/5.0))+32
dpF = (atoi(dpC)*(9.0/5.0))+32
self.Humidity = (dpF/self.Temp)*100
self.Press = eval('%s.%s' % (alt[1:3], alt[-2:]), _safe_env)
def getTestData(self):
try:
retData = 'Date Time\n%s' % testData[self.testIndex]
self.testIndex = self.testIndex + 1
except IndexError:
retData = None
self.testIndex = 0
return retData
def translate_spaces(instring, trans):
res = ''
for c in instring:
if c == ' ' or c == '\t':
if trans != "": #To remove spaces
res = res + trans
else:
res = res + c
return (res)
def translate_underbars(instring):
res = ''
for c in instring:
if c == '_':
res = res + ' '
else:
res = res + c
return (res)
# "Safe" environment for eval()
_safe_env = {"__builtins__": {}}
def atoi(strIn):
result = 0
s = string.strip(strIn)
sign = ''
if s:
if s[0] in '+-':
sign = s[0]
s = s[1:]
while s[0] == '0' and len(s) > 1: s = s[1:]
str = sign
for c in s:
if c not in digits:
break # Got a terminator
str = str + c
if str:
result = eval(str, _safe_env)
return result
if __name__ == '__main__':
root = Tk()
root.option_add('*background', 'grey')
root.option_add('*foreground', 'black')
root.option_add('*Entry.background', 'white')
root.option_add('*Label.background', 'grey')
Pmw.initialise(root, fontScheme = 'pmw1', useTkOptionDb = 0)
w = WeatherMonitor(root, width=720, height=430)
w.master.title("Weather Monitor (%s)" % w.wStation)
w.master.iconname('Weather')
w.master.geometry('+20+80')
root.mainloop()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -