【问题标题】:Python, Quickly and Glade, showing stdout in a TextViewPython,Quickly 和 Glade,在 TextView 中显示标准输出
【发布时间】:2013-03-11 02:48:14
【问题描述】:

我花了很长时间寻找一种方法来做到这一点,但到目前为止我一无所获。 :(

我正在尝试为我制作的一个小 CLI 程序制作一个 GUI - 所以我认为使用 Ubuntu 的“快速”将是最简单的方法。基本上它似乎使用 Glade 来制作 GUI。我知道我需要在子进程中运行我的 CLI 后端,然后将 stdout 和 stderr 发送到 textview。但我无法弄清楚如何做到这一点。

这是 Glade/Quickly 为我希望输出出现的对话框创建的代码:

from gi.repository import Gtk # pylint: disable=E0611

from onice_lib.helpers import get_builder

import gettext
from gettext import gettext as _
gettext.textdomain('onice')

class BackupDialog(Gtk.Dialog):
    __gtype_name__ = "BackupDialog"

    def __new__(cls):
        """Special static method that's automatically called by Python when 
        constructing a new instance of this class.

        Returns a fully instantiated BackupDialog object.
        """
        builder = get_builder('BackupDialog')
        new_object = builder.get_object('backup_dialog')
        new_object.finish_initializing(builder)
        return new_object

    def finish_initializing(self, builder):
        """Called when we're finished initializing.

        finish_initalizing should be called after parsing the ui definition
        and creating a BackupDialog object with it in order to
        finish initializing the start of the new BackupDialog
        instance.
        """
        # Get a reference to the builder and set up the signals.
        self.builder = builder
        self.ui = builder.get_ui(self)

        self.test = False

    def on_btn_cancel_now_clicked(self, widget, data=None):
        # TODO: Send SIGTERM to the subprocess
        self.destroy()

if __name__ == "__main__":
    dialog = BackupDialog()
    dialog.show()
    Gtk.main()

如果我把它放在 finish_initializing 函数中

backend_process = subprocess.Popen(["python", <path to backend>], stdout=subprocess.PIPE, shell=False)

然后进程启动并作为另一个 PID 运行,这正是我想要的,但现在如何将 backend_process.stdout 发送到 TextView?我可以通过以下方式写入文本视图:

BackupDialog.ui.backup_output.get_buffer().insert_at_cursor("TEXT")

但我只需要知道每次有新的标准输出行时如何调用它。

【问题讨论】:

    标签: python ubuntu gtk textview subprocess


    【解决方案1】:

    但我只需要知道每次有新的标准输出行时如何调用它。

    您可以使用GObject.io_add_watch 来监视子进程的输出或创建一个单独的线程来从子进程中读取。

    # read from subprocess
    def read_data(source, condition):
        line = source.readline() # might block
        if not line:
            source.close()
            return False # stop reading
        # update text
        label.set_text('Subprocess output: %r' % (line.strip(),))
        return True # continue reading
    io_id = GObject.io_add_watch(proc.stdout, GObject.IO_IN, read_data)
    

    或者使用线程:

    # read from subprocess in a separate thread
    def reader_thread(proc, update_text):
        with closing(proc.stdout) as file:
            for line in iter(file.readline, b''):
                # execute update_text() in GUI thread
                GObject.idle_add(update_text, 'Subprocess output: %r' % (
                        line.strip(),))
    
    t = Thread(target=reader_thread, args=[proc, label.set_text])
    t.daemon = True # exit with the program
    t.start()
    

    Complete code examples.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-16
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      相关资源
      最近更新 更多