我正在学习用C语言编程,并且希望能够在我的代码运行时能够在没有按下的情况下在终端中键入字符return.我的程序有效,但是当我打电话时initscr()
,屏幕被清除 - 即使在通话后也是如此filter()
.该文档filter
建议它应该禁用清除 - 但对我来说情况并非如此.
#include <stdio.h>
#include <curses.h>
#include <term.h>
int main(void) {
int ch;
filter();
initscr();
cbreak();
noecho();
keypad(stdscr, TRUE);
while((ch = getch()) != EOF);
endwin();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么上面的代码仍然清晰的屏幕,以及可以做些什么来解决它?
如果有帮助,我正在使用Debian Lenny(稳定版)和gnome-terminal.
while 1:
...
window.addstr(0, 0, 'abcd')
window.refresh()
...
Run Code Online (Sandbox Code Playgroud)
window
尺寸是完整的终端尺寸,大到足以容纳abcd
.如果'abcd'
被修改为更短的字符串'xyz'
,那么在终端上我会看到'xyzd'
.究竟我做错了什么?
我正在为unix平台制作一个控制台应用程序,我正在使用curses(或ncurses)库来处理键盘和鼠标输入.问题是我发现很少有关于如何使用它的文档,从这个页面开始,这个没有非常详细的例子.我已设法捕获左键单击,但我无法让它为右键单击工作,因为终端模拟器的选项菜单出现在光标位置,但该事件未由应用程序处理.如何避免这种情况并在应用程序中捕获事件?
我有以下行来配置鼠标事件:
// Set up mouse event throwing
mousemask(BUTTON1_PRESSED | BUTTON2_PRESSED, NULL);
Run Code Online (Sandbox Code Playgroud)
在处理输入的方法中,我有以下内容:
int c = getch();
MEVENT event;
switch(c)
{
case KEY_UP:
... do stuff
break;
case KEY_DOWN:
... do stuff
break;
case KEY_MOUSE:
if(getmouse(&event) == OK)
{
if(event.bstate & BUTTON1_PRESSED) // This works for left-click
{
... do stuff
}
else if(event.bstate & BUTTON2_PRESSED) // This doesn't capture right-click
{
... do other stuff
}
else
fprintf(stderr, "Event: %i", event.bstate); // Doesn't print anything …
Run Code Online (Sandbox Code Playgroud) 我写了一个hello world程序来看看curses库是如何工作的.
这是我的计划:
/Users/snihalani/dev/daas at 10:10AM
? cat main.c
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
int main(void)
{
int returnValue = 0;
while(1)
{
printf("I got %d\n", getch());
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我跑了 gcc main.c
我有
/Users/snihalani/dev/daas at 10:14AM
? gcc main.c
Undefined symbols for architecture x86_64:
"_stdscr", referenced from:
_main in ccEvUdhx.o
"_wgetch", referenced from:
_main in ccEvUdhx.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我不知道出了什么问题.有人可以帮忙吗?
我需要一个能够将输入读入缓冲区的函数raw_input()
,但不是在返回完整行之前回显输入和阻塞,它应该抑制echo并在每次缓冲区更改时调用回调.
我说"缓冲区更改"而不是"字符被读取",因为raw_input()
,我希望它能够识别特殊键.例如,Backspace应该可以工作.
例如,如果我想使用回调来模拟输入的大写回声,代码将如下所示:
def callback(text):
print '\r' + text.upper()
read_input(callback)
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
注意:我一直在尝试使用readline
并curses
满足我的目的,但两个Python绑定都不完整.curses
不能在不清除整个屏幕的情况下启动,并readline
在任何输入开始之前提供单个挂钩.
我面临着一个奇怪的问题.使用Pycharm(请不要拖延这个事实),我正在尝试启动一个简短的应用程序,用于ncurses
在我的术语上呈现一些东西.
虽然我可以在没有任何问题的情况下以简单的术语启动项目,但从Pycharm启动它会引发以下错误:
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/curses/__init__.py", line 33, in initscr
fd=_sys.__stdout__.fileno())
error: setupterm: could not find terminal
Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)
据我所知,所有都是关于终端环境变量.Pycharm从它自己的终端实例启动项目(Run或Debug),curses不能使用它.所以,我想知道如何配置Pycharm在常规终端内启动我的项目.
该项目使用的是Python 2.7.Pycharm在EAP版本129.258中(不适用于其他版本,包括稳定版)
感谢您的关注.
K.
我有以下代码,允许您向上和向下滚动文本垫.每次滚动(即处理用户输入)时,打击垫都会按预期更新.但是,在按下第一个键之前没有显示任何内容,尽管我正在调用pad.refresh(),就像我在每个用户输入后一样.
我的代码看起来像这样:
def main(self,stdscr):
x,y = 20,150 # size of the window
u,a = 10,20 # where to place window - up,across
pad = curses.newpad(20,150) # nlines, ncols
pad_pos = 0
exit = False
pad.addstr(0,0,str(self.all_results))
while not exit:
pad.addstr(0,0,str(self.format_results()))
++ stdscr.refresh()
pad.refresh(pad_pos,10, u,a, x,y)
-- cmd = stdscr.getch()
++ cmd = pad.getch()
stdscr.nodelay(1)
+ pad.getch() - caused the screen not to update
+ stdscr.refresh() - no change
if cmd != -1:
+ pad.getch() - - caused the screen not to …
Run Code Online (Sandbox Code Playgroud) 在彩色模式下,我似乎无法在诅咒中工作.如果我不打电话start_color
,我就会变黑了.我打电话的时候start_color
,事情开始以黑灰色输出.
如果您运行此脚本:
import sys
for i in xrange(30, 38):
print '\x1b[0;' + str(i) + 'm' + str(i) + ': Shiny colors \x1b[1m(bright)'
print '\x1b[0m...and this is normal.'
Run Code Online (Sandbox Code Playgroud)
......你可能会看到很多漂亮的颜色.我想要但不能得到的是最后一句话:"......这是正常的." 要求颜色对0或要求COLOR_WHITE,COLOR_BLACK从脚本中获取非亮#37.
作为参考,这是我在Gnome终端中看到的:
http://rpi.edu/~wellir/random/colors.png
我用Python编程(使用curses库),所以我的代码是这样的:
import curses
screen = curses.initscr()
curses.start_color()
curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLACK)
screen.clear()
screen.attrset(0)
screen.addstr('Hello')
screen.attrset(curses.A_BOLD)
screen.addstr('Hello')
screen.attrset(curses.color_pair(1))
screen.addstr('Hello')
screen.refresh()
curses.napms(5000)
curses.endwin()
Run Code Online (Sandbox Code Playgroud)
......让我37,37-亮,37.
我想要做的是用 Python 制作一个简单的 pi 记忆游戏。我需要的是一种无需在每个字符后按“输入”即可从用户那里获取输入的方法。听起来我需要像 getch 这样的东西,但我无法让它工作。我从这里得到了一个类似 getch 的函数:https : //gist.github.com/chao787/2652257#file-getch-py。我真的不明白里面的任何东西。当我做' x = getch.getch()
'它说“ AttributeError: '_Getch' object has no attribute 'getch'
”。看起来 msvcrt 可以在 Windows 上做到这一点,但我有一台 Mac。看起来curses 也是一个有getch 的东西,但它说我需要先做initscr,然后我得到错误“ File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/curses/__init__.py", line 30, in initscr
fd=_sys.__stdout__.fileno())
_curses.error: setupterm: could not find terminal
”。
这是我只使用输入的文件,您每次都必须按 Enter 键(我实际上输入了 1000 位数字,而不是省略号)。
pi = '3.1415926535...'
def main():
print('Welcome to PiGame!')
pigame()
while True:
yn = input('Play again? y/n ')
if yn == 'y':
pigame()
else: return
def pigame():
n=0
print('Go!')
while …
Run Code Online (Sandbox Code Playgroud)