GVKun编程网logo

更新屏幕时,Python / curses用户输入(python更新界面)

27

在这里,我们将给大家分享关于更新屏幕时,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 / 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:接收用户输入,包括换行符

Python 3:接收用户输入,包括换行符

我试图从 Python 3中的命令行读取以下文本(复制了逐字,换行和全部):
lcbeika
rraobmlo
grmfina
ontccep
emrlin
tseiboo
edosrgd
mkoeys
eissaml
knaiefr

使用输入,我只能读取第一个单词,因为它读取它停止读取的第一个换行符.

有没有一种方法可以在不迭代调用输入的情况下读取它们?

解决方法

您可以导入sys并使用sys.stdin上的方法,例如:
text = sys.stdin.read()

要么:

lines = sys.stdin.readlines()

要么:

for line in sys.stdin:
    # Do something with line.

python – 脚本全屏,curses风格,更新unixen上的表格输出(la top)

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等排序等.

当然,这个输出内容可以完全在内存中,以任何数据结构组织.

最佳答案
如果你想在shell中执行此操作,请注意printf将是一个快速而肮脏的起点 – 每隔几秒钟重新运行一个脚本,printf进行格式化,大致如下:

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 编码,python 中文编码转换,python utf-8,python utf8,python unicode

python 编码转换
这个 2.6 就是用来向 3k 过渡的,我还是期待 py3k,wxwidget3 也在开发当中,两者的主要改变不约而同的都集中在 unicode 问题上,
现在用 py2.5+wxpy2.8
配合做软件,感觉最不方便的就是编码问题,用 iewin 的 LoadString 输出中文就是搞不定,这个列表中以前也有人问过这问题,可惜没有解决方案。
期待将来的 py3k+wxpy3 能一劳永逸的解决编码问题。
 
我的解决方案,LoadString 支持中文
 汉字转为 html 实体字符得了。
 echo mb_convert_encoding ("重玩一次", "HTML-ENTITIES", "gb2312");
 
编码转换
s = "中文"
s1 = u"中文"
 
unicode -> gbk
 s1.encode("gbk")
unicode -> utf-8
 s1.encode("UTF-8")
gbk ->unicode
 unicode(s, "gbk")
 或者
 s.decode("gbk")
 

Python-用户输入和命令行参数

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-用户输入和命令行参数的相关知识,请在本站搜索。

本文标签: