有没有办法从用户输入读取一个单个字符?例如,他们在终端按一个键然后返回(有点像getch()).我知道Windows中有一个功能,但我想要一些跨平台的功能.
简短的摘要:
我正在尝试创建一个程序,将键盘事件发送到计算机,为了所有目的,模拟事件应被视为键盘上的实际击键.
原帖:
我正在寻找一种使用python生成键盘事件的方法.
假设函数接收到必须模拟按下的键,如下所示:
keyboardevent('a') #lower case 'a'
keyboardevent('B') #upper case 'B'
keyboardevent('->') # right arrow key
def keyboardevent(key):
#code that simulated 'key' being pressed on keyboard
Run Code Online (Sandbox Code Playgroud)
以上显然是示例,但我正在寻找的是库,模块或其他,我可以用它来模拟键盘事件.
注意:这与将字符发送到记事本,或将文本输入字段等不同.我希望python脚本模拟一个实际的键盘事件,计算机会认为确实存在键盘事件.
额外注意:
我不想将键击发送到活动窗口 - 我希望系统能够相信键盘的按键被按下,微妙的区别,因为一些活动窗口不接受某些键组合,或者我想使用键盘快捷键对于通过我的脚本的后台进程,他们不需要通过活动窗口
到目前为止,我已经看过这些事情:
这些都是关于苹果的,并没有任何帮助.
还有这个:
这似乎可能是我需要的,但我找不到它的库或任何文档.
我也搜索了更多的地方,但还没有找到解决方案.
我正在使用CGEventCreateKeyboardEvent并需要知道CGKeyCode要使用的值.
具体来说,我是关键的密钥代码Command.文档提供了其他键的示例:zis 6,shiftis 56.
某处必须有Mac虚拟键码列表?
我在python中制作秒表类型程序,我想知道如何检测是否按下了一个键(例如p表示暂停,s表示停止),我不希望它像raw_input那样等待用户在继续执行之前的输入.任何人都知道如何在while循环中执行此操作?
另外,我想制作这个跨平台,但如果不可能,那么我的主要开发目标是linux
在OS X上使用Python移动鼠标(并可能单击)的最简单方法是什么?
这仅适用于快速原型设计,它不一定非常优雅.
据我所知,此问题之前已被提出,但仍然缺乏答案.所以我再次提出这个问题,以便最终得到这个问题的答案.(如果我错了,请给我答案的网址.)
问题:程序员希望用户输入密码.在将getpass()函数就是为了这个目的很好,但它的使用有一个缺点:当输入密码没有打印到标准输出.
问题:如何在为用户键入的每个字符打印星号时实现getpass()?(当然,退格 -甚至是POS1和结束 -应采取相应的照顾.)
动机:社区中有人不理解为什么要问这个问题.然后用a)引用getpass(),这样忽略了手头的任务,b)没有考虑那个引用不会回答问题.之所以可能希望打印星号是为了方便用户:他们在密码输入期间获得直接的视觉响应.因此,他们不会因按键而感到困惑,而且 - 在那里 - 似乎没有任何事情发生.
迈向解决方案的一步:
让我在这里向解决方案迈出第一步.请帮忙,以便将其演变成真正的解决方案.
有一个名为getch的模块似乎允许从stdin逐字符读取.Backspace非常奇怪地映射到127的整数值,但是这样的解决方案可能如下所示:
def readLineWithAsterisks():
sBuffer = ''
while True:
c = getch.getch()
if c == '\n':
return sBuffer
elif ord(c) == 127:
if len(sBuffer) > 0:
sys.stdout.write('\x08 \x08')
sys.stdout.flush()
sBuffer = sBuffer[0:-1]
continue
else:
sys.stdout.write('*')
sys.stdout.flush()
sBuffer += c
Run Code Online (Sandbox Code Playgroud)
但是这段代码有一些缺点.首先,我非常困惑c如果进入退格,则不是'\ b' .也许这样有解释?仅处理第二个ASCII字符,至少在Linux上是这样.我在这里不了解Windows,但如果按下A-Z0-9以外的字符,则行c = getch.getch()将抛出异常. …
我试图找到一种方法来缩短 atime.sleep(600)如果用户输入一个键,而不诉诸于一些丑陋的黑客:
key_pressed = False
for i in range(600):
key_pressed = key_was_pressed()
if not key_pressed:
time.sleep(1)
else:
break
Run Code Online (Sandbox Code Playgroud) 我会尝试发布一个最小的工作示例,但不幸的是这个问题只需要很多部分,所以我尽可能地将其剥离.
首先,我使用一个简单的脚本来模拟通过函数调用按键.这是从这里调整的.
import ctypes
SendInput = ctypes.windll.user32.SendInput
PUL = ctypes.POINTER(ctypes.c_ulong)
class KeyBdInput(ctypes.Structure):
_fields_ = [("wVk", ctypes.c_ushort),
("wScan", ctypes.c_ushort),
("dwFlags", ctypes.c_ulong),
("time", ctypes.c_ulong),
("dwExtraInfo", PUL)]
class HardwareInput(ctypes.Structure):
_fields_ = [("uMsg", ctypes.c_ulong),
("wParamL", ctypes.c_short),
("wParamH", ctypes.c_ushort)]
class MouseInput(ctypes.Structure):
_fields_ = [("dx", ctypes.c_long),
("dy", ctypes.c_long),
("mouseData", ctypes.c_ulong),
("dwFlags", ctypes.c_ulong),
("time",ctypes.c_ulong),
("dwExtraInfo", PUL)]
class Input_I(ctypes.Union):
_fields_ = [("ki", KeyBdInput),
("mi", MouseInput),
("hi", HardwareInput)]
class Input(ctypes.Structure):
_fields_ = [("type", ctypes.c_ulong),
("ii", Input_I)]
def getKeyCode(unicodeKey):
k = unicodeKey
curKeyCode = 0
if k == …Run Code Online (Sandbox Code Playgroud) python windows keyboard multithreading python-multithreading
我的代码如下:
import msvcrt
while True:
if msvcrt.getch() == 'q':
print "Q was pressed"
elif msvcrt.getch() == 'x':
sys.exit()
else:
print "Key Pressed:" + str(msvcrt.getch()
Run Code Online (Sandbox Code Playgroud)
此代码基于此问题 ; 我用它来熟悉自己getch.
我注意到按3次键需要3次输出文本一次.为什么是这样?我正在尝试将它用作事件循环,这太过于滞后......
即使我键入3个不同的键,它也只输出第3个按键.
我怎么能强迫它走得更快?有没有更好的方法来实现我想要实现的目标?
谢谢!
evamvid
Edit: The below answer to use keyboard.on_press(callback, suppress=False) works fine in ubuntu without any issues. But in Redhat/Amazon linux, it fails to work.
I have used the code snippet from this thread
import keyboard # using module keyboard
while True: # making a loop
try: # used try so that if user pressed other than the given key error will not be shown
if keyboard.is_pressed('q'): # if key 'q' is pressed
print('You Pressed A Key!')
break # finishing the …Run Code Online (Sandbox Code Playgroud) 我在按一个键跳出循环时遇到问题。
我用谷歌搜索并找到了msvcrt 模块,但它没有解决我的问题。
这是我的代码。
while True:
"""some code"""
if *keyboard_input: space* == True:
break
Run Code Online (Sandbox Code Playgroud)
我知道这是一个简单的问题,但我就是找不到要导入的正确模块。
谢谢!
python ×10
python-2.7 ×3
keyboard ×2
keypress ×2
macos ×2
amazon-linux ×1
cgkeycode ×1
command-line ×1
console ×1
detect ×1
event-loop ×1
getch ×1
input ×1
keycode ×1
mouse ×1
msvcrt ×1
passwords ×1
python-3.x ×1
redhat ×1
security ×1
windows ×1