0

我正在制作一个蛇游戏,它要求玩家在WASD不停止游戏进程的情况下按下按键来获取玩家的输入。所以我不能input()用于这种情况,因为这样游戏就会停止滴答作响以获取输入。

我发现了一个getch()无需按回车即可立即提供输入的功能,但此功能也会停止游戏滴答以获取类似input(). 我决定使用线程模块通过getch()不同的线程获取输入。问题是 getch() 在不同的线程中不起作用,我不知道为什么。

import threading, time
from msvcrt import getch

key = "lol" #it never changes because getch() in thread1 is useless

def thread1():
    while True:
        key = getch() #this simply is almost ignored by interpreter, the only thing it
        #gives is that delays print() unless you press any key
        print("this is thread1()")

threading.Thread(target = thread1).start()

while True:
    time.sleep(1)
    print(key)

那么为什么getch()在它的时候没用thread1()呢?

4

2 回答 2

5

问题是您在key内部创建了一个局部变量,thread1而不是覆盖现有的变量。快速简便的解决方案是声明key为 global inside thread1

最后,您应该考虑使用锁。我不知道这是否有必要,但我想如果你尝试key在线程中写入一个值同时打印出来,可能会发生奇怪的事情。

工作代码:

import threading, time
from msvcrt import getch

key = "lol"

def thread1():
    global key
    lock = threading.Lock()
    while True:
        with lock:
            key = getch()

threading.Thread(target = thread1).start()

while True:
    time.sleep(1)
    print(key)
于 2012-12-26T17:30:38.653 回答
0

我尝试使用 getch 但它对我不起作用......(这里是win7)。

您可以尝试使用 tkinter 模块 // 但我仍然无法使其与线程一起运行

# Respond to a key without the need to press enter
import tkinter as tk    #on python 2.x use "import Tkinter as tk"

def keypress(event):
    if event.keysym == 'Escape':
        root.destroy()
    x = event.char
    if x == "w":
        print ("W pressed")
    elif x == "a":
        print ("A pressed")
    elif x == "s":
        print ("S pressed")
    elif x == "d":
        print ("D pressed")
    else:
        print (x)

root = tk.Tk()
print ("Press a key (Escape key to exit):")
root.bind_all('<Key>', keypress)
# don't show the tk window
root.withdraw()
root.mainloop()

正如 Michael0x2a 所说,您可以尝试使用为游戏制作而制作的库 - pygame 或 pyglet。

@EDIT @Michael0x2a:你确定你的代码有效吗?无论我按什么,它总是打印相同的键。

@EDIT2:谢谢!

于 2012-12-26T17:29:51.813 回答