2012-03-23 4 views
0

저는 파이썬에서 newb입니다. 간단한 GUI 애플리케이션을 만들려고합니다 : gtk.Spinner와 gtk.Button이있는 메인 윈도우. 버튼을 누르면 스피너가 5 초 후에 시작하고 멈 춥니 다. 여기에 내 코드가 있지만 작동하지 않습니다 :gtk.Spinner를 파이썬 스레드에서 사용 하시겠습니까?

#!/usr/bin/env python 
import thread 
import gtk 
import time 

class Spinner: 
    def __init__(self): 
     window = gtk.Window() 
     window.set_default_size(200, 200) 
     vbox = gtk.VBox(False, 5) 
     hbox = gtk.HBox(True, 5) 

     self.spinner = gtk.Spinner() 
     button_start = gtk.Button("Start") 


     window.connect("destroy", lambda w: gtk.main_quit()) 
     button_start.connect("clicked", self.start_animation) 

     window.add(vbox) 
     vbox.pack_start(self.spinner, True, True, 0) 
     vbox.pack_end(hbox, False, False, 0) 
     hbox.pack_start(button_start) 

     window.show_all() 

    def start_animation(self, widget): 
     self.lock = thread.allocate_lock() 
     thread.start_new_thread(self.spin,(self.lock,)) 
     while (not self.lock.locked()): 
      self.spinner.stop() 
     while self.lock.locked(): 
      self.spinner.start() 

     self.spinner.show() 

    def spin(self,lock): 
     self.lock.acquire() 
     time.sleep(10) 
     self.lock.release()  
Spinner() 
gtk.main() 

나는 스레드에 대한 몇 가지 예제를 읽고 그것을 사용하려고합니다. 하지만 그건 효과가 없어 .Plz 내가 도와 줘. Tks 많이.

+0

어떻게 작동하지 않습니까? – ptomato

답변

0
import sys 
import pygtk 
pygtk.require('2.0') 
import gtk 
import glib 


def buildGui(label, startAnimation): 
    window = gtk.Window() 
    window.set_default_size(200, 200) 
    vbox = gtk.VBox(False, 5) 
    hbox = gtk.HBox(True, 5) 
    spinner = gtk.Spinner() 
    button = gtk.Button('Start') 
    window.connect('destroy', gtk.main_quit) 
    button.connect('clicked', startAnimation, spinner) 
    window.add(vbox) 
    vbox.pack_start(gtk.Label(label), False, False, 0) 
    vbox.pack_start(spinner, True, True, 0) 
    vbox.pack_end(hbox, False, False, 0) 
    hbox.pack_start(button) 
    window.show_all() 
    gtk.main() 

def stopAnimation(button, spinner): 
    spinner.stop() 
    button.set_sensitive(True) 

def startAnimation(button, spinner): 
    button.set_sensitive(False) 
    glib.timeout_add_seconds(5, stopAnimation, button, spinner) 
    spinner.start() 

if len(sys.argv) == 2: 
    if sys.argv[1] == '--timeout': 
     def stop(button, spinner): 
      stopAnimation(button, spinner) 
      return False 
     def start(button, spinner): 
      startAnimation(button, spinner) 
      glib.timeout_add_seconds(5, stop, button, spinner) 
     label = 'using glib timeout' 
    elif sys.argv[1] == '--timer': 
     import threading 

     def stop(button, spinner): 
      stopAnimation(button, spinner) 

     def start(button, spinner): 
      startAnimation(button, spinner) 
      threading.Timer(5, stop, (button, spinner)) 
     label = 'using timer' 
else: 
    import threading 
    import time 

    def stop(button, spinner): 
     time.sleep(5) 
     stopAnimation(button, spinner) 
     spinner.stop() 

    def start(button, spinner): 
     startAnimation(button, spinner) 
     threading.Thread(target=stop, args=(button, spinner)) 
    label = 'using threading' 

buildGui(label, start) 
+0

도움에 감사드립니다. – depzaivai

관련 문제