2

您好,我有一些命令,平均运行 30 分钟,当我单击 GTK3 创建的按钮时,python 开始执行命令,但我的所有应用程序都冻结了。我单击按钮的python代码是:

def on_next2_clicked(self,button):
    cmd = "My Command"
    proc = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE)
    while True:
            line = proc.stdout.read(2)
            if not line:
                break
            self.fper = float(line)/100.0
            self.ui.progressbar1.set_fraction(self.fper)
    print "Done"

我还必须将命令输出设置为窗口中的进度条。任何人都可以帮助解决我的问题吗?我也尝试过在python中使用Threading,但它也没有用......

4

2 回答 2

3

从循环中运行主循环迭代:

def on_next2_clicked(self,button):
    cmd = "My Command"
    proc = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE)
    while True:
        line = proc.stdout.read(2)
        if not line:
            break
        self.fper = float(line)/100.0
        self.ui.progressbar1.set_fraction(self.fper)
        while Gtk.events_pending():
            Gtk.main_iteration()  # runs the GTK main loop as needed
    print "Done"
于 2012-06-26T07:21:35.843 回答
1

您正忙于等待,而不是让 UI 主事件循环运行。将循环放在单独的线程中,以便主线程可以继续自己的事件循环。

编辑:添加示例代码

import threading

def on_next2_clicked(self,button):
    def my_thread(obj):
        cmd = "My Command"
        proc = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE)
        while True:
                line = proc.stdout.read(2)
                if not line:
                    break
                obj.fper = float(line)/100.0
                obj.ui.progressbar1.set_fraction(obj.fper)
        print "Done"

    threading.Thread(target=my_thread, args=(self,)).start()

对您的函数的上述修改将启动一个新线程,该线程将与您的主线程并行运行。当新线程忙于等待时,它将让主事件循环继续。

于 2012-06-26T05:35:13.563 回答