2015-11-18 31 views
0

我在使用Tkinter更新窗口上的數據時遇到了一些問題。我使用我的覆盆子pi和Atlas科學pH傳感器進行串行通信。該窗口完美地工作,但沒有按照我的預期更新數據,所以,我做錯了什麼?這是代碼。我非常感謝你的幫助。使用與樹莓派和pH傳感器的串行通信更新窗口上的數據

from Tkinter import * 
import time 
import serial 

def datos(port): 
    bus = "" 
    while True: 
     d = port.read() 
     bus += d 
     if d == '\r': 
      return bus 

def sensor_pH(): 
    pH.set(datos(port)) 
    root.after(1000, sensor_pH) 

port = serial.Serial('/dev/ttyAMA0', baudrate = 9600, timeout = 2) 

port.write('L,1\r')#Command to turn the sensor's led on 
port.write('C,1\r')#Command to read data, (pH), continuously every second 

root = Tk() 
root.geometry('300x300') 
pH = IntVar() 
bus = StringVar() 

etpH = Label (root, text = 'pH: ') 
etpH.grid(row=0, column=0) 
et1= Label(root, textvariable = pH) 
et1.grid(row=0, column=9) 

sensor_pH 
root.mainloop() 
+0

您是否關閉了'ttyAMA0'上的串行控制檯?你可以使用'sudo raspi-config'來做到這一點,重新啓動,然後嘗試運行你的代碼。 – dhruvvyas90

回答

1

有您好,歡迎StackOverflow

你是不是在你的代碼運行sensor_pH - 這將是sensor_pH()這一個第一。 另一件事 - 你沒有在def sensor_pH()中使用正確的範圍。

使用

def sensor_pH(): 
    global root, pH, port 
    pH.set(datos(port)) 
    root.after(1000, sensor_pH) 

變量從Main Routine(全球範圍)

嘗試不能直接在函數(本地範圍)。要在那裏使用它們而不將它們作爲參數傳遞,則需要將它們聲明爲全局的。

如果您想知道數據是否正確讀取,請使用print語句將stdout(print())或日誌文件。

另一件事出現在串行連接數據是直接顯示它您root窗口或下方的一個小窗口內(例如Tkinter.TextTkinter.ListBox將是會來我的腦海窗口小部件。

總線在腳本中使用的變量: - 同樣在這裏涉及範圍 - 你在def datos(int port):設置bus=""你想在這裏有一個局部變量或你想使用你在聲明Tkinter.StringVarMain Routine如果你想要的。?要使用StringVar,正確的初始化將是bus.set("")。附加文本將是bus.set("%s%s"%(bus.get(),d))。而不是使用「舊」"%s"%var你也可以使用String.format()。 - 如果使用StringVar作爲總線,則需要將sensor_pH中的賦值更改爲pH.set(datos(port).get())