2014-01-24 38 views
0

我正在使用python gtk通过boto API将文件上传到S3服务,当上传文件并在完成上传过程后释放GUI时,GUI会触发GUI,我正在使用线程显示上传进度图形用户界面,但它袭来。你能否提出一些建议,在上传完成之前,如何在GUI或任何微调器中显示上传进度。我是新来的蟒蛇可以建议如何使用GUI的线程也。Python GTK GUI触击

#!/usr/bin/env python 
import pygtk 
pygtk.require('2.0') 
import gtk 
import boto 
from boto.s3.connection import S3Connection 
from boto.s3.key import Key 
from boto.exception import S3ResponseError, S3CreateError 
import threading 
import random, time 
gtk.threads_init() 

class FractionSetter(threading.Thread): 
    """This class sets the fraction of the progressbar""" 

    #Thread event, stops the thread if it is set. 
    stopthread = threading.Event() 

    def run(self): 
     """Run method, this is the code that runs while thread is alive.""" 

     #Importing the progressbar widget from the global scope 
     global progressbar 

     #While the stopthread event isn't setted, the thread keeps going on 
     while not self.stopthread.isSet() : 
      # Acquiring the gtk global mutex 
      gtk.threads_enter() 
      #Setting a random value for the fraction 
      progressbar.set_fraction(random.random()) 
      # Releasing the gtk global mutex 
      gtk.threads_leave() 

      #Delaying 100ms until the next iteration 
      time.sleep(0.1) 

    def stop(self): 
     """Stop method, sets the event to terminate the thread's main loop""" 
     self.stopthread.set() 




class SampleGUI: 

    def destroy(self,widget,data=None): 
     global fs 
    fs.stop() 
     gtk.main_quit() 

    def get_relative_filename(self, filename): 
     f_parts = filename.split('/') 
     return f_parts[len(f_parts) - 1] 
    def browse(self,widget): 
     chooser1 = gtk.FileChooserDialog(title=None,action=gtk.FILE_CHOOSER_ACTION_OPEN, 
            buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) 
     chooser1.set_show_hidden(True) 
     response1 = chooser1.run() 
     if response1 == gtk.RESPONSE_OK: 
      global filename1 
      filename1 = chooser1.get_filename() 
      self.textbox.set_text(filename1) 
      print filename1 
     elif response1 == gtk.RESPONSE_CANCEL: 
      chooser1.destroy() 

     chooser1.destroy() 
    def ensure_bucket(self,connection, bucket, canned_acl=None): 
     bucket_instance = None 


     try: 
      print 'Checking bucket:', bucket 
      bucket_instance = connection.get_bucket(bucket) 
     except S3ResponseError, s3error: 
      s3error_string = '%s' % s3error 
      if s3error_string.find('404') >= 0: 
       try: 
        bucket_instance = self.create_bucket(connection, bucket, 
          canned_acl) 
       except S3CreateError: 
        print 'Unable to create bucket %s' % bucket 
        message1 = gtk.MessageDialog(type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_OK) 
        msgg = "Unable to create bucket "+bucket 
        message1.set_markup(msgg) 
        message1.run() 
        message1.destroy() 
      elif s3error_string.find('403') >= 0: 
       message1 = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK) 
       msgg = "You do not have permission to access bucket" 
       message1.set_markup(msgg) 
       message1.run() 
       message1.destroy() 
       d.hide() 
       d.destroy() 
       print 'You do not have permission to access bucket:', bucket 

      else: 
       print s3error_string 
       sys.exit() 
     return bucket_instance 

    def upload_file(self,bucket_instance, filename, 
         canned_acl=None): 
     fs = FractionSetter() 
     global fs 
     fs.start() 

     print 'Uploading file' 
     print "file name",filename 
     k = Key(bucket_instance) 
     k.key = self.get_relative_filename(filename) 
     m_file = open(filename, 'rb') 
     print filename 
     try: 
      k.set_contents_from_file(m_file,policy=canned_acl) 
      fs.stop() 
     except S3ResponseError, s3error: 
      s3error_string = '%s' % s3error 
      if s3error_string.find('403') >= 0: 
       print 'Permission denied while writing:', k.key 
      else: 
       print s3error_string 
      sys.exit() 

    def submitt(self,widget): 
     print "submitt" 
     global filename1 
     print "file name",filename1 
     conn = boto.s3.connection.S3Connection(
        aws_access_key_id='WKy3rMzOWPouVOxK1p3Ar1C2uRBwa2FBXnCw', 
        aws_secret_access_key='UmMJCdlCXvW9DJOgN2MkTOmEXJJKcQu62bFWg', 
        is_secure=False, 
        host="10.184.39.113", 
        port=8773, 
        calling_format=boto.s3.connection.OrdinaryCallingFormat(), 
        path='/services/Walrus', 
        ) 
     print conn 
     bucket_instance = self.ensure_bucket(conn, "sample", canned_acl=None) 
     print bucket_instance 
     self.upload_file(bucket_instance, filename1, canned_acl=None) 
    def pageChanged(self,notebook,page,page_num): 
     print "ClickedMe called for" 


    def __init__(self): 

     self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.window.set_position(gtk.WIN_POS_CENTER_ALWAYS) 
     self.window.set_size_request(600,400) 
     self.window.set_title("UPLOAD A OBJECT TO S3") 
     self.window.set_resizable(False) 

     self.button1 = gtk.Button("Browse") 
     self.button1.connect("clicked",self.browse) 

     self.button2 = gtk.Button("Submit") 
     self.button2.connect("clicked",self.submitt) 

     self.textbox = gtk.Entry() 

     self.label1 = gtk.Label("<b>Upload objects to S3</b>") 
    self.label1.set_use_markup(True) 
     self.table = gtk.Table(5, 5, True) 


     notebook = gtk.Notebook() 
     notebook.set_tab_pos(gtk.POS_TOP) 
     notebook.connect("switch-page",self.pageChanged) 
     page1 = gtk.Frame(label=None) 

     self.table.attach(self.label1, 1, 4, 1, 2) 
     self.table.attach(self.textbox, 1, 4, 2, 3) 
     self.table.attach(self.button1, 4, 5, 2, 3, xpadding=20, ypadding=20) 

     self.table.attach(self.button2, 4, 5, 3, 4,xpadding=20, ypadding=20)   
     global progressbar 
     progressbar = gtk.ProgressBar() 
     self.table.attach(progressbar, 0, 5, 4, 5, xpadding=20, ypadding=20) 
     page1.add(self.table) 

     notebook.append_page(page1,gtk.Label('Upload Files')) 
     self.window.add(notebook) 
     self.window.show_all() 
     self.window.connect("destroy",self.destroy) 


    def main(self): 
     gtk.main() 
     fs = FractionSetter() 
     global fs 
     fs.start() 


if __name__ == "__main__": 
    base = SampleGUI() 
    base.main() 

回答