将键盘模块和乌龟一起使用时出现问题

时间:2019-05-30 07:22:47

标签: python python-3.x multithreading turtle-graphics

我正在编写一个脚本来读取击键并在乌龟中绘制简单的形状。 要记录击键,我正在使用keyboard模块,并且正在使用turtle进行绘制。

由于在keyboard模块中使用了线程,我感到很震惊。

我当前正在做的是-

  1. 我使用keyboard.add_hotkey方法添加了热键。
  2. 如果我按某个键,则该字母将添加到列表(名为data)中以备后用。
  3. 当我按Ctrl + Shift + S组合键时,将调用保存功能。在保存功能中,实例化了一个乌龟窗口,并且列表data一次弹出一个字母。根据弹出的字母绘制形状。
  4. 当列表为空时,我保存图形并关闭乌龟窗口。

我面临的问题是,一旦调用save函数,该程序将停止监听其他调用。可能是由于在keyboard模块中使用了线程。

代码附在此处-

def start():
    #turtle.mainloop()
    s=turtle.Screen().setup( width = WIDTH, height = HEIGHT, startx = 0, starty = 0)
    global t
    t=turtle.Turtle()
    turtle.ht()
    t.ht()

def save():

    start()
    global t
    global data
    t.speed(0)

    while data:
        fun = data.pop()

        if fun=='c':
            draw_circle()
        elif fun=='r':
            draw_rectangle()
        elif fun=='p':
            draw_polygon()
        elif fun=='h':
            draw_hexagon()
        elif fun=='t':
            draw_triangle()
        elif fun=='m':
            draw_pentagon()

    ts = turtle.getscreen()
    ts.getcanvas().postscript(file="drawing.eps")
    img = Image.open('drawing.eps')
    img.save('drawing.png')
    turtle.bye()

def push_fun(fun):
    data.append(fun)

if __name__=='__main__':
    keyboard.add_hotkey('ctrl+shift+s', save)
    keyboard.add_hotkey('ctrl+shift+e', exit)
    keyboard.add_hotkey('ctrl+shift+p', send_to_server)
    # keyboard.add_hotkey('ctrl+shift+s', save, args=(data))
    keyboard.add_hotkey('c', push_fun, args=('c',))
    keyboard.add_hotkey('s', push_fun, args=('t',))
    keyboard.add_hotkey('h', push_fun, args=('h',))
    keyboard.add_hotkey('p', push_fun, args=('p',))
    keyboard.add_hotkey('r', push_fun, args=('r',))
    keyboard.wait()

调用save函数后,程序保留在keyboard.wait()部分中,但不收听其他任何按键。

1 个答案:

答案 0 :(得分:0)

您可以通过设置按键来结束等待,例如:

keyboard.wait('space')

但是没有给出任何键的keyboard.wait()会永远阻止所有击键

我不确定你为什么把它放在那儿,我什至不确定为什么它会捡起任何东西,但是我认为你可以做到这一点:

if __name__=='__main__':
    '''your keystrokes'''
    while True: #or set a timer or something
        pass

您没有给我完整的代码,所以我无法确定它是否有效

您还需要在push_fun函数中全局列表数据

我希望这会有所帮助:)