在Python中获取单个字符作为输入,而无需按Enter键(类似于C ++中的getch)

萨基卜·汗

首先,我刚开始学习它,因此对Python完全陌生。我对C ++有很多了解,而我只是想在Python中实现其中一些。

我已经对其进行了相当多的搜索,但是找不到符合我要求的解决方案。请看下面的代码,

import os

class _Getch:
    """Gets a single character from standard input.  Does not echo to the
screen."""
    def __init__(self):
    try:
        self.impl = _GetchWindows()
    except:
        print("Error!")
    def __call__(self): return self.impl()

class _GetchWindows:
    def __init__(self):
        import msvcrt

    def __call__(self):
        import msvcrt
        return msvcrt.getch()



def mainfun():
    check = fh = True
    while check:
        fh = True
        arr = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
        print ("Welcome to Tic Tac Toe Game!!!\n\n")
        print("Enter 1 to Start Game")
        print("Enter 2 to Exit Game")
        a = _Getch()
        if a == "1":
            while fh:
                os.system("cls")
                drawboard()
                playermove()
                fh = checkresult()
        elif a == "2":
            break
       

如您所见,我在这里要执行的操作是要求用户按下1和2之间的数字,然后将该数字存储在“ a”中,然后将其用于我的要求。

现在,我首先尝试使用它,

    input('').split(" ")[0]

但这没有用。它要求我在键入1或2后始终按Enter键。因此,这不起作用。

然后我找到了Getch的此类,并实现了它。长话短说,它使我陷入了永无止境的循环,而我的结果现在是这样的,

Welcome to Tic Tac Toe Game!!!


Enter 1 to Start Game
Enter 2 to Exit Game

Press Enter to Continue....
Welcome to Tic Tac Toe Game!!!


Enter 1 to Start Game
Enter 2 to Exit Game

Press Enter to Continue....
Welcome to Tic Tac Toe Game!!!


Enter 1 to Start Game
Enter 2 to Exit Game

Press Enter to Continue....

而且这是一个永无止境的循环...即使我按下“ 1”或“ 2”之类的任何键,它仍然不会停止并继续执行此操作,并且不会输入任何功能。

我想要的是与此类似的功能,

  1. 它应该可以在PYCHARM控制台上运行(我正在练习,但是我不想在Terminal上练习。我习惯于使用正在使用的IDE的控制台)
  2. 它会暂停并等待用户输入任何输入(就像输入一样)
  3. 它接受用户输入的第一个键并将其存储到变量中。像在这种情况下一样,如果用户按下“ 1”,则它应该将该字符存储在“ a”中并继续前进。您不必按“ ENTER”继续。
  4. 如果用户按下任何其他按钮,例如“ a”或“ b”或类似的按钮,它将完全不执行任何操作,并继续要求输入,直到输入了所需的数字“ 1”或“ 2”为止(我认为可以很容易地在while循环中处理)

换句话说,我只想要Python中C ++的getch()命令的替代方法。我已经做了很多尝试来找到它,但是没有找到。请问我一个问题,该问题可以为该确切问题提供解决方案,或者在此处提供解决方案。谢谢。

编辑:请注意,这不是完整的代码。我只提供了相关的代码。如果有人需要查看整个代码,我也很乐意分享。

完整的代码如下,

import os
import keyboard
def getch():
    alphabet =  list(map(chr, range(97, 123)))
    while True:
        for letter in alphabet: # detect when a letter is pressed
            if keyboard.is_pressed(letter):
                return letter
        for num in range(10): # detect numbers 0-9
            if keyboard.is_pressed(str(num)):
                return str(num)

arr = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
playerturn = 1
def drawboard():
    global playerturn
    print("Player 1 (X) - Player 2 (O)\n")
    print("Turn: Player " + str(playerturn))
    print("\n")
    for i in range(3):
        print (" ", end='')
        for j in range(3):
            print(arr[i][j], end='')
            if j == 2:
                continue
            print("  | ", end='')
        if i == 2:
            continue
        print("")
        print("____|____|____")
        print("    |    |    ")

def playermove():
    global playerturn
    row = col = 0
    correctmove = False
    print("\n\nMake your Move!\n")
    while not correctmove:
        row = int(input("Enter Row: "))
        col = int(input("Enter Col: "))
        if (3 > row > -1) and (-1 < col < 3):
            for i in range(3):
                for j in range(3):
                    if arr[row][col] == 0:
                        correctmove = True
                        if playerturn == 1:
                            arr[row][col] = 1
                        else:
                            arr[row][col] = 2
                        playerturn += 1
                        if playerturn > 2:
                            playerturn = 1


        if not correctmove:
            print ("Wrong Inputs, please enter again, ")

def checkwin():
    for player in range(1, 3):
        for i in range(3):
            if arr[i][0] == player and arr[i][1] == player and arr[i][2] == player: return player
            if arr[0][i] == player and arr[1][i] == player and arr[2][i] == player: return player
        if arr[0][0] == player and arr[1][1] == player and arr[2][2] == player: return player
        if arr[0][2] == player and arr[1][1] == player and arr[2][0] == player: return player
    return -1

def checkdraw():
    for i in range(3):
        for j in range(3):
            if arr[i][j] == 0:
                return False
    return True



def checkresult():
    check = checkwin()
    if check == 1:
        os.system('cls')
        drawboard()
        print("\n\nPlayer 1 has won the game!!\n")
    elif check == 2:
        os.system('cls')
        drawboard()
        print("\n\nPlayer 2 has won the game!!\n")
    elif check == 3:
        os.system('cls')
        drawboard()
        print("\n\nThe game has been drawn!!\n")
    else:
        return True
    return False

def mainfun():
    check = fh = True
    while check:
        os.system("cls")
        fh = True
        arr = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
        print ("Welcome to Tic Tac Toe Game!!!\n\n")
        print("Enter 1 to Start Game")
        print("Enter 2 to Exit Game")
        a = getch()
        if a == "1":
            while fh:
                os.system("cls")
                drawboard()
                playermove()
                fh = checkresult()
        elif a == "2":
            break
        print ("Press any key to continue...")
        getch()

mainfun()

EDIT2:通过使用键盘模块解决了问题...下一个问题是在调用getch()函数后如何删除存储在输入缓冲区中的数据?因为缓冲区中的数据正显示在下一个输入中(当我输入行和列时),所以我不希望发生这种情况。我喜欢Linux而不是Windows(或Pycharm)的解决方案

悦蓝

看来此功能不在标准python库中,但您可以重新创建它。

首先,安装模块“键盘”

 $ pip3 install keyboard

然后,您可以使用keyboard.is_pressed()查看是否按下了任何一个字符。

import keyboard  # using module keyboard
import string # use this to get the alphabet

print("Input a character")

def getch():
    alphabet = list(string.ascii_lowercase)
    while True:
        for letter in alphabet: # detect when a letter is pressed
            if keyboard.is_pressed(letter):
                return letter
        for num in range(10): # detect numbers 0-9
            if keyboard.is_pressed(str(num)):
                return str(num)

answer = getch()

print("you choose " + answer)

编辑:对于unix,您需要使用sudo运行脚本。此代码在Windows上应该可以正常工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C中输入单个字符

来自分类Dev

使用 getch 在 python 中检测按键时出现问题

来自分类Dev

如何在C中显示_getch()char的Integer值?

来自分类Dev

将char *作为单个字符读取(在C中)

来自分类Dev

无法确定在FASM中调用`_getch`之前必须将什么内容推入堆栈

来自分类Dev

C ++输入结构:_getch()

来自分类Dev

如何从输入中读取单个字符作为u8?

来自分类Dev

C中是否有类似于SQL中的LIKE的函数来比较2个字符串?

来自分类Dev

从C中的字符串数组中获取单个字符

来自分类Dev

无法在字符串中获取单个字符

来自分类Dev

getch()返回错误的字符

来自分类Dev

禁用文本框中单个字符的输入

来自分类Dev

C中的getchar()无需按Enter即可完成

来自分类Dev

检查用户是否在文本框中输入单个字符或数字c#

来自分类Dev

检查用户是否在文本框中输入单个字符或数字c#

来自分类Dev

如何从edittext中获取单个字符串?

来自分类Dev

从 XML 数组中获取单个字符串

来自分类Dev

python连接字符串中的单个字符

来自分类Dev

在Windows资源管理器的右窗格中打开文件夹列表,而无需按Enter键

来自分类Dev

在Excel中应用新的单元格值,而无需按Enter或移动焦点

来自分类Dev

Python:替换字典值中的单个字符

来自分类Dev

如何在C中扫描单个字符?

来自分类Dev

将char *读取为单个字符(在C中)

来自分类Dev

Python 获取原始输入并在具有多个字符的行中搜索它

来自分类Dev

像 Emacs 和 Nano 这样的程序如何在终端中运行时获取用户输入,而无需用户按 Enter 键?

来自分类Dev

如何正确传递单个字符作为对C中另一个方法的引用

来自分类Dev

从列表中删除单个字符

来自分类Dev

在Vim中插入单个字符?

来自分类Dev

从列表中删除单个字符

Related 相关文章

  1. 1

    在C中输入单个字符

  2. 2

    使用 getch 在 python 中检测按键时出现问题

  3. 3

    如何在C中显示_getch()char的Integer值?

  4. 4

    将char *作为单个字符读取(在C中)

  5. 5

    无法确定在FASM中调用`_getch`之前必须将什么内容推入堆栈

  6. 6

    C ++输入结构:_getch()

  7. 7

    如何从输入中读取单个字符作为u8?

  8. 8

    C中是否有类似于SQL中的LIKE的函数来比较2个字符串?

  9. 9

    从C中的字符串数组中获取单个字符

  10. 10

    无法在字符串中获取单个字符

  11. 11

    getch()返回错误的字符

  12. 12

    禁用文本框中单个字符的输入

  13. 13

    C中的getchar()无需按Enter即可完成

  14. 14

    检查用户是否在文本框中输入单个字符或数字c#

  15. 15

    检查用户是否在文本框中输入单个字符或数字c#

  16. 16

    如何从edittext中获取单个字符串?

  17. 17

    从 XML 数组中获取单个字符串

  18. 18

    python连接字符串中的单个字符

  19. 19

    在Windows资源管理器的右窗格中打开文件夹列表,而无需按Enter键

  20. 20

    在Excel中应用新的单元格值,而无需按Enter或移动焦点

  21. 21

    Python:替换字典值中的单个字符

  22. 22

    如何在C中扫描单个字符?

  23. 23

    将char *读取为单个字符(在C中)

  24. 24

    Python 获取原始输入并在具有多个字符的行中搜索它

  25. 25

    像 Emacs 和 Nano 这样的程序如何在终端中运行时获取用户输入,而无需用户按 Enter 键?

  26. 26

    如何正确传递单个字符作为对C中另一个方法的引用

  27. 27

    从列表中删除单个字符

  28. 28

    在Vim中插入单个字符?

  29. 29

    从列表中删除单个字符

热门标签

归档