python3:不能让串行通信和Tkinter按钮同时工作

2024-04-26 02:59:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: totextadddisplayupdatecolumnwidgetframe
1条回答
网友
1楼 · 发布于 2024-04-26 02:59:22

有几件事需要解决:

  • 您应该在NextButton函数中全局声明“DisplayScreen”。你知道吗
  • 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。你知道吗

相关问题 更多 >