Python 3:无法同时使用串行通信和Tkinter按钮

时间:2017-06-25 09:02:09

标签: python python-3.x tkinter serial-port

我是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()

1 个答案:

答案 0 :(得分:0)

有几件事需要解决:

  • 您应该声明' DisplayScreen'全局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