将流I / O添加到Python / GTK 3 GUI

时间:2018-04-01 19:30:22

标签: python gtk glib

我的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抽象?

1 个答案:

答案 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()

尝试管道lsif line == ''很重要:如果流已准备好被读取并且读取不返回任何字节,则表示文件结束。如果我们不停止在文件末尾观看流,我们将无休止地调用on_stdin,因为Unix认为文件结束流始终可以读取(参见{{3 }})