⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stripchart.py

📁 Python.Tkinter编程实例代码多多学习
💻 PY
📖 第 1 页 / 共 2 页
字号:
                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 + -