在这里,我们将给大家分享关于更新屏幕时,Python/curses用户输入的知识,让您更了解python更新界面的本质,同时也会涉及到如何更有效地Python3:接收用户输入,包括换行符、python
在这里,我们将给大家分享关于更新屏幕时,Python / curses用户输入的知识,让您更了解python更新界面的本质,同时也会涉及到如何更有效地Python 3:接收用户输入,包括换行符、python – 脚本全屏,curses风格,更新unixen上的表格输出(la top)、python 乱码,python 编码,python 中文编码转换,python utf-8,python utf8,python unicode、Python-用户输入和命令行参数的内容。
本文目录一览:- 更新屏幕时,Python / curses用户输入(python更新界面)
- Python 3:接收用户输入,包括换行符
- python – 脚本全屏,curses风格,更新unixen上的表格输出(la top)
- python 乱码,python 编码,python 中文编码转换,python utf-8,python utf8,python unicode
- Python-用户输入和命令行参数
更新屏幕时,Python / curses用户输入(python更新界面)
我目前正在使用python /
curses编写应用程序用户界面,我想知道是否可以要求用户在用户界面不断更新时按下键(cbreak模式)以隐藏或显示某些面板或窗口。
我阅读了有关curses的官方python文档并进行了一些尝试,但是即使使用cbreak模式和非阻塞输入模式(nodelay)已激活,我也无法使其正常工作(我成功获取了用户输入,但是在阻止UI的代价不是我想要的)。
所以我的问题很简单,可能吗?如果是的话,怎么办?
我可能误读了文档,但没有找到任何替代文档或示例。
我曾考虑过使应用程序具有多线程功能,但在这种情况下,我没有看到这对我有什么帮助。
感谢您的帮助,建议或指向详细文档的指针。
编辑:
最后,我得到了以下多线程代码,但并不令人满意。UI已按原样提供,但刷新后显示异常。
我还不明白为什么在隐藏考虑的面板的情况下curses.panel.hidden()返回False。似乎刷新与面板关联的窗口会取消隐藏面板或类似的东西。我真的迷路了!
import threadingimport curses, curses.panelimport randomimport timegui = Noneclass ui: def __init__(self): self.feeder = feeder(self) self.stdscr = curses.initscr() curses.noecho() curses.cbreak() curses.curs_set(0) self.stdscr.keypad(1) self.win1 = curses.newwin(10, 50, 0, 0) self.win1.border(0) self.pan1 = curses.panel.new_panel(self.win1) self.win2 = curses.newwin(10, 50, 0, 0) self.win2.border(0) self.pan2 = curses.panel.new_panel(self.win2) self.win3 = curses.newwin(10, 50, 12, 0) self.win3.border(0) self.pan3 = curses.panel.new_panel(self.win3) self.win1.addstr(1, 1, "Window 1") self.win2.addstr(1, 1, "Window 2") self.win3.addstr(1, 1, "Press ''s'' to switch windows or ''q'' to quit.") self.pan1.hide() self.win1.refresh() curses.panel.update_panels() self.win2.refresh() self.feeder.start() def ask(self): while True: self.win3.addstr(5,1, "Hidden = win1: "+str(self.pan1.hidden())+\ "win2:"+str(self.pan2.hidden()), 0) self.win3.refresh() k = self.win3.getkey() if k == ''s'': if self.pan1.hidden(): self.pan2.hide() self.pan1.show() self.win1.refresh() self.win3.addstr(2, 1, "Pan1 restored") else: self.pan1.hide() self.pan2.show() self.win2.refresh() self.win3.addstr(2, 1, "Pan2 restored") self.win3.addstr(5,1, "Hidden = win1: "+\ str(self.pan1.hidden())+\ " win2:"+str(self.pan2.hidden()), 0) elif k == ''q'': break self.quit_ui() def quit_ui(self): self.feeder.stop() curses.nocbreak() self.stdscr.keypad(0) curses.curs_set(1) curses.echo() curses.endwin() exit(0) def display_data(self, window, data): window.addstr(3, 1, data, 0)class feeder(threading.Thread): # Fake U.I feeder def __init__(self, ui): super(feeder, self).__init__() self.running = False self.ui = ui self.count = 0 def stop(self): self.running = False def run(self): self.running = True self.feed() def feed(self): while self.running: self.ui.win1.addstr(3, 1, str(self.count)+\ ": "+str(int(round(random.random()*9999)))) self.ui.win1.addstr(4, 1, str(self.running)) self.ui.win2.addstr(3, 1, str(self.count)+\ ": "+str(int(round(random.random()*9999)))) self.ui.win2.addstr(4, 1, str(self.running)) time.sleep(0.5) self.count += 1if __name__ == "__main__": gui = ui() gui.ask()
答案1
小编典典我终于成功地通过在double while循环中从sys.stdin中读取一个字节,然后避免使用另一个线程来使其工作。以下代码可能无法在MS
Windows上运行,并且由于我不是专业开发人员,因此它可能未经过优化或引发未捕获的错误,但这只是为了使我了解事情的工作原理而准备的草稿(尽管欢迎发表评论)
)。特别感谢Paul Griffiths指导我使用sys.stdin。
#!/usr/bin/python# -*- coding: iso-8859-1 -*-import curses, curses.panelimport randomimport timeimport sysimport selectgui = Noneclass ui: def __init__(self): self.stdscr = curses.initscr() curses.noecho() curses.cbreak() curses.curs_set(0) self.stdscr.keypad(1) self.win1 = curses.newwin(10, 50, 0, 0) self.win1.border(0) self.pan1 = curses.panel.new_panel(self.win1) self.win2 = curses.newwin(10, 50, 0, 0) self.win2.border(0) self.pan2 = curses.panel.new_panel(self.win2) self.win3 = curses.newwin(10, 50, 12, 0) self.win3.border(0) self.pan3 = curses.panel.new_panel(self.win3) self.win1.addstr(1, 1, "Window 1") self.win2.addstr(1, 1, "Window 2") self.win3.addstr(1, 1, "Press ''s'' to switch windows or ''q'' to quit.") self.pan1.hide() def refresh(self): curses.panel.update_panels() self.win2.refresh() self.win1.refresh() def switch_pan(self): if self.pan1.hidden(): self.pan2.bottom() self.pan2.hide() self.pan1.top() self.pan1.show() else: self.pan1.bottom() self.pan1.hide() self.pan2.top() self.pan2.show() self.refresh() def quit_ui(self): curses.nocbreak() self.stdscr.keypad(0) curses.curs_set(1) curses.echo() curses.endwin() print "UI quitted" exit(0)class feeder: # Fake U.I feeder def __init__(self): self.running = False self.ui = ui() self.count = 0 def stop(self): self.running = False def run(self): self.running = True self.feed() def feed(self): while self.running : while sys.stdin in select.select([sys.stdin], [], [], 0)[0]: line = sys.stdin.read(1) if line.strip() == "q": self.stop() self.ui.quit_ui() break elif line.strip() == "s": self.ui.switch_pan() self.ui.win1.addstr(3, 1, str(self.count)+\ ": "+str(int(round(random.random()*999)))) self.ui.win1.addstr(4, 1, str(self.running)) self.ui.win2.addstr(3, 1, str(self.count)+\ ": "+str(int(round(random.random()*999)))) self.ui.win2.addstr(4, 1, str(self.running)) self.ui.refresh() time.sleep(0.1) self.count += 1if __name__ == "__main__": f = feeder() f.run()
Python 3:接收用户输入,包括换行符
lcbeika rraobmlo grmfina ontccep emrlin tseiboo edosrgd mkoeys eissaml knaiefr
使用输入,我只能读取第一个单词,因为它读取它停止读取的第一个换行符.
有没有一种方法可以在不迭代调用输入的情况下读取它们?
解决方法
text = sys.stdin.read()
要么:
lines = sys.stdin.readlines()
要么:
for line in sys.stdin: # Do something with line.
python – 脚本全屏,curses风格,更新unixen上的表格输出(la top)
我在Linux中寻找某种类型的软件包/ API,它们可以在类似于top的列中显示输出.
例如,保持清洁并以给定的间隔将输出重写为全屏(我猜watch可能做得足够好.但我希望有一些API包装在它之上).
按列排序很容易.特别是如果我按列A排序,那么当下次重新打印所有内容时,它会记住每次刷新输出时按列A排序.
当然,理想情况下它也可以为我处理键盘输入.
总而言之,我正在寻找可以帮助我以“顶级”组织方式组织输出的软件包或API.
为了清楚起见:我显示的内容可能与系统统计信息完全无关.我喜欢top组织内容的方式.例如,我的输出内容可能是(并且它不断变化,这就是需要清理和重写的原因):
Time Col1 Col2
12 4 13
13 5 19
14 5 15
我可以按一个键说“A”然后按时间排序.如果我按下了一个键B,那么它会被Col1排序.如果我按一个键说C然后它按Col2等排序等.
当然,这个输出内容可以完全在内存中,以任何数据结构组织.
printf '%-20s %-20s\n' \
header1 header2 \
line1data1 line1data2 \
line2data1 line2data2 ...
…数据可能是在数组中构建的,也可能是从数组中提供的.只需在脚本中循环并发出适当的控制代码以清除每一行,因为您即将覆盖它(并在开头移动到窗口的顶部)是另一种合理的方法.
也就是说,这里正确的工具将是一个建立在curses之上的层.已经有许多更高级别的文本小部件集 – 但我不知道有任何直接支持表的东西.
如果你愿意写C,那么围绕curses的这个包装就是GAP.Browse.
python 乱码,python 编码,python 中文编码转换,python utf-8,python utf8,python unicode
Python-用户输入和命令行参数
如何解决Python-用户输入和命令行参数?
要读取用户输入,你可以尝试使用该cmd模块轻松创建迷你命令行解释器(带有帮助文本和自动完成功能),以及raw_input
(input用于Python 3+)用于从用户读取文本行的模块。
text = raw_input("prompt") # Python 2
text = input("prompt") # Python 3
命令行输入在中sys.argv。在脚本中尝试以下操作:
import sys
print (sys.argv)
var = raw_input("Please enter something: ")
print "you entered", var
或对于Python 3:
var = input("Please enter something: ")
print("You entered: " + var)
解决方法
我如何拥有a)可以接受用户输入的Python脚本,以及如何使其b)如果从命令行运行则读入参数?
今天关于更新屏幕时,Python / curses用户输入和python更新界面的讲解已经结束,谢谢您的阅读,如果想了解更多关于Python 3:接收用户输入,包括换行符、python – 脚本全屏,curses风格,更新unixen上的表格输出(la top)、python 乱码,python 编码,python 中文编码转换,python utf-8,python utf8,python unicode、Python-用户输入和命令行参数的相关知识,请在本站搜索。
本文标签: