2013-03-27 2 views
0

Я пытаюсь управлять файлами, содержащими «другие файлы» (много мелких файлов, хранящихся в нескольких больших файлах). «Двигатель» работает неплохо, но у меня есть некоторые проблемы с графическим интерфейсом. Некоторые функции являются потоковыми из-за времени обработки, например, удаления или добавления файлов. Вот часть кода:PyGTK + резьба; windows неожиданно зависает

import gtk, os, data, time, threading, subprocess 
import Image, re 
gtk.gdk.threads_init() 

#some unimportant code - creating window with some buttons and IconView item (to show elements in currently opened directory) 
    def _del_thread(self): #deletes items selected in gtk.IconView 
     dl, fl = self.items #self.items stores selected dirs and files 
     for d in dl: 
      self.changestatus('Deleting: '+data.dirs[d][0]+'...') #prints the text at StatusBar (data.dirs[d][0] is a filename) 
      data.RemoveDir(d) #recursively removes all content in directory d 
     for f in fl: 
      self.changestatus('Usuwanie pliku: '+data.files[f][0]+'...') 
      data.PopFile(f) #removes single file 
     self.changestatus('') #clears the StatusBar 
     self.refresh() #some elements are deleted - refresh IconView 

    def _add_thread(self, fl): #adds files listed in fl 
     for f in fl: 
      self.changestatus('Adding: '+f[-50:]+'...') 
      #some unimportant code (recognizing file's extension and generating a thumbnail 
      data.PutFile(f, thumb, self.dir) #adds the file with generated thumbnail to currently opened directory (self.dir) 
     self.changestatus('') #clears the StatusBar 
     self.refresh() #some elements are added - refresh IconView 

    def Delete(self, widget): #triggered by clicking a context-menu item 
     md = gtk.MessageDialog(None, gtk.DIALOG_DESTROY_WITH_PARENT, \ 
           gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, \ 
           "Do you want to remove selected items?") 
     res = md.run() 
     md.destroy() 
     if res == gtk.RESPONSE_OK: 
      t = threading.Thread(target=self._del_thread) #start new thread 
      t.start() 

    def Add(self, widget): #triggered by clicking a context-menu item 
     chooser = gtk.FileChooserDialog(title='Select files to add...',action=gtk.FILE_CHOOSER_ACTION_OPEN, 
             buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) 
     chooser.set_select_multiple(True) 
     response = chooser.run() 
     if response == gtk.RESPONSE_OK: 
      #star new thread with selected files' list as an argument 
      t = threading.Thread(target=self._add_thread, args=(chooser.get_filenames(),)) 
      t.start() 
     chooser.destroy() 

Существует также третья функция, выполняемая в потоке, но это неважно. Он быстрый (~ 1 с), всегда выполняется отлично и никогда не замерзает окно. Другие два (показанные выше) иногда выполняются хорошо, иногда нет. Например, я выбираю некоторые файлы в FileChooserDialog, начинается добавление потока, StatusBar, последовательно показывающий, что файлы добавляются в настоящее время, а в конце окно замерзает. После этого окно выглядит так (извините за описание полировки): pygtk window + threading, window freezes Почему нить иногда обрабатывается без проблем, а иногда нет?

С наилучшими пожеланиями, mopsiok

ответ

2

Я думаю, что я нашел эту проблему. Согласно http://faq.pygtk.org/index.py?file=faq20.006.htp&req=show, я должен был добавить gtk.threads_enter() перед каждой функцией gtk в потоке и gtk.threads_close() после нее. Теперь это работает нормально.

Смежные вопросы