在蟒蛇GTK3按钮点击后,窗口冻结(Window freezes after clicking of

2019-09-18 12:21发布

你好,我有一些命令,它会运行平均为30分钟,当我点击通过GTK3创建按钮,蟒蛇开始执行命令,但我所有的应用程序冻结。 点击了按钮,我的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,但它也属于没用...

Answer 1:

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

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"


Answer 2:

您是忙等待,不让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()

上述修改你的函数将启动一个新的线程将在并行与你的主线程中运行。 它会让而新的线程做的忙等待主事件循环继续。



文章来源: Window freezes after clicking of button in python GTK3
标签: python gtk3