如何在gtk3-python中执行后台任务?

我有这个主线程:


吉比


from gi.repository import Gtk, Gdk

import Process

import gobject


class gui():

    def __init__(self):

        self.window = Gtk.Window()

        self.window.connect('delete-event', Gtk.main_quit)


        self.box = Gtk.Box()

        self.window.add(self.box)


        self.label = Gtk.Label('idle')

        self.box.pack_start(self.label, True, True, 0)


        self.progressbar = Gtk.ProgressBar()

        self.box.pack_start(self.progressbar, True, True, 0)


        self.button = Gtk.Button(label='Start')

        self.button.connect('clicked', self.on_button_clicked)

        self.box.pack_start(self.button, True, True, 0)


        self.window.show_all()

        gobject.threads_init()


        Gdk.threads_enter()

        Gtk.main()

        Gdk.threads_leave()


    def working1():

        self.label.set_text('working1')

        t = Process.Heavy()

        t.heavyworks1() 

        self.label.set_text('idle') 


    def on_button_clicked(self, widget):

        Gdk.threads_enter()

        working1()

        Gdk.threads_leave()


if __name__ == '__main__':

    gui = gui()

此代码将生成此gui: 

http://img2.mukewang.com/60628c6b0001cba602180056.jpg

我有第二个模块,它将执行逻辑。


Process.py


import threading


class Heavy(threading.Thread):

    def __init__(self):

        threading.Thread.__init__(self)


    def heavyworks1(self):

        #doing heavy works1

        #return result


   def heavyworks2(self, *param):

        #doing heavy works2

        #return result

当我执行此操作时,该操作有效,但是gui被冻结。怎么做呢?


狐的传说
浏览 168回答 3
3回答

12345678_0001

我将代码更改为此:from gi.repository import Gtk, Gdk, GLibimport Processimport gobjectimport threadingclass gui():def __init__(self):    self.window = Gtk.Window()    self.window.connect('delete-event', Gtk.main_quit)    self.box = Gtk.Box()    self.window.add(self.box)    self.label = Gtk.Label('idle')    self.box.pack_start(self.label, True, True, 0)    self.progressbar = Gtk.ProgressBar()    self.box.pack_start(self.progressbar, True, True, 0)    self.button = Gtk.Button(label='Start')    self.button.connect('clicked', self.on_button_clicked)    self.box.pack_start(self.button, True, True, 0)    self.window.show_all()    gobject.threads_init()    GLib.threads_init()    Gdk.threads_init()    Gdk.threads_enter()    Gtk.main()    Gdk.threads_leave()def init_progress(self, func, arg):    self.label.set_text('working1')    self.worker = threading.Thread(target=func, args=[arg])    self.running = True    gobject.timeout_add(200, self.update_progress)    self.worker.start()def update_progress(self):    if self.running:        self.progressbar.pulse()    return self.runningdef working(self, num):    Process.heavyworks2(num)        gobject.idle_add(self.stop_progress)def stop_progress(self):    self.running = False    self.worker.join()    self.progressbar.set_fraction(0)    self.label.set_text('idle') def on_button_clicked(self, widget):    self.init_progress(self.working, 100000)if __name__ == '__main__':    gui = gui()使用该代码,程序有时可以工作,但有时会出现此错误。1。**Gtk:ERROR:/build/buildd/gtk+3.0-3.4.2/./gtk/gtktextview.c:3726:gtk_text_view_validate_onscreen: assertion failed: (priv->onscreen_validated)Aborted (core dumped)2。*** glibc detected *** python: free(): invalid next size (fast): 0x09c9f820 ***3。Segmentation fault (core dumped)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python