Python.Делать некоторую работу над фоном с Gtk GUI - PullRequest
6 голосов
/ 14 ноября 2011
  • питон 3.2.2
  • gtk3 3.2.2
  • python-gobject 3.0.2

Я пытаюсь отобразить графический интерфейс и выполнить некоторую работу в фоновом режиме. Как я понимаю, это должно выглядеть примерно так:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


import time
from threading import Thread
from gi.repository import Gtk, Gdk

class Gui():
        def run(self):
                self.Window = Gtk.Window()
                self.Window.set_border_width(8)
                self.Window.set_title("Некий GUI")
                self.Window.connect('destroy', lambda x: self.stop())

                self.outBut = Gtk.Button.new_from_stock(Gtk.STOCK_OK)
                self.outBut.set_size_request(150, 35)
                self.outBut.connect('clicked', lambda x: self.passfun)
                self.Window.add(self.outBut)

                self.Window.show_all()

        def stop(self):
                Gtk.main_quit()

        def passfun(self):
                pass

class LoopSleep(Thread):
        def run(self):
                i = 1
                while True:
                        print(i)
                        i = i + 1
                        #time.sleep(1)



gui = Gui()
gui.run()

loopSleep = LoopSleep()
loopSleep.start()

Gdk.threads_init()
Gdk.threads_enter()
Gtk.main()
Gdk.threads_leave()

Но это не работает. Несколько циклов происходит при нажатии кнопки. И цикл запускается после закрытия окна. Но не вместе.

Что я делаю не так?

1 Ответ

8 голосов
/ 15 ноября 2011

Не могу претендовать на звание эксперта по потокам Python и gtk3, но, немного поиграв с вашим примером, я нашел что-то, что работает так, как вы этого хотите.Вместо подкласса Thread я использую threading.start (target = loop_sleep) и помещаю его в Gui.

Glib.threads_init () также, похоже, необходим.

...