【问题标题】:Hide non-standard python user input隐藏非标准 python 用户输入
【发布时间】:2022-01-06 08:09:34
【问题描述】:

我正在创建一个控制台游戏,它需要用户按键。

我在隐藏字母时遇到了麻烦,这些字母仅仅因为用户按下了一个按钮而散布在屏幕上。

它不适用于getpass 之类的模块,我已经尝试了各种 ANSI 代码来尝试隐藏文本。背景也充满了文本字符和符号,因此停止只是一个完整的 ANSI 字符消失。我也不想每帧都调用os.system("clear"),因为即使每秒调用一次也会导致终端出错。

我想知道的是,是否有一种方法可以在没有所述键出现在控制台上的情况下捕捉按键

这是我正在使用的板子类,里面的draw()方法是我一直将它绘制到终端的方式:

class board:
  def __init__(self,length):
    import random
    self.random=random
    self.characters=[" ","░","▒","▓","█"]
    self.length=length
    self.dithering=False
    self.board=[[self.random.choice(self.characters) for y in range(self.length)] for x in range(self.length)]
  def draw(self,colour=None):
    if colour==None:
      colour=RGB(0,1,0)
    for x in range(len(self.board)):
      for y in range(len(self.board)):
        if self.board[y][x]==None:
          continue
        f=1
        if self.dithering==True:
          f=self.random.random()+0.5 # faintness
        print(f"\u001b[{y};{x*2+1}H\x1b[38;2;{int(colour.r*f)};{int(colour.g*f)};{int(colour.b*f)}m{str(self.board[y][x])*2}",end="")
    print("\x1b[0m")
  def redecorate(self,characters=None):
    if characters==None:
      characters=self.characters
    self.board=[[self.random.choice(characters) for y in range(self.length)] for x in range(self.length)]
  def empty(self):
    self.board=[[None for y in range(self.length)] for x in range(self.length)]

class RGB:
  def __init__(self,r,g,b):
    self.r=r*255
    self.g=g*255
    self.b=b*255

【问题讨论】:

  • 我不明白你的问题。你想捕捉用户的按键而不显示它们吗?请让你的问题更容易理解。
  • @UltraStudioLTD 对不起,混乱。是的,我想捕捉按键而不显示它们。

标签: python input terminal


【解决方案1】:

要捕捉按键而不显示它们,您需要 getch 功能。在 Windows 上,您可以使用 msvcrt 模块来捕获它,而在 Unix-like 和 Linux 平台上,您需要自己实现,虽然很简单。

这是 Windows 的代码:

from msvcrt import getch

对于 Linux 和 类 Unix 平台:

import sys
import termios
import tty
def getch() -> str:
    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

注意:有些键的长度超过 1 个字符(例如 3 个字符长的箭头键),因此您需要运行 getch 几次才能完全捕获它.

【讨论】:

  • 那么,为了弄清楚这一点,我需要在程序之前运行这个函数,它会使按键字符对整个程序不可见?
  • 没关系,我明白了。感谢您的帮助
  • 抱歉回复晚了,已经是晚上了。答案是否定的。这个函数的作用是不太可能的 input 或 sys.stdin.read* 在调用时只从 sys.stdin 获取一个字符并返回它不显示该字符。
猜你喜欢
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 2017-06-27
相关资源
最近更新 更多