我有一个Python脚本需要抑制stdin当您使用键盘响应提示时发生的回声.
使用键盘时,我可以使用VT100控制代码向上移动一行,清除该行,然后向上移动另一行(以便输出清除新消隐的行).
但是,当输入来自文件时,此代码会混淆输出并最终清除一行有效输出(即cat test | myscript.py,因为在这种情况下,stdin似乎没有向stdout回显任何内容.
我无法控制输入如何发送到脚本,我不知道用户是否将使用键盘或文件.
有没有办法让我检查raw_input()的输出,如果输入来自键盘,只运行VT100控制代码?
这可能吗?我看过的每个答案都不是我想要的.我所做的就像是omega-rpg(这是一个很棒的基于文本的debian RPG),但是在Python而不是C.我已经四处寻找并发现了一些东西,但没有任何与我正在做的事情相关的东西.是否更容易使用raw_input()/ input,或者使用某种API这样做会更有效吗?
打扫干净:
我需要一个Python实时键盘输入系统,但我不知道使用API或仅使用它是否更容易raw_input() / input().如果最好使用API,这对初学者级程序员来说是最好的?
额外:
任何解决方案都将用于基于文本的游戏!请在回答时记住这一点.
我对RAWINPUT有一些奇怪的行为.以下代码工作原理:
case WM_INPUT:
{
UINT rawInputSize;
GetRawInputData((HRAWINPUT)(lParam), RID_INPUT, nullptr, &rawInputSize, sizeof(RAWINPUTHEADER));
LPBYTE inputBuffer = new BYTE[rawInputSize];
GetRawInputData((HRAWINPUT)(lParam), RID_INPUT, inputBuffer, &rawInputSize, sizeof(RAWINPUTHEADER));
RAWINPUT* inp = (RAWINPUT*)inputBuffer; // valid
}
Run Code Online (Sandbox Code Playgroud)
但以下不起作用:
case WM_INPUT:
{
UINT rawInputSize;
BYTE inputBuffer[40];
GetRawInputData((HRAWINPUT)(lParam), RID_INPUT, inputBuffer, &rawInputSize, sizeof(RAWINPUTHEADER)); // returns error code
RAWINPUT* inp = (RAWINPUT*)inputBuffer;
}
Run Code Online (Sandbox Code Playgroud)
也不:
case WM_INPUT:
{
UINT rawInputSize;
RAWINPUT inputBuffer;
GetRawInputData((HRAWINPUT)(lParam), RID_INPUT, &inputBuffer, &rawInputSize, sizeof(RAWINPUTHEADER)); // returns error code
}
Run Code Online (Sandbox Code Playgroud)
两者都失败GetRawInputData(),返回一般错误代码(没有详细信息).
我首先发布的工作解决方案不是一个选项,我不能在每次按键或鼠标操作时进行堆分配,我必须使用堆栈.
为什么这两个最后都失败了?
您好我是在尝试学习python,在C++中从stdin读取字符串我就是这么做的
string str;
while (cin>>str)
do_something(str)
Run Code Online (Sandbox Code Playgroud)
但在python中,我必须使用
line = raw_input()
Run Code Online (Sandbox Code Playgroud)
然后
x = line.split()
Run Code Online (Sandbox Code Playgroud)
然后我必须遍历列表x来访问每个str do_something(str)
这似乎是很多代码只是为了让每个字符串由空格或空格分隔所以我的问题是,有更简单的方法吗?
我正在使用带有directx的rawinput ...我正在尝试使用鼠标滚轮时使用相机进行缩放...当我使用以下代码运行程序时,我从rawinput获取的用于usbuttondata的数据变为120我向前推鼠标滚轮......然后它失去控制......高达65000 ......我认为数据应该是1或-1或0 ... rawinput作为鼠标滚轮数据发送什么?
码:
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
switch(Msg)
{
case WM_CREATE:
{
RAWINPUTDEVICE Rid[2];
// Keyboard
Rid[0].usUsagePage = 1;
Rid[0].usUsage = 6;
Rid[0].dwFlags = 0;
Rid[0].hwndTarget=Inst.Wnd.hWnd;
// Mouse
Rid[1].usUsagePage = 1;
Rid[1].usUsage = 2;
Rid[1].dwFlags = 0;
Rid[1].hwndTarget=Inst.Wnd.hWnd;
if (!RegisterRawInputDevices(Rid,2,sizeof(RAWINPUTDEVICE)))
{
MessageBox(NULL, L"Failed to Register Input Devices!", L"ALERT", MB_OK);
exit(1);
}
return 0;
}
case WM_INPUT:
{
// Determine how big the buffer should be
UINT iBuffer;
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, …Run Code Online (Sandbox Code Playgroud) 我目前正在学习Python,并编写了一个程序来试验这门语言.但是,每当我使用它时,输出总是在其中有一个字母"u".我正在使用Pyscripter作为我的IDE.
这是我的代码:
print "whats your name"
age = raw_input()
print "Alright, so %r, I just realized what percent-r does actually or is meant for" % (age)
print "What next ur age",
age1 = raw_input()
print "you entered %r " % (age1)
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我看到这样的事情:
>>> Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32.
>>> whats your name (i typed kk)
>>> Alright, so u'kk', i just realized what percent-r does actually or is meant for
>>> …Run Code Online (Sandbox Code Playgroud) 如何限制用户可以输入的字符数量raw_input?我的问题可能有一些简单的解决方案,但我无法弄清楚.
我正在研究一个python项目,该项目轮询COM端口上的数据并轮询用户输入.截至目前,该计划正在顺利运作,但似乎效率低下.我在一个单独的线程中运行的while循环中发生了串行端口轮询,并将数据粘贴到队列中.用户输入轮询也发生在一个while循环中,该循环在一个单独的线程中运行,该输入将输入粘贴到队列中.不幸的是,我有太多的代码和帖子,它会从问题的角度来看.
那么是否有更有效的方法来轮询串行或raw_input()而不将它们粘在无限循环中并在自己的线程中运行它们?
我一直在对这个主题进行大量研究,并不断遇到"单独的线程和队列"范例.但是,当我运行这个程序时,我在四核i7上使用了近30%的CPU资源.一定有更好的方法.
我曾在C中使用过ISR,并希望有类似于我可以使用的中断.我最近的研究发现了许多带有回调的"事件"库,但我似乎无法理解它们如何适应我的情况.我正在使用Windows 7(64位)计算机进行开发,但是当我完成时将成品移动到RPi.我不是在寻找代码,我只需要指向正确的方向.谢谢你的任何信息.
我刚刚开始为我的应用程序使用Raw Input。直截了当地问这个问题,可以在旧WM_KEYDOWN消息lParam中检查以获得有关按键的其他信息。像这些-
Bits Meaning
0-15 The repeat count for the current message.
The value is the number of times the keystroke is autorepeated as a
result of the user holding down the key. If the keystroke is
held long enough, multiple messages are sent. However, the repeat
count is not cumulative.
16-23 The scan code. The value depends on the OEM.
24 Indicates whether the key is an extended key, such as the right-hand
ALT and …Run Code Online (Sandbox Code Playgroud)