我研究了这个主题,但找不到我需要的确切结果。我是Python的新手,也是Tkinter的新手,所以非常感谢任何帮助。
我正在通过Raspberry Pi使用Python代码来控制Arduino Uno,这将最终控制伺服器来控制遥控车。
我通过Raspberry Pi使用GUI并使用按钮等Tkinter命令通过GUI进行交互。按钮有四个,分别是' Up'' Down' '左'并且'对#39;
现在我通过Sketch Arduino程序使用串行监视器来调试代码。
虽然代码工作正在向Arduino发送信号,但它并没有像我希望的那样工作。现在,它只是暂时松开按钮后启动命令。
我需要的是:按下按钮时发送到Arduino的信号,只要按下按钮就会继续发送信号,并在按钮释放后立即切断。
以下是代码:
from Tkinter import *
import serial
running = True
ser = serial.Serial('/dev/ttyUSB0')
class Application(Frame):
"""Defining the remote control buttons"""
def __init__(self,master):
"""Initialize the frame"""
Frame.__init__(self,master)
self.grid() # How many times has the user clicked the button
self.create_widgets()
def create_widgets(self):
"""Creates four buttons that move the servos"""
#Create the 'up' button
self.bttn1 = ButtonPress(self)
self.bttn1["text"] = "Up"
self.bttn1["command"] = self.up
self.bttn1.grid()
#Create the 'down' button
self.bttn2 = Button(self)
self.bttn2.grid()
self.bttn2["text"] = "Down"
self.bttn2["command"] = self.down
#Create the 'left' button
self.bttn3 = Button(self)
self.bttn3.grid()
self.bttn3["text"] = "Left"
self.bttn3["command"] = self.left
#create the 'right' button
self.bttn4 = Button(self)
self.bttn4.grid()
self.bttn4["text"] = "Right"
self.bttn4["command"] = self.right
#Tells python to send the data to Arduino via serial
def right(self):
ser.write('3')
def left(self):
ser.write('4')
def up(self):
ser.write('1')
def down(self):
ser.write('2')
#Main
root = Tk()
root.title("Remote control")
root.geometry("250x250")
app = Application(root)
root.mainloop()
答案 0 :(得分:0)
默认情况下,tkinter中的按钮在您释放鼠标按钮之前不会触发。但是,您可以在按下按钮和按钮释放时设置绑定。您可以在按下时设置标记并在释放时取消设置,然后创建一个在设置标志时发送数据的函数。
有几种方法可以实现这一点。一种方法是使用一个定期运行的函数,如果按下按钮则发送密钥,如果未按下则不发送。另一种方法是只在按下键时运行它。为简单起见,我将展示第一种方法。
在这个例子中,我将使用该标志不仅确定是否应该发送数据,还要定义要发送的数据。这绝不是一项要求,它只是减少了你必须编写多少代码。
def send_data(self):
if self.char is not None:
ser.write(self.char)
# run again in 100ms. Here is where you control how fast
# to send data. The first parameter to after is a number
# of milliseconds to wait before calling the function
self.job = self.after(100, self.send_data)
上面的代码大约每100毫秒运行一次,发送任何设置的字符(或根本没有)。您可以随时使用self.after_cancel(self.job)
取消此自动运行任务。
按钮需要设置或取消设置self.char
。虽然使用绑定而不是按钮的command
属性是不常见的,但在这种情况下,这正是您想要的。
由于按钮之间的唯一区别是它们发送的内容,所有按钮都可以调用相同的功能,传入要发送的字符:
self.button1 = Button(self, text="Up")
self.button1.bind("<ButtonPress-1>", lambda: self.set_char('1'))
self.button1.bind("<ButtonRelease-1>", lambda: self.set_char(None))
def set_char(self, char):
self.char = char
最后,您需要确保拨打send_data
一次,然后它将永久运行(或直到after_cancel
取消)
class Application(Frame):
"""Defining the remote control buttons"""
def __init__(self,master):
...
self.char = None
self.send_data()