Питон. Выполнение некоторой работы в фоновом режиме с графическим интерфейсом Gtk

  • питон 3.2.2
  • gtk3 3.2.2
  • python-объект 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()

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

Что я делаю неправильно?


person Atterratio    schedule 14.11.2011    source источник
comment
Вы должны включить код в свой вопрос.   -  person Lennart Regebro    schedule 15.11.2011
comment
Я использую pastebin, потому что не могу понять, как здесь работает вставка кода.   -  person Atterratio    schedule 15.11.2011
comment
Вы вставляете его, выбираете и нажимаете кнопку кода в редакторе.   -  person Lennart Regebro    schedule 15.11.2011
comment
Нет, не нужно никаких отклонений только:   -  person Atterratio    schedule 20.08.2016


Ответы (1)


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

Glib.threads_init() также кажется необходимым.

#!/usr/bin/env python3
from gi.repository import Gtk,Gdk, GLib
import threading 
import time

class Gui(Gtk.Window):
  def __init__(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.Window.connect('destroy', lambda x: self.stop())
      self.Window.add(self.outBut)

      self.Window.show_all()
      threading.Thread(target=loop_sleep).start()

  def stop(self):
      Gtk.main_quit()

  def passfun(self):
      pass

def loop_sleep():
      i = 1
      while True:
           print(i)
           i = i + 1
           #time.sleep(1)



app = Gui()
GLib.threads_init()
Gdk.threads_init()
Gdk.threads_enter()
Gtk.main()
Gdk.threads_leave()
person ib.lundgren    schedule 15.11.2011