Python实现控制台实时检测用户按下的功能键

本教程使用到的第三方库为keyboard,相同的教程网上有很多,这里只是总结一下自己在做控制台的贪吃蛇时的经验而已,使用到的方法为keyboard.hook()函数,具体代码如下:

  import keyboard
  from until.keyCode import KeyCode


  @staticmethod
  def getKeyCode(function):
      keyCode = ord(function.name[0])    # 这里获取到的按键字母一定是小写的,所以下方使用的也是小写字母,具体说明可以看下KeyCode.KeyboardEvent函数中的注释信息
      if keyCode == KeyCode.w:
          return 1
      elif keyCode == KeyCode.s:
          return 2
      elif keyCode == KeyCode.a:
          return 3
      elif keyCode == KeyCode.d:
          return 4
      else:
          return 0

  def userInput(self):
        def changeSnakeDirection(direction):
            """
            改变蛇的移动方向
            :param direction: 用户输入的方向
            :return:
            """
            direction = self.getKeyCode(direction)  # 获取用户按下的按键
            if direction == 0:
                return
            elif direction == self.snake.dir:
                return
            elif direction == 1 and self.snake.dir == 2:
                return
            elif direction == 2 and self.snake.dir == 1:
                return
            elif direction == 3 and self.snake.dir == 4:
                return
            elif direction == 4 and self.snake.dir == 3:
                return
            self.snake.dir = direction

        keyboard.hook(changeSnakeDirection)

注:getKeyCode()函数中的KeyCode类为我自己封装的一个类,里面主要是各个字母a-z,A-Z的ascii码的int值,使用数值类型的数据进行比对,效率会高那么一些。具体效果如下:

对了,图中之所以看不到光标以及输入的内容,是因为使用了cursor库下的hied()函数进行了隐藏,之后再使用show()函数即可试光标重新开始显示。

YX9010_0@的第十七篇文章

                                                                                                             2022/9/20

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以通过递归函数来实现通用的多级菜单功能,以下是一个简单的示例代码: ```python menu = { '1': { 'name': '菜单1', 'action': lambda: print('执行菜单1操作') }, '2': { 'name': '菜单2', 'action': lambda: print('执行菜单2操作') }, '3': { 'name': '菜单3', 'sub': { '1': { 'name': '子菜单1', 'action': lambda: print('执行子菜单1操作') }, '2': { 'name': '子菜单2', 'action': lambda: print('执行子菜单2操作') } } } } def print_menu(menu, level=0): for key, item in menu.items(): print(' ' * level + key + ': ' + item['name']) if 'sub' in item: print_menu(item['sub'], level+1) while True: print_menu(menu) choice = input('请选择菜单:') if choice in menu: action = menu[choice].get('action') if action: action() elif 'sub' in menu[choice]: sub_menu = menu[choice]['sub'] print_menu(sub_menu) sub_choice = input('请选择子菜单:') if sub_choice in sub_menu: sub_action = sub_menu[sub_choice].get('action') if sub_action: sub_action() elif choice == 'q': break else: print('输入错误,请重新选择!') ``` 以上代码中,`menu` 变量是一个嵌套字典,其中每个菜单项都包含一个名称和一个可选的操作函数,以及一个可选的子菜单。 `print_menu` 函数用于打印菜单项,递归处理子菜单。`level` 参数用于控制缩进,以区分不同级别的菜单项。 在主循环中,先打印菜单,然后等待用户选择菜单项。如果用户选择了一个有操作函数的菜单项,则执行该函数。如果用户选择了一个有子菜单的菜单项,则打印该子菜单并等待用户选择子菜单项。用户输入 `q` 时退出程序。 ### 回答2: Python可以通过编写递归函数来实现通用多级菜单功能。 首先,我们可以定义一个菜单列表,其中每个菜单项包括菜单名称和对应的操作或子菜单。例如: ```python menu = [ { 'name': '菜单1', 'action': '执行操作1' }, { 'name': '菜单2', 'action': '执行操作2' }, { 'name': '菜单3', 'sub_menu': [ { 'name': '子菜单1', 'action': '执行子菜单1操作' }, { 'name': '子菜单2', 'action': '执行子菜单2操作' } ] } ] ``` 然后,我们可以编写一个递归函数来显示菜单并获取用户输入的选项。该函数可以接受一个菜单列表作为参数,并逐级显示菜单。 ```python def show_menu(menu): print('请选择菜单:') for i, item in enumerate(menu): print(f'{i + 1}. {item["name"]}') choice = int(input('请选择:')) if 1 <= choice <= len(menu): selected_item = menu[choice - 1] if 'action' in selected_item: print(f'正在执行操作:{selected_item["action"]}') elif 'sub_menu' in selected_item: show_menu(selected_item['sub_menu']) else: print('无效的选择,请重新选择。') ``` 最后,我们可以调用show_menu函数来展示整个多级菜单。 ```python show_menu(menu) ``` 这样,用户就可以通过控制台选择不同的菜单项,并执行对应的操作或进入子菜单。递归函数的使用使得菜单功能可以无限级别的嵌套。 ### 回答3: Python实现通用多级菜单功能可以通过嵌套字典和递归函数来实现。首先,使用一个字典来表示菜单,键为菜单选项,值为子菜单或操作。 当用户选择某个菜单选项时,程序会检查该选项对应的值。如果是一个字典,说明还有子菜单,程序会递归调用自身,显示子菜单,并等待用户选择子菜单的选项。如果是一个操作,程序会执行该操作。 具体实现步骤如下: 1. 定义一个函数print_menu(menu),用于显示当前菜单选项,并等待用户输入。在函数内部,使用for循环遍历菜单的键,打印选项以及对应的数字编号。 2. 获取用户输入的数字,判断是否在菜单选项的数字范围内。如果不在范围内,提示用户重新输入。 3. 根据用户选择的数字,在菜单字典中找到对应的值,判断其类型。 4. 如果是字典,说明还有子菜单,程序递归调用print_menu函数,参数为该字典。 5. 如果是操作,程序执行该操作。 6. 在主程序中,初始化菜单字典,并不断循环调用print_menu函数。 以下是示例代码: ```python # 定义菜单字典 menu = { "1": "显示子菜单", "2": "执行操作", "3": "退出" } # 定义函数打印菜单并获取用户输入 def print_menu(menu): for key, value in menu.items(): print(key + ". " + value) choice = input("请输入选项的数字:") while choice not in menu.keys(): print("无效的选项,请重新输入") choice = input("请输入选项的数字:") return choice # 定义操作函数 def execute_operation(): print("执行操作") # 主程序 while True: choice = print_menu(menu) if choice == "1": # 子菜单示例 sub_menu = { "1": "子菜单选项1", "2": "子菜单选项2", "3": "返回上级菜单" } while True: sub_choice = print_menu(sub_menu) if sub_choice == "1": print("执行子菜单选项1") elif sub_choice == "2": print("执行子菜单选项2") elif sub_choice == "3": break elif choice == "2": execute_operation() elif choice == "3": break ``` 以上代码实现了一个简单的多级菜单功能,可以根据实际需求扩展菜单选项和操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值