我对Python还不熟悉。我正在尝试从Arduino板获取串行输入,并在Raspberry Pi 3上用Python3接收它。在下面的代码中,我从Arduino获得的代码很好,我可以使用Tkinter显示它。问题是,根据我从Arduino得到的代码,我想显示不同的屏幕。为此,我添加了一个Tkinter按钮。这个按钮应该只调用NextButton子例程并增加DisplayScreen值。然后它会调用ShowDisplay例程并显示下一个屏幕。按钮确实显示在屏幕上,但单击它什么也不做。你知道吗
任何帮助都将不胜感激。谢谢
import serial
from tkinter import *
v=" "
DisplayScreen =1
# Make Serial Connection
ser = serial.Serial('/dev/ttyACM0', 9600)
#Subroutine to increment display value
def NextButton():
DisplayScreen = DisplayScreen +1
Print ("Got Here")
if DisplayScreen == 3:
DisplayScreen = 1
# Update Display
ShowDisplay()
#Subroutine to show display
def ShowDisplay():
# Make values available from other parts of the program.
global v
if DisplayScreen == 1:
# Get rid of existing display entities
for widget in frame.winfo_children():
widget.destroy()
#Add Label
Label(frame, text="Display Screen 1").grid(row=0, column=0)
Label(frame, text=v).grid(row=1, column=0)
# Add button to go to next screen
Button(frame, text='Next', command=NextButton).grid(row=3, column=1)
else:
# Get rid of existing display entities
for widget in frame.winfo_children():
widget.destroy()
#Add Label
Label(frame, text="Display Screen 2").grid(row=0, column=0)
Label(frame, text=v).grid(row=1, column=0)
# Add button to go to next screen
Button(frame, text='Next', command=NextButton).grid(row=3, column=1)
def update_label():
global v
# get arduino info
PinballData= ser.readline()
# convert data to text
v = str(PinballData, 'utf-8')
# show display
ShowDisplay()
root.after(10, update_label)
#calls update_label function again after 1 second. (1000 milliseconds.)
root = Tk()
frame = Frame(root)
frame.grid()
update_label()
root.mainloop()
有几件事需要解决:
NextButton
函数中全局声明“DisplayScreen”。你知道吗Print
语句错误。它必须是print()
因此,函数NextButton必须如下所示:
通过做这些更改,我可以通过单击按钮来显示“Got Here”。但是,单击它确实很复杂,因为每10毫秒更新一次整个图形界面
我强烈建议只更新标签而不是整个根目录。更好的是,您可以通过关联
StringVar()
随时更改小部件的文本:这样,您将拥有一个更加稳定的图形界面。你知道吗
我还建议您使用类,因为函数之间共享了几个变量。然后,您就可以轻松地使用
self
。你知道吗相关问题 更多 >
编程相关推荐