当前位置:首页 » 编程语言 » pythoncurses模块

pythoncurses模块

发布时间: 2022-09-25 09:32:11

python3.6.3 curses newwin 方法为何用不了

python 中curses封装了c语言的curses,把c中复杂部分简单化,比如addstr(),mvaddstr(),mvwaddstr()合并成了一个addstr()方法。

一、语法入门

1、打开和关闭一个curses 应用程序

在任何代码执行前都先要初始化curses。初始化操作就是调用initscr()函数,如下。该函数根据不同设备返回一个window对象代表整个屏幕,这个window对象通常叫做stdscr,和c语言报错一致。

import curses
stdscr = curses.initscr()

使用curses通常要关闭屏幕回显,目的是读取字符仅在适当的环境下输出。这就需要调用noecho()方法

curses.noecho()

应用程序一般是立即响应的,即不需要按回车就立即回应的,这种模式叫cbreak模式,相反的常用的模式是缓冲输入模式。开启立即cbreak模式代码如下。

curses.cbreak()

终端经常返回特殊键作为一个多字节的转义序列,比如光标键,或者导航键比如Page UP和Home键 。curses可以针对这些序列做一次处理,比如curses.KEY_LEFT返回一个特殊的值。要完成这些工作,必须开启键盘模式。

stdscr.keypad(1)

关闭curses非常简单,如下:

curses.nocbreak()#关闭字符终端功能(只有回车时才发生终端)stdscr.keypad(0)
curses.echo() #打开输入回显功能

调用endwin()恢复默认设置

curses.endwin()

调试curses时常见的问题就是curses应用程序结束后没有重置终端到之前的状态,把终端弄的一团糟。python中该问题经常是因为代码有bug,发送异常引起的。比如键盘敲入字符后屏幕不回显,这让shell用起来非常困难。

为了避免这样的问题,可以导入curses.wrapper模块。这个函数做了一些初始化的工作,包括上面提到的和颜色的初始化。然后再执行你提供的函数,最后重置。而且被调用的函数写在try-catch中。

2、打开新窗口和pad

通常调用initscr()获取一个window对象代表全部屏幕。但是很多程序希望划分屏幕为几个小的窗口,为了重绘,擦出这些工作在小窗口中独立进行。newwin()函数就是用来新建一个新的窗口,需要给定窗口尺寸,并返回新的window对象的。

begin_x = 20; begin_y = 7height = 5; width = 40win = curses.newwin(height, width, begin_y, begin_x)

注意:坐标通过是先y后x。这和别的坐标系统不同,但是根深蒂固,写的时候就这样现在改太晚喽。

当调用一个方法去显示或者擦除文本时,效果不会立即显示。 为了减少屏幕重绘的时间,curses就先累积这些操作,用一种更有效的方式去显示。就比如说你的程序先在窗口显示了几个字符,然后就清除屏幕,那就没必要发送初始字符了,因为它们不会被显示。

因此,curses需要你使用refresh()函数明确指出重绘窗口。

pad

pad是window的特例。pad可以比显示的屏幕大,一次只显示pad的一部分。创建一个pad很简单,只需要提供宽高即可。但是刷新pad需要提供屏幕上显示的部分pad的坐标。

getstr()获取一个字符串。因为功能有限不常用。

curses.echo() # Enable echoing of characters# Get a 15-character string, with the cursor on the top lines = stdscr.getstr(0,0, 15)

linux下python的curses库是自带的吗

python的库 一般解压后都有一个 setup.py 的文件,然后使用python来安装 在安装包当前目录执行 $python setup.py install

❸ python curses 怎么安装

curse是phyton封装的,你装了python就可以用的。

在任何代码执行前都先要初始化curses。初始化操作就是调用initscr()函数,如下。该函数根据不同设备返回一个window对象代表整个屏幕,这个window对象通常叫做stdscr,和c语言报错一致。
import curses
stdscr = curses.initscr()

❹ python 终端分界

知乎上的回答,未验证,你试试看:
不知道你的Python版本是多少。在Python 3.3中os模块里有一个get_terminal_size方法可以用。
比如要得到宽度:print(os.get_terminal_size().column)就可以了。
如果是其他版本的话,你可以试试curses模块,可以得到终端的最大长和宽。
import curses
screen = curses.initscr()

❺ Python curses Redirection is not supported,该怎么解决

命令行直接运行
在CMD命令行中,输入 “python” + “空格”,即 ”python “;
将已经写好的脚本文件拖拽到当前光标位置,然后敲回车运行即可

❻ Curses什么意思

Python 的标准 curses 提供了“玻璃电传”(glass teletype)(在 20 世纪 70 年代,原始 curses 库刚创建时,它叫做 CRT)的公共特性的基本接口。有许多方法可以让用 Python 编写的交互式文本模式程序变得更巧妙。这些方法分成两类。
一方面,有些Python 模块支持 ncurses (curses 的超集)或 slang (相似却独立的控制台库)的全部功能集合。最值得注意的是,这当中有一个增强库(由适当的 Python 模块封装)可以让您将颜色添加到界面上。
另一方面,许多构建在curses(或 ncurses / slang )上的高级窗口小部件库添加了诸如按钮、菜单、滚动栏和各种公共界面设备之类的特性。如果您看到过用诸如 Borland's TurboWindows(DOS 版)之类的库开发的应用程序,您就知道在文本模式控制台中,这些特性是多么吸引人。窗口小部件库中的功能单单使用 curses 都可以达到,但是还可以利用其它程序员在高级界面上取得的成果。请参阅 参考资料,以寻找所提到的模块的链接。

❼ 求Python大神给个200行左右的代码,多点注释,做期末大作业

#-*-coding:utf-8-*-

importcurses#引入curses模块,curses是一个在Linux/Unix下广泛应用的图形函数库.,作用是可以绘制在DOS下的用户界面和漂亮的图形。
fromrandomimportrandrange,choice#从random模块引入randrange,choice这两个类
#从collections引入defaultdict这个类

letter_codes=[ord(ch)forchin'WASDRQwasdrq']#ord函数是把字符转换成对应的数字
actions=['Up','Left','Down','Right','Restart','Exit']#上,左,下,右,重启,退出
actions_dict=dict(zip(letter_codes,actions*2))#把字母与动作对应起来。zip是把元组中的值对应起来。

#############################
WUp
ALeft
SDown
DRight
RRestart
QExit

wUp
aLeft
sDown
dRight
rRestart
QExit
##############################################
defget_user_action(keyboard):
char="N"#char的初始值为Nwhilecharnotinactions_dict:
char=keyboard.getch()returnactions_dict[char]#阻塞+循环,直到获得用户有效输入才返回对应行为deftranspose(field):return[list(row)forrowinzip(*field)]#zip函数里边加*号,是把行变列,列变行。所以这句代码是行列转置definvert(field):return[row[::-1]forrowinfield]#这句代码是把列表前后颠倒classGameField(object):#创建一个叫做GameField的类,用来创建棋盘def__init__(self,height=4,width=4,win=2048):这个类三个参数self.height=height#高self.width=width#宽self.win_value=win#过关分数self.score=0#当前分数self.highscore=0#最高分self.reset()#重置棋盘defreset(self):#定义一个reset函数ifself.score>self.highscore:#如果当前分数大于最高分,那么把当前分数赋值给最高分self.highscore=self.scoreself.score=0#当前分数恢复到0分self.field=[[0foriinrange(self.width)]forjinrange(self.height)]#横纵坐标恢复到(0,0)self.spawn()#调用spawn这个函数self.spawn()defmove(self,direction):#定义move函数defmove_row_left(row):#向左移deftighten(row):#squeesenon-zeroelementstogether把零散的非零单元挤到一块
new_row=[iforiinrowifi!=0]#如果i不等于零,把他们赋值到new_row这个元组中
new_row+=[0foriinrange(len(row)-len(new_row))]#其余位置用0补充returnnew_row#返回这个元组defmerge(row):#定义merge函数,用来合并单元
pair=False#pair初始值为假
new_row=[]#new_row初始值为空foriinrange(len(row)):#让i在格子里循环ifpair:如果pair为真
new_row.append(2*row[i])#那么把把row【i】的值乘以2,追加到new_row后边self.score+=2*row[i]#并且得分为row【i】的值乘以2
pair=False#pair重新赋值为假else:如果pair为真ifi+1<len(row)androw[i]==row[i+1]:#如果i+1还没到边界,并且此时的row【i】=row【i+1】
pair=True#那么pair为真
new_row.append(0)#new_row后追加零else:
new_row.append(row[i])#否则追加row【i】
assertlen(new_row)==len(row)#提醒两者长度一致returnnew_rowreturntighten(merge(tighten(row)))#反复合并,知道不能合并为止

moves={}
moves['Left']=lambdafield:
[move_row_left(row)forrowinfield]#做移动
moves['Right']=lambdafield:
invert(moves['Left'](invert(field)))#invert是逆转
moves['Up']=lambdafield:
transpose(moves['Left'](transpose(field)))#transpose是转置
moves['Down']=lambdafield:
transpose(moves['Right'](transpose(field)))ifdirectioninmoves:ifself.move_is_possible(direction):#如果移动方向在四个方向上,self.field=moves[direction](self.field)那么调用moves函数self.spawn()#产生随机数returnTrueelse:returnFalsedefis_win(self):returnany(any(i>=self.win_valueforiinrow)forrowinself.field)defis_gameover(self):returnnotany(self.move_is_possible(move)formoveinactions)defdraw(self,screen):
help_string1='(W)Up(S)Down(A)Left(D)Right'
help_string2='(R)Restart(Q)Exit'
gameover_string='GAMEOVER'
win_string='YOUWIN!'defcast(string):
screen.addstr(string+' ')defdraw_hor_separator():
line='+'+('+------'*self.width+'+')[1:]
separator=defaultdict(lambda:line)ifnothasattr(draw_hor_separator,"counter"):
draw_hor_separator.counter=0
cast(separator[draw_hor_separator.counter])
draw_hor_separator.counter+=1defdraw_row(row):
cast(''.join('|{:^5}'.format(num)ifnum>0else'|'fornuminrow)+'|')

screen.clear()
cast('SCORE:'+str(self.score))if0!=self.highscore:
cast('HGHSCORE:'+str(self.highscore))forrowinself.field:
draw_hor_separator()
draw_row(row)
draw_hor_separator()ifself.is_win():
cast(win_string)else:ifself.is_gameover():
cast(gameover_string)else:
cast(help_string1)
cast(help_string2)defspawn(self):
new_element=4ifrandrange(100)>89else2
(i,j)=choice([(i,j)foriinrange(self.width)forjinrange(self.height)ifself.field[i][j]==0])self.field[i][j]=new_elementdefmove_is_possible(self,direction):defrow_is_left_movable(row):
defchange(i):#trueifthere'llbechangeini-thtileifrow[i]==0androw[i+1]!=0:#MovereturnTrueifrow[i]!=0androw[i+1]==row[i]:#(change(i)foriinrange(len(row)-1))

check={}
check['Left']=lambdafield:
any(row_is_left_movable(row)forrowinfield)

check['Right']=lambdafield:
check['Left'](invert(field))

check['Up']=lambdafield:
check['Left'](transpose(field))

check['Down']=lambdafield:
check['Right'](transpose(field))ifdirectionincheck:returncheck[direction](self.field)else:returnFalsedefmain(stdscr):definit():#重置游戏棋盘
game_field.reset()return'Game'defnot_game(state):#画出GameOver或者Win的界面
game_field.draw(stdscr)#读取用户输入得到action,判断是重启游戏还是结束游戏
action=get_user_action(stdscr)
responses=defaultdict(lambda:state)#默认是当前状态,没有行为就会一直在当前界面循环
responses['Restart'],responses['Exit']='Init','Exit'#对应不同的行为转换到不同的状态returnresponses[action]defgame():#画出当前棋盘状态
game_field.draw(stdscr)#读取用户输入得到action
action=get_user_action(stdscr)ifaction=='Restart':return'Init'ifaction=='Exit':return'Exit'ifgame_field.move(action):#movesuccessfulifgame_field.is_win():return'Win'ifgame_field.is_gameover():return'Gameover'return'Game'


state_actions={'Init':init,'Win':lambda:not_game('Win'),'Gameover':lambda:not_game('Gameover'),'Game':game
}

curses.use_default_colors()
game_field=GameField(win=32)


state='Init'#状态机开始循环whilestate!='Exit':
state=state_actions[state]()

curses.wrapper(main)

❽ python里可以使用perl中的Curses:UI模块吗

几年前应该perl多一些,现在应该python的库更丰富 单讲开发效率不讲维护成本的话,perl肯定更高一些,毕竟代码量会少一些,但是如果追求代码量少的话,可读性会很差,维护起来就头疼了 个人建议如果不是生物信息行业的话,果断学python吧,perl...

❾ Python curses 在终端写文本,超出范围即报错,怎样处理

Webkit支持一个名为-webkit-line-clamp的属性,他其实是一个WebKit-Specific Unsupported Propertyp {
overflow : hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}

p {
overflow: hidden;
white-space: normal;
height: 3em;
text-overflow: -o-ellipsis-lastline;
}

热点内容
存储设备报价 发布:2024-05-08 02:22:01 浏览:551
定步长的算法 发布:2024-05-08 02:16:18 浏览:107
怎么使用pe口袋服务器 发布:2024-05-08 02:02:18 浏览:470
xml数据库c 发布:2024-05-08 02:01:46 浏览:455
仿知乎android 发布:2024-05-08 01:56:00 浏览:903
mysql编译参数 发布:2024-05-08 01:53:46 浏览:192
怎么看台式电脑配置生产日期 发布:2024-05-08 01:32:26 浏览:459
java基础培训学校 发布:2024-05-08 01:30:44 浏览:466
简单辅助火眼打码如何配置 发布:2024-05-08 01:30:44 浏览:902
我的世界网易版服务器游戏 发布:2024-05-08 01:10:33 浏览:41