我的Python程序有一个用GTK 3编写的GUI(我通过from gi.repository import Gtk
使用GTK 3)。我调用Gtk.main()
来运行GUI。除了运行GUI之外,程序还应不断监视传入命令的标准输入并将响应写入标准输出。
使用Python中的GTK 3执行此操作的正确方法是什么?有没有办法将stdin监听器挂钩到Gtk.main()
?我可以使用Python的标准I / O API从sys.stdin
读取并写入sys.stdout
,还是需要使用一些等效的Glib API?我可以将我的响应写入stdout,还是我需要关心缓冲并将输出代码挂钩到某些Glib I / O抽象?
答案 0 :(得分:0)
我设法凑了一个非常基本的脚本:
import os
import sys
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import GLib, Gtk
logfile = open(os.path.splitext(__file__)[0]+'.log', 'w')
def on_stdin(fobj, cond):
line = fobj.readline()
print(repr(line), file=logfile)
if line == '':
sys.exit(0)
return True
win = Gtk.Window()
win.connect('delete-event', Gtk.main_quit)
win.show_all()
GLib.io_add_watch(sys.stdin, GLib.IO_IN, on_stdin)
Gtk.main()
尝试管道ls
。 if line == ''
很重要:如果流已准备好被读取并且读取不返回任何字节,则表示文件结束。如果我们不停止在文件末尾观看流,我们将无休止地调用on_stdin
,因为Unix认为文件结束流始终可以读取(参见{{3 }})