首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Tkinter滞后控制RPI电机驱动

用Tkinter滞后控制RPI电机驱动
EN

Stack Overflow用户
提问于 2017-05-06 14:24:28
回答 1查看 186关注 0票数 0

我有这样的代码:

代码语言:javascript
复制
import RPi.GPIO as GPIO
import sys
from time import sleep
import Tkinter as tk

GPIO.setmode(GPIO.BOARD)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)

def forward(event):
    GPIO.output(13, GPIO.HIGH)
    sleep(0.2)
    GPIO.output(13, GPIO.LOW)

def back(event):
    GPIO.output(15, GPIO.HIGH)
    sleep(0.2)
    GPIO.output(15, GPIO.LOW)

def right(event):
    GPIO.cleanup()

def left(event):
    print("a")

def key_input(event):

    print 'Key:', event.char    
    key_press = event.char    
    sleep_time = 0.030

    if key_press.lower() == 'w':    
        forward(sleep_time)

    elif key_press.lower() == 's':    
        back(sleep_time)

    elif key_press.lower() == 'a':    
        left(sleep_time)

    elif key_press.lower() == 'd':    
        right(sleep_time)

root = tk.Tk()    
root.bind('<KeyPress>', key_input)    
root.mainloop()

当我在我的b3上运行它时,我有很大的滞后。如何改进代码运行不滞后,或如何改变它,以控制电机与我的键盘?

我只想让我的车向前,向后,向右,向左.我搜索它,我发现最常用的方法是用tkinter.

这是未完成的代码,只适用于一个马达。我试着使用新闻/发布事件,但不起作用。谁来帮帮我!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-12 13:47:54

您不应该在gui程序中使用time.sleep,这就是您的延迟的来源,您也在传递期望某个事件的时间,然后无论如何忽略它?

代码语言:javascript
复制
import RPi.GPIO as GPIO
import sys
import Tkinter as tk

GPIO.setmode(GPIO.BOARD)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.bind('<KeyPress>', self.KeyDown)
        self.bind('<KeyRelease>', self.KeyUp)

    def KeyDown(self, event):
        if event.char:
            k = event.char.lower()
            if k == 'w':
                GPIO.output(13, GPIO.HIGH)
            elif k == 'a':
                GPIO.output(15, GPIO.HIGH)
            elif k == 's':
                pass
            elif k == 'd':
                pass

    def KeyUp(self, event):
        if event.char:
            k = event.char.lower()
            if k == 'w':
                GPIO.output(13, GPIO.LOW)
            elif k == 'a':
                GPIO.output(15, GPIO.LOW)
            elif k == 's':
                GPIO.cleanup()
            elif k == 'd':
                print("a")

if __name__ == '__main__':
    app = App()
    app.mainloop()

如果你把新闻和发布事件分开,你可以在你按下键的时候打开马达,当你释放它的时候关闭它,这应该可以消除你的大部分滞后。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43821585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档