使用与 Raspberry Pi 和 pH 传感器的串行通信更新 window 上的数据
Updating data on a window using serial communication with Raspberry Pi and pH sensor
我在使用 Tkinter 更新 window 上的数据时遇到了一些问题。我正在使用我的 raspberry pi 和具有串行通信功能的 Atlas Scientific pH 传感器。 window 工作得很好,但没有像我预期的那样更新数据,所以,我做错了什么?。这是代码。非常感谢您的帮助。
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()
您好,欢迎来到 Whosebug
您的代码中没有 运行 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()
) 或日志文件。
显示串行连接数据的另一件事是直接将其显示在您的 root
Window 或其下方的小部件中(例如 Tkinter.Text
或 Tkinter.ListBox
为此我想到的小部件。
bus 脚本中使用的变量:
- 这里关于范围相同
- 您正在 def datos(int port):
中设置 bus=""
。你想在这里有一个局部变量还是想使用你在 Main Routine
中声明的 Tkinter.StringVar
? 如果你想使用StringVar,正确的初始化应该是bus.set("")
。向其附加文本将是 bus.set("%s%s"%(bus.get(),d))
。除了使用 "old" "%s"%var
,您还可以使用 String.format()
。
- 如果将 StringVar 用于总线,则需要将 sensor_pH
中的赋值更改为 pH.set(datos(port).get())
我在使用 Tkinter 更新 window 上的数据时遇到了一些问题。我正在使用我的 raspberry pi 和具有串行通信功能的 Atlas Scientific pH 传感器。 window 工作得很好,但没有像我预期的那样更新数据,所以,我做错了什么?。这是代码。非常感谢您的帮助。
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()
您好,欢迎来到 Whosebug
您的代码中没有 运行 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()
) 或日志文件。
显示串行连接数据的另一件事是直接将其显示在您的 root
Window 或其下方的小部件中(例如 Tkinter.Text
或 Tkinter.ListBox
为此我想到的小部件。
bus 脚本中使用的变量:
- 这里关于范围相同
- 您正在 def datos(int port):
中设置 bus=""
。你想在这里有一个局部变量还是想使用你在 Main Routine
中声明的 Tkinter.StringVar
? 如果你想使用StringVar,正确的初始化应该是bus.set("")
。向其附加文本将是 bus.set("%s%s"%(bus.get(),d))
。除了使用 "old" "%s"%var
,您还可以使用 String.format()
。
- 如果将 StringVar 用于总线,则需要将 sensor_pH
中的赋值更改为 pH.set(datos(port).get())