2011-11-14 7 views
5
  • 파이썬 3.2.2
  • gtk3 3.2.2
  • 파이썬-G 객체 3.0.2

내가 표시하기 위해 노력하고있어 GUI 및 백그라운드에서 일부 작업을 수행합니다. 내가 이해할 때 다음과 같이 보일 것입니다 :Python. 은 Gtk GUI와 배경에 몇 가지 작업을 수행

#!/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() 

그러나 작동하지 않습니다. 단추를 누르면 여러주기가 발생합니다. 그리고 창은 닫힌 후에 실행됩니다. 그러나 함께하지 마라.

내가 뭘 잘못 했니?

+0

질문에 코드를 포함해야합니다. –

+0

작업 코드 붙여 넣기 방법을 이해할 수 없기 때문에 pastebin을 사용합니다. – Atterratio

+1

붙여 넣기를 선택하고 편집기에서 코드 버튼을 누릅니다. –

답변

8

파이썬 스레딩이나 gtk3에 대한 전문가가 될 수 있다고 주장 할 수는 없지만 예제로 조금 놀고 난 후에는 원하는 방식으로 작동하는 것으로 나타났습니다. 스레드를 하위 분류하는 대신 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() 
관련 문제