【问题标题】:Unfamiliar with Tkinter不熟悉 Tkinter
【发布时间】:2015-06-05 20:12:22
【问题描述】:

现在我有一个 Raspberry pi(B+) 连接到一个由 gpio 值操作的电机控制器 (L928n)。我是python的初学者。电机控制器正在控制遥控卡车电机。 “W”向前,“A”向左,“D”向右,“S”停止。脚本不起作用..我做错了什么? Tkinter 还可以确定何时按下而不是按下某个键?不确定 Tkinter 是否应该用于此类项目。也许 pygame 会更好?

#!/usr/bin/python2.7
import RPi.GPIO as gpio
import time
import sys
import Tkinter as tk 

def init():

   gpio.setmode(gpio.BOARD)
   gpio.setup(7, gpio.OUT)
   gpio.setup(11, gpio.OUT)
   gpio.setup(13, gpio.OUT)
   gpio.setup(15, gpio.OUT)
   gpio.setup(3, gpio.OUT)
   gpio.output(3, False)

def forward(tf):
    gpio.output(7, True)
    gpio.output(11, False)
    gpio.output(13, False)
    gpio.output(15, False)
    time.sleep(tf)
    gpio.cleanup

def stop(tf):
    gpio.output(7, False)
    gpio.output(11, False)
    gpio.output(13, False)
    gpio.output(15, False)
    time.sleep(tf) 
    gpio.cleanup()

def left(tf):
    gpio.output(7, True)
    gpio.output(11, False)
    gpio.output(13, False)
    gpio.output(15, False)
    time.sleep(tf)
    gpio.cleanup()

def right(tf):
    gpio.output(7, False)
    gpio.output(11, True)
    gpio.output(13, False)
    gpio.output(15, False)
    time.sleep(tf)
    gpio.cleanup()

def reverse(tf):
    gpio.output(7, False)
    gpio.output(11, True)
    gpio.output(13, False)
    gpio.output(15, False)
    time.sleep(tf)
    gpio.cleanup()          

def key_input(event):
    init()
    print 'Key:',event.char
    key_press = event.char

def key_press(event):
    init()
    key_press == event.char
    sleep_time = 0.030

if key_press == 'w':
    forward(sleep_time)
elif key_press == 's':
    stop(key_press)
elif key_press == 'a': 
    left()
elif key_press == 'd':
    right(sleep_time)
elif key_press == 'x':
    reverse(key_press)

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

【问题讨论】:

    标签: python tkinter raspberry-pi gpio


    【解决方案1】:

    以下语句块:

    if key_press == 'w':
        forward(sleep_time)
    elif key_press == 's':
        stop(key_press)
    elif key_press == 'a': 
        left()
    elif key_press == 'd':
        right(sleep_time)
    elif key_press == 'x':
        reverse(key_press)
    

    永远不会执行,因为它位于缩进的最外层,只能读取一次(就在函数定义之后)。您需要正确缩进并将其包含在适当的key_presskey_input 函数中。

    编辑:

    def key_input(event):
        init()
        print 'Key:',event.char
        key_press = event.char
        checkKeyPress(key_press)
    
    def key_press(event):
        init()
        key_press == event.char
        sleep_time = 0.030 
        checkKeyPress(key_press)
    
    def checkKeyPress(key_press):
        if key_press == 'w':
            forward(sleep_time)
        elif key_press == 's':
            stop(key_press)
        elif key_press == 'a': 
            left()
        elif key_press == 'd':
            right(sleep_time)
        elif key_press == 'x':
            reverse(key_press)
    

    我认为你的错误是你认为对 key_press() 的函数调用是某种goto - 它不是。该函数被调用,在它结束后,您会准确跳转到代码中调用它的位置。您还应该阅读一下 Python 中的变量作用域。

    【讨论】:

    • 感谢您的宝贵时间。正常的缩进是什么样子的?我是一个非常直观的学习者......你能纠正这个问题吗?这样下次就记不住了。
    【解决方案2】:

    我通过使用 Tkinter 以外的东西解决了这个问题...

    #!/usr/bin/env python 
    import RPi.GPIO as gpio
    import time, sys
    
    class _Getch:
        def __init__(self):
            try:
                self.impl = _GetchWindows()
            except ImportError:
                self.impl = _GetchUnix()
    
        def __call__(self): return self.impl()
    
    class _GetchUnix:
        def __init__(self):
            import tty, sys
    
        def __call__(self):
            import sys, tty, termios
            fd = sys.stdin.fileno()
            old_settings = termios.tcgetattr(fd)
            try:
                tty.setraw(sys.stdin.fileno())
                ch = sys.stdin.read(1)
            finally:
                termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
            return ch
    
    class _GetchWindows:
        def __init__(self):
            import msvcrt
    
        def __call__(self):
            import msvcrt
            return msvcrt.getch()
    
    def Setup():
        gpio.setmode(gpio.BCM)
    
        #right
        gpio.setup(4, gpio.OUT)
        gpio.setup(17, gpio.OUT)
        gpio.setup(23, gpio.OUT)
        gpio.setup(24, gpio.OUT)
        gpio.setup(22, gpio.OUT)
    
        #right init are just "on"
        gpio.output(22, True)
    
        #left
        gpio.setup(12, gpio.OUT)
        gpio.setup(16, gpio.OUT)
        gpio.setup(18, gpio.OUT)
    
    
    def QuitIt():
        sys.exit()
    
    def getInput():
        got = int(raw_input('--> '))
        return got
    
    # Right Forward gpio.output(15, True)
    # Right Reverse gpio.output(13, True)
    
    # Left  Forward gpio.output(18, True)
    # Left  Reverse gpio.output(22, True)
    
    
    def action(key):
        global delay
        if key == 'w':
            print "Forward"
            gpio.output(23, True)
            gpio.output(24, True)
            time.sleep(delay)
            gpio.output(23, False)
            gpio.output(24, False)
    
        if key == 's':
            print "Reverse"
            gpio.output(23, True)
            gpio.output(24, True)
            time.sleep(delay)
            gpio.output(23, False)
            gpio.output(24, False)
    
        if key == 'a':
            print "Left Pivot"
            gpio.output(4, False)
            gpio.output(17, True)
            time.sleep(delay)
            gpio.output(4, False)
            gpio.output(17, False)
    
        if key == 'd':
            print "Right Pivot"
            gpio.output(23, True)
            gpio.output(24, True)
            time.sleep(delay)
            gpio.output(23, False)
            gpio.output(24, False)
    
        if key == 'l':
            delay = delay + 0.1
            print ("Delay Up: " + str(delay))
    
        if key == 'k':
            delay = delay - 0.1
            print ("Delay Dw: " + str(delay))
    
        if key == 'q':
            print "Quit"
            QuitIt()
    
    delay = 0.2
    
    getch = _Getch()
    
    Setup()
    
    while True:
        action(getch())
    

    【讨论】:

      猜你喜欢
      • 2017-08-03
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多