我是python的新手。我试图从Arduino板上获取串行输入并在Raspberry Pi 3上用Python 3接收它。在下面的代码中,我从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()
答案 0 :(得分:0)
有几件事需要解决:
NextButton
函数。Print
陈述错了。必须是print()
因此,NextButton函数必须如下所示:
def NextButton():
global DisplayScreen
DisplayScreen = DisplayScreen +1
print("Got Here")
if DisplayScreen == 3:
DisplayScreen = 1
# Update Display
ShowDisplay()
通过做这些更改,我已经能够显示" Got Here"点击按钮。但是,由于每10毫秒更新整个图形界面,因此单击它确实很复杂。
我强烈建议只更新标签而不是整个根。更好的是,您可以通过关联StringVar()
:
v = StringVar()
Label(master, textvariable=v).pack()
通过这种方式,您将获得更加稳定的图形界面。
我还建议你使用类,因为你在函数之间共享了几个变量。然后,您可以轻松使用self
。