Python的每个新版本都会增加一些新的功能,或者对原来的功能作一些改动。有些改动是不兼容旧版本的,也就是在当前版本运行正常的代码,到下一个版本运行就可能不正常了。从Python 2.7到Python 3.x就有不兼容的一些改动,比如2.x里的字符串用'xxx'表示str,Unicode字符串用u'xxx'表示unicode,而在3.x中,所有字符串都被视为unicode,因此,写u'xxx'和'xxx'是完全一致的,而在2.x中以'xxx'表示的str就必须写成b'xxx',以此表示“二进制字符串”。要直接把代码升级到3.x是比较冒进的,因为有大量的改动需要测试。相反,可以在2.7版本中先在一部分代码中测试一些3.x的特性,如果没有问题,再移植到3.x不迟。Python提供了__future__模块,把下一个新版本的特性导入到当前版本,于是我们就可以在当前版本中测试一些新版本的特性。举例说明如下:为了适应Python 3.x的新的字符串的表示方法,在2.7版本的代码中,可以通过unicode_literals来使用Python 3.x的新的语法:# still running on Python 2.7from __future__ import unicode_literalsprint '\'xxx\' is unicode?', isinstance('xxx', unicode)print 'u\'xxx\' is unicode?', isinstance(u'xxx', unicode)print '\'xxx\' is str?', isinstance('xxx', str)print 'b\'xxx\' is str?', isinstance(b'xxx', str)注意到上面的代码仍然在Python 2.7下运行,但结果显示去掉前缀u的'a string'仍是一个unicode,而加上前缀b的b'a string'才变成了str:$ python task.py'xxx' is unicode? Trueu'xxx' is unicode? True'xxx' is str? Falseb'xxx' is str? True类似的情况还有除法运算。在Python 2.x中,对于除法有两种情况,如果是整数相除,结果仍是整数,余数会被扔掉,这种除法叫“地板除”:>>> 10 / 33要做精确除法,必须把其中一个数变成浮点数:>>> 10.0 / 33.3333333333333335而在Python 3.x中,所有的除法都是精确除法,地板除用//表示:$ python3Python 3.3.2 (default, Jan 22 2014, 09:54:40) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> 10 / 33.3333333333333335>>> 10 // 33如果你想在Python 2.7的代码中直接使用Python 3.x的除法,可以通过__future__模块的division实现:from __future__ import divisionprint '10 / 3 =', 10 / 3print '10.0 / 3 =', 10.0 / 3print '10 // 3 =', 10 // 3结果如下:10 / 3 = 3.3333333333310.0 / 3 = 3.3333333333310 // 3 = 3小结由于Python是由社区推动的开源并且免费的开发语言,不受商业公司控制,因此,Python的改进往往比较激进,不兼容的情况时有发生。Python为了确保你能顺利过渡到新版本,特别提供了__future__模块,让你在旧的版本中试验新版本的一些特性。

好几年前我在做一些自动化的脚本时,脑子里也闪过这样的想法:能不能直接把浏览器的cookies取出来用呢?直到昨天看到代码《python模拟发送动弹》,想起来当年我也曾经有类似的想法没能完成,那就优先拿这个练手,之后的代码也会用这个功能。直接从浏览器中取出cookies,有以下好处和用途:1、不需要配置用户密码,直接读出浏览器中cookies就得到一样的身份,用来完成各种自动化操作。2、部分网站登录会更新Session,会导致之前成功登录的Session失效,与浏览器使用相同的Session,不用进行登录操作,不会互相挤下线。3、全是废话,我不想写了,行吗?使用到软件的sqlite3的图形管理工具有:SQLiteDatabaseBrowserPortable http://www.jb51.net/database/251740.htmlsqlitespy http://www.jb51.net/database/18390.html使用到的python库有:sqlite3 python标准库,不需要下载安装pywin32 pywin32 windows的API库,让python可以调用各种各样的windows API,代码中用到的win32crypt就是属于pywin32库的一部分。 建议手动下载对应版本pywin32安装 http://www.jb51.net/softs/416136.html http://www.jb51.net/softs/416131.htmlrequests requests是一个相对比较简单易用的http库,用来代替urllib23之类的标准库,使用命令安装pip install requests看代码:import osimport sqlite3import requestsfrom win32.win32crypt import CryptUnprotectDatadef getcookiefromchrome(host='.oschina.net'): cookiepath=os.environ['LOCALAPPDATA']+r"\Google\Chrome\User Data\Default\Cookies" sql="select host_key,name,encrypted_value from cookies where host_key='%s'" % host with sqlite3.connect(cookiepath) as conn: cu=conn.cursor() cookies={name:CryptUnprotectData(encrypted_value)[1].decode() for host_key,name,encrypted_value in cu.execute(sql).fetchall()} print(cookies) return cookies#运行环境windows 2012 server python3.4 x64 chrome 50#以下是测试代码#getcookiefromchrome()#getcookiefromchrome('.baidu.com')url='http://my.oschina.net/'httphead={'User-Agent':'Safari/537.36',}#设置allow_redirects为真,访问http://my.oschina.net/ 可以跟随跳转到个人空间r=requests.get(url,headers=httphead,cookies=getcookiefromchrome('.oschina.net'),

复制代码 代码如下:"""如果只用普通的import urllib.requesthtml = urllib.request.urlopen("http://www.sina.com").read()print(html.decode('gbk'))出现下面的错误builtins.UnicodeDecodeError: 'gbk' codec can't decode byte 0x8b in position 1: illegal multibyte sequence怎么办?原来是有的网站将网页用gzip压缩了 。请看下面的代码建议大家用python2import urllib2from StringIO import StringIOimport gziprequest = urllib2.Request('http://www.sina.com')request.add_header('Accept-encoding', 'gzip')response = urllib2.urlopen(request)if response.info().get('Content-Encoding') == 'gzip':    buf = StringIO( response.read())    f = gzip.GzipFile(fileobj=buf)    data = f.read()print data.decode("GBK").encode('utf-8')"""import ioimport urllib.request as rimport gzipreq = r.Request("http://www.sina.com", headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36", "Accept-Encoding": "gzip"})bs = r.urlopen(req).read()bi = io.BytesIO(bs)gf = gzip.GzipFile(fileobj=bi,

解析树完成树的实现之后,现在我们来看一个例子,告诉你怎么样利用树去解决一些实际问题。在这个章节,我们来研究解析树。解析树常常用于真实世界的结构表示,例如句子或数学表达式。图 1:一个简单句的解析树图 1 显示了一个简单句的层级结构。将一个句子表示为一个树,能使我们通过利用子树来处理句子中的每个独立的结构。图 2: ((7+3)*(5−2)) 的解析树如图 2 所示,我们能将一个类似于 ((7+3)*(5−2)) 的数学表达式表示出一个解析树。我们已经研究过全括号表达式,那么我们怎样理解这个表达式呢?我们知道乘法比加或者减有着更高的优先级。因为括号的关系,我们在做乘法运算之前,需要先计算括号内的加法或者减法。树的层级结构帮我们理解了整个表达式的运算顺序。在计算最顶上的乘法运算前,我们先要计算子树中的加法和减法运算。左子树的加法运算结果为 10,右子树的减法运算结果为 3。利用树的层级结构,一旦我们计算出了子节点中表达式的结果,我们能够将整个子树用一个节点来替换。运用这个替换步骤,我们得到一个简单的树,如图 3 所示。图 3: ((7+3)*(5−2)) 的化简后的解析树在本章的其余部分,我们将更加详细地研究解析树。尤其是:怎样根据一个全括号数学表达式来建立其对应的解析树怎样计算解析树中数学表达式的值怎样根据一个解析树还原数学表达式建立解析树的第一步,将表达式字符串分解成符号保存在列表里。这里有四种符号需要我们考虑:左括号,操作符和操作数。我们知道读到一个左括号时,我们将开始一个新的表达式,因此我们创建一个子树来对应这个新的表达式。相反,每当我们读到一个右括号,我们就得结束这个表达式。另外,操作数将成为叶节点和他们所属的操作符的子节点。最后,我们知道每个操作符都应该有一个左子节点和一个右子节点。通过上面的分析我们定义以下四条规则:如果当前读入的字符是'(',添加一个新的节点作为当前节点的左子节点,并下降到左子节点处。如果当前读入的字符在列表['+', '-', '/', '*']中,将当前节点的根值设置为当前读入的字符。添加一个新的节点作为当前节点的右子节点,并下降到右子节点处。如果当前读入的字符是一个数字,将当前节点的根值设置为该数字,并返回到它的父节点。如果当前读入的字符是')',返回当前节点的父节点。在我们编写 Python 代码之前,让我们一起看一个上述的例子。我们将使用 (3+(4*5)) 这个表达式。我们将表达式分解为如下的字符列表:['(', '3', '+', '(', '4', '*', '5' ,')',')']。一开始,我们从一个仅包括一个空的根节点的解析树开始。如图 4,该图说明了随着每个新的字符被读入后该解析树的内容和结构。图 4:解析树结构的步骤图观察图 4,让我们一步一步地过一遍: 创建一个空的树。 读如(作为第一个字符,根据规则 1,创建一个新的节点作为当前节点的左子结点,并将当前节点变为这个新的子节点。 读入3作为下一个字符。根据规则 3,将当前节点的根值赋值为3然后返回当前节点的父节点。 读入+作为下一个字符。根据规则 2,将当前节点的根值赋值为+,然后添加一个新的节点作为其右子节点,并且将当前节点变为这个新的子节点。 读入(作为下一个字符。根据规则 1,创建一个新的节点作为当前节点的左子结点,并将当前节点变为这个新的子节点。 读入4作为下一个字符。根据规则 3,将当前节点的根值赋值为4然后返回当前节点的父节点 读入*作为下一个字符。根据规则 2,将当前节点的根值赋值为*,然后添加一个新的节点作为其右子节点,并且将当前节点变为这个新的子节点。 读入5作为下一个字符。根据规则 3,将当前节点的根值赋值为5然后返回当前节点的父节点 读入)作为下一个字符。根据规则 4,我们将当前节点变为当前节点*的父节点。 读入)作为下一个字符。根据规则 4,我们将当前节点变为当前节点+的父节点,因为当前节点没有父节点,所以我们已经完成解析树的构建。通过上面给出的例子,很明显我们需要跟踪当前节点和当前节点的父节点。树提供给我们一个获得子节点的方法——通过getLeftChild和getRightChild方法,但是我们怎么样来跟踪一个节点的父节点呢?一个简单的方法就是在我们遍历整个树的过程中利用栈跟踪父节点。当我们想要下降到当前节点的子节点时,我们先将当前节点压入栈。当我们想要返回当前节点的父节点时,我们从栈中弹出该父节点。通过上述的规则,使用栈和二叉树来操作,我们现在编写函数来创建解析树。解析树生成函数的代码如下所示。from pythonds.basic.stack import Stackfrom pythonds.trees.binaryTree import BinaryTreedef buildParseTree(fpexp): fplist = fpexp.split() pStack = Stack() eTree = BinaryTree('') pStack.push(eTree) currentTree = eTree for i in fplist: if i == '(': currentTree.insertLeft('') pStack.push(currentTree) currentTree = currentTree.getLeftChild() elif i not in ['+', '-', '*', '/', ')']: currentTree.setRootVal(int(i)) parent = pStack.pop() currentTree = parent elif i in ['+', '-', '*', '/']: currentTree.setRootVal(i) currentTree.insertRight('') pStack.push(currentTree) currentTree = currentTree.getRightChild() elif i == ')': currentTree = pStack.pop() else: raise ValueError return eTreept = buildParseTree("( ( 10 + 5 ) * 3 )")pt.postorder() #defined and explained in the next section这四条建立解析树的规则体现在四个if从句,它们分别在第 11,15,19,24 行。如上面所说的,在这几处你都能看到规则的代码实现,并需要调用一些BinaryTree和Stack的方法。这个函数中唯一的错误检查是在else语句中,一旦我们从列表中读入的字符不能辨认,我们就会报一个ValueError的异常。现在我们已经建立了一个解析树,我们能用它来干什么呢?第一个例子,我们写一个函数来计算解析树的值,并返回该计算的数字结果。为了实现这个函数要利用树的层级结构。重新看一下图 2,回想一下我们能够将原始的树替换为简化后的树(图 3)。这提示我们写一个通过递归计算每个子树的值来计算整个解析树的值。就像我们以前实现递归算法那样,我们将从基点来设计递归计算表达式值的函数。这个递归算法的自然基点是检查操作符是否为叶节点。在解析树中,叶节点总是操作数。因为数字变量如整数和浮点数不需要更多的操作,这个求值函数只需要简单地返回叶节点中存储的数字就可以。使函数走向基点的递归过程就是调用求值函数计算当前节点的左子树、右子树的值。递归调用使我们朝着叶节点,沿着树下降。为了将两个递归调用的值整合在一起,我们只需简单地将存在父节点中的操作符应用到两个子节点返回的结果。在图 3 中,我们能看到两个子节点的值,分别为 10 和 3。对他们使用乘法运算得到最终结果 30。递归求值函数的代码如 Listing1 所示,我们得到当前节点的左子节点、右子节点的参数。如果左右子节点的值都是 None,我们就能知道这个当前节点是一个叶节点。这个检查在第 7 行。如果当前节点不是一个叶节点,查找当前节点的操作符,并用到它左右孩子的返回值上。为了实现这个算法,我们使用了字典,键值分别为'+','-','*'和'/'。存在字典里的值是 Python 的操作数模块中的函数。这个操作数模块为我们提供了很多常用函数的操作符。当我们在字典中查找一个操作符时,相应的操作数变量被取回。既然是函数,我们可以通过调用函数的方式来计算算式,如function(param1,param2)。所以查找opers['+'](2,2)就等价于operator.add(2,2)。Listing 1def evaluate(parseTree): opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv} leftC = parseTree.getLeftChild() rightC = parseTree.getRightChild() if leftC and rightC: fn = opers[parseTree.getRootVal()] return fn(evaluate(leftC),evaluate(rightC)) else: return parseTree.getRootVal()最后,我们将在图 4 中创建的解析树上遍历求值。当我们第一次调用求值函数时,我们传递解析树参数parseTree,作为整个树的根。然后我们获得左右子树的引用来确保它们一定存在。递归调用在第 9 行。我们从查看树根中的操作符开始,这是一个'+'。这个'+'操作符找到operator.add函数调用,且有两个参数。通常对一个 Python 函数调用而言,Python 第一件做的事情就是计算传给函数的参数值。通过从左到右的求值过程,第一个递归调用从左边开始。在第一个递归调用中,求值函数用来计算左子树。我们发现这个节点没有左、右子树,所以我们在一个叶节点上。当我们在叶节点上时,我们仅仅是返回这个叶节点存储的数值作为求值函数的结果。因此我们返回整数 3。现在,为了顶级调用operator.add函数,我们计算好其中一个参数了,但我们还没有完。继续从左到右计算参数,现在递归调用求值函数用来计算根节点的右子节点。我们发现这个节点既有左节点又有右节点,所以我们查找这个节点中存储的操作符,是'*',然后调用这个操作数函数并将它的左右子节点作为函数的两个参数。此时再对它的两个节点调用函数,这时发现它的左右子节点是叶子,分别返回两个整数 4 和 5。求出这两个参数值后,我们返回operator.mul(4,5)的值。此时,我们已经计算好了顶级操作符'+'的两个操作数了,所有需要做的只是完成调用函数operator.add(3,20)即可。这个结果就是整个表达式树 (3+(4*5)) 的值,这个值是 23。树的遍历之前我们已经了解了树的基本功能,现在我们来看一些应用模式。按照节点的访问方式不同,模式可分为 3 种。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。我们把这种对所有节点的访问称为遍历(traversal)。这三种遍历分别叫做先序遍历(preorder),中序遍历(inorder)和后序遍历(postorder)。我们来给出它们的详细定义,然后举例看看它们的应用。先序遍历 在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树。中序遍历 在中序遍历中,我们递归使用中序遍历访问左子树,然后访问根节点,最后再递归使用中序遍历访问右子树。后序遍历 在后序遍历中,我们先递归使用后序遍历访问左子树和右子树,最后访问根节点。现在我们用几个例子来说明这三种不同的遍历。首先我们先看看先序遍历。我们用树来表示一本书,来看看先序遍历的方式。书是树的根节点,每一章是根节点的子节点,每一节是章节的子节点,每一小节是每一章节的子节点,以此类推。图 5 是一本书只取了两章的一部分。虽然遍历的算法适用于含有任意多子树的树结构,但我们目前为止只谈二叉树。图 5:用树结构来表示一本书设想你要从头到尾阅读这本书。先序遍历恰好符合这种顺序。从根节点(书)开始,我们按照先序遍历的顺序来阅读。我们递归地先序遍历左子树,在这里是第一章,我们继续递归地先序遍历访问左子树第一节 1.1。第一节 1.1 没有子节点,我们不再递归下去。当我们阅读完 1.1 节后我们回到第一章,这时我们还需要递归地访问第一章的右子树 1.2 节。由于我们先访问左子树,我们先看 1.2.1 节,再看 1.2.2 节。当 1.2 节读完后,我们又回到第一章。之后我们再返回根节点(书)然后按照上述步骤访问第二章。由于用递归来编写遍历,先序遍历的代码异常的简洁优雅。Listing 2 给出了一个二叉树的先序遍历的 Python 代码。Listing 2def preorder(tree): if tree: print(tree.getRootVal()) preorder(tree.getLeftChild()) preorder(tree.getRightChild())我们也可以把先序遍历作为BinaryTree类中的内置方法,这部分代码如 Listing 3 所示。注意这一代码从外部移到内部所产生的变化。一般来说,我们只是将tree换成了self。但是我们也要修改代码的基点。内置方法在递归进行先序遍历之前必须检查左右子树是否存在。Listing 3def preorder(self): print(self.key) if self.leftChild: self.leftChild.preorder() if self.rightChild: self.rightChild.preorder()内置和外置方法哪种更好一些呢?一般来说preorder作为一个外置方法比较好,原因是,我们很少是单纯地为了遍历而遍历,这个过程中总是要做点其他事情。事实上我们马上就会看到后序遍历的算法和我们之前写的表达式树求值的代码很相似。只是我们接下来将按照外部函数的形式书写遍历的代码。后序遍历的代码如 Listing 4 所示,它除了将print语句移到末尾之外和先序遍历的代码几乎一样。Listing 4def postorder(tree): if tree != None: postorder(tree.getLeftChild()) postorder(tree.getRightChild()) print(tree.getRootVal())我们已经见过了后序遍历的一般应用,也就是通过表达式树求值。我们再来看 Listing 1,我们先求左子树的值,再求右子树的值,然后将它们利用根节点的运算连在一起。假设我们的二叉树只存储表达式树的数据。我们来改写求值函数并尽量模仿后序遍历的代码,如 Listing 5 所示。Listing 5def postordereval(tree): opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv} res1 = None res2 = None if tree: res1 = postordereval(tree.getLeftChild()) res2 = postordereval(tree.getRightChild()) if res1 and res2: return opers[tree.getRootVal()](res1,res2) else: return tree.getRootVal()我们发现 Listing 5 的形式和 Listing 4 是一样的,区别在于 Listing 4 中我们输出键值而在 Listing 5 中我们返回键值。这使我们可以通过第 6 行和第 7 行将递归得到的值存储起来。之后我们利用这些保存起来的值和第 9 行的运算符一起运算。在这节的最后我们来看看中序遍历。在中序遍历中,我们先访问左子树,之后是根节点,最后访问右子树。 Listing 6 给出了中序遍历的代码。我们发现这三种遍历的函数代码只是调换了输出语句的位置而不改动递归语句。Listing 6def inorder(tree): if tree != None: inorder(tree.getLeftChild()) print(tree.getRootVal()) inorder(tree.getRightChild())当我们对一个解析树作中序遍历时,得到表达式的原来形式,没有任何括号。我们尝试修改中序遍历的算法使我们得到全括号表达式。只要做如下修改:在递归访问左子树之前输出左括号,然后在访问右子树之后输出右括号。修改的代码见 Listing 7。Listing 7def printexp(tree): sVal = "" if tree: sVal = '(' + printexp(tree.getLeftChild()) sVal = sVal + str(tree.getRootVal()) sVal = sVal + printexp(tree.getRightChild())+')' return sVal我们发现printexp函数对每个数字也加了括号,这些括号显然没必要加。

先看效果图 GY-85.py:复制代码 代码如下:#!/usr/bin/python3# -*- coding: utf-8 -*-import cursesfrom time import *from i2clibraries import i2c_itg3205, i2c_adxl345, i2c_hmc5883l#==========================================================#                       GY-85传感器监控#==========================================================def displayITG3205(screen, col, temp, x, y, z):    """    显示ITG3205读数的方法    """    screen.addstr(1, col, "%.1f°℃    " % temp)    screen.addstr(2, col, "%.1f°/s    " % x)    screen.addstr(3, col, "%.1f°/s    " % y)    screen.addstr(4, col, "%.1f°/s    " % z)def displayADXL345(screen, col, x, y, z):    """    显示ADXL345读数的方法    """    screen.addstr(1, col, "%.2fmg    " % x)    screen.addstr(2, col, "%.2fmg    " % y)    screen.addstr(3, col, "%.2fmg    " % z)def displayHMC5883L(screen, col, heading, declination, x, y, z):    """    显示MC5883L读数的方法    """    screen.addstr(1, col, heading + "   ")    screen.addstr(2, col, declination + "   ")    screen.addstr(3, col, "%.2f   " % x)    screen.addstr(4, col, "%.2f   " % y)    screen.addstr(5, col, "%.2f   " % z)try:    myscreen = curses.initscr() #初始化curses    myscreen.border(0)    (screen_h, screen_w) = myscreen.getmaxyx() #获得屏幕高宽    curses.start_color() #设置颜色    curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_GREEN) #绿底黑字    curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK) #白底蓝字    curses.init_pair(3, curses.COLOR_MAGENTA,curses.COLOR_BLACK) #黑底什么字    myscreen.clear() #清除画布    # 计算每块的坐标, 屏幕分3列, 每列显示一个传感器    col1 = screen_w / 3 * 0    col2 = screen_w / 3 * 1    col3 = screen_w / 3 * 2    # 屏幕横向分三块,每块中间写上标题    myscreen.addstr(0, int(col1 + screen_w / 3 / 2 - 3), "IGT3205", curses.color_pair(1))    myscreen.addstr(0, int(col2 + screen_w / 3 / 2 - 4), "ADXL345", curses.color_pair(1))    myscreen.addstr(0, int(col3 + screen_w / 3 / 2 - 4), "HMC5883L", curses.color_pair(1))    #画分割线,把屏幕分为3列    for col in range(1, screen_h):        myscreen.addstr(col, int(col2), "│")        myscreen.addstr(col, int(col3), "│")    # 事先打印IGT3205的各项值的名称    myscreen.addstr(1, int(col1), "Temp:", curses.color_pair(2))    myscreen.addstr(2, int(col1), "X   :", curses.color_pair(2))    myscreen.addstr(3, int(col1), "Y   :", curses.color_pair(2))    myscreen.addstr(4, int(col1), "z   :", curses.color_pair(2))    # 事先打印ADXL345的各项值的名称    myscreen.addstr(1, int(col2) + 1, "X:", curses.color_pair(2))    myscreen.addstr(2, int(col2) + 1, "Y:", curses.color_pair(2))    myscreen.addstr(3, int(col2) + 1, "z:", curses.color_pair(2))    # 事先打印HMC5883L的各项值的名称    myscreen.addstr(1, int(col3) + 1, "Heading:    ", curses.color_pair(2))    myscreen.addstr(2, int(col3) + 1, "Declination:", curses.color_pair(2))    myscreen.addstr(3, int(col3) + 1, "X:          ", curses.color_pair(2))    myscreen.addstr(4, int(col3) + 1, "Y:          ", curses.color_pair(2))    myscreen.addstr(5, int(col3) + 1, "z:          ", curses.color_pair(2))    # 初始化传感器    itg3205 = i2c_itg3205.i2c_itg3205(0)    adxl345 = i2c_adxl345.i2c_adxl345(0)    hmc5883l = i2c_hmc5883l.i2c_hmc5883l(0)    hmc5883l.setContinuousMode() #设置为持续更新模式    hmc5883l.setDeclination(9,54) #设置真北磁偏角补偿    while True:        #读取itg3205数据        (itgready, dataready) = itg3205.getInterruptStatus()            if dataready:            temp = itg3205.getDieTemperature()            (x, y, z) = itg3205.getDegPerSecAxes()             displayITG3205(myscreen, 6, temp, x, y, z) #刷新画布        #读取adxl345数据        (x, y, z) = adxl345.getAxes()        displayADXL345(myscreen, int(col2) + 4, x, y, z) #刷新画布        #读取hmc5883l数据        (x, y, z) = hmc5883l.getAxes()        heading = hmc5883l.getHeadingString() #获取指向角度        declination = hmc5883l.getDeclinationString() #获取磁偏角补偿信息        displayHMC5883L(myscreen, int(col3) + 13, heading, declination, x, y, z) #刷新画布        myscreen.refresh() #应用画布        sleep(0.1) #暂停0.1秒    myscreen.getch()finally:

分类:腾博会手机版下载

时间:2016-02-21 14:27:13