2014-12-10 2 views
0

Я строю относительно простой интерфейс с использованием PyQt5. В приложении есть несколько моментов, которые запускают процесс, который занимает некоторое время, поэтому я использовал QApplication.setOverrideCursor, чтобы указать, что процесс запущен.QApplication.setOverrideCursor не влияет на эту функцию, почему?

Это делается с помощью этого декоратора (взято из this question):

def waiting_effects(function): 
    def new_function(self): 
     QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor)) 
     function(self) 
     QtWidgets.QApplication.restoreOverrideCursor() 
    return new_function 

Это работает для большинства методов в классе UI, за исключением одного:

@waiting_effects 
def load_data_folder(self): 

     folder = QtWidgets.QFileDialog.getExistingDirectory(self) 

     if folder: 
      self.clear_plot(name="All") 
      self.vr_headers = [] 
      self.ls_headers = [] 
      self.df = pvi.import_folder(folder) 

      if self.df['voltage recording'] is not None: 
       self.vr_headers = self.df['voltage recording'].columns[1:].tolist() 
       self.sweeps = self.df['voltage recording'].index.levels[0] 

      if self.df['linescan'] is not None: 
       self.ls_headers = self.df['linescan'].columns[1::2].tolist() 

       if self.df['voltage recording'] is None: 
        self.sweeps = self.df['linescan'].index.levels[0] 

       self.ratio_dropdown1.clear() 
       self.ratio_dropdown2.clear() 
       for profile in self.ls_headers: 
        self.ratio_dropdown1.addItem(profile) 
        self.ratio_dropdown2.addItem(profile) 

       self.tabWidget.setTabEnabled(2, True) 

      elif self.tabWidget.isTabEnabled(2): 
       self.tabWidget.setTabEnabled(2, False) 

      self.update_treeWidget() 

@waiting_effects декоратора в этот случай не вызывает никаких изменений в курсоре.

Вместо использования декоратора я попытался обернуть блок кода после QFileDialog с помощью QApplication.setOverrideCursor, но это не сработало. Т.е .:

def load_data_folder(self): 

     folder = QtWidgets.QFileDialog.getExistingDirectory(self) 

     QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor)) 
     if folder: 
      self.clear_plot(name="All") 
      self.vr_headers = [] 
      self.ls_headers = [] 
      self.df = pvi.import_folder(folder) 

      if self.df['voltage recording'] is not None: 
       self.vr_headers = self.df['voltage recording'].columns[1:].tolist() 
       self.sweeps = self.df['voltage recording'].index.levels[0] 

      if self.df['linescan'] is not None: 
       self.ls_headers = self.df['linescan'].columns[1::2].tolist() 

       if self.df['voltage recording'] is None: 
        self.sweeps = self.df['linescan'].index.levels[0] 

       self.ratio_dropdown1.clear() 
       self.ratio_dropdown2.clear() 
       for profile in self.ls_headers: 
        self.ratio_dropdown1.addItem(profile) 
        self.ratio_dropdown2.addItem(profile) 

       self.tabWidget.setTabEnabled(2, True) 

      elif self.tabWidget.isTabEnabled(2): 
       self.tabWidget.setTabEnabled(2, False) 

      self.update_treeWidget() 
     QtWidgets.QApplication.restoreOverrideCursor() 

Медленная часть этой функции является строка:

self.df = pvi.import_folder(folder) 

Это import_folder является функцией от другого модуля я написал, что загружает папки данных, которые создают наше программное обеспечение сбора. Я попробовал обернуть только эту строку с помощью QApplication.setOverrideCursor, но опять же это не произвело никакого эффекта.

Любые мысли/предложения о том, что здесь может быть?

Благодаря

+0

Я не могу проверить ваш код, но попробуйте поставить 'QtWidgets.qApp.processEvents()' сразу после строки, которая устанавливает курсор. – ekhumoro

+0

Yup, это сделал. Благодаря! Не стесняйтесь ответить на него, и я отметю правильно – user3014097

+0

Кроме того, если вы не возражаете объяснить, в чем проблема, связанная с этой строкой кода? – user3014097

ответ

2

Это выглядит как функция load_data_folder работает в основном GUI потоке, так что он будет блокировать любые дальнейшие обновления GUI до тех пор, пока не будет завершено.

Попробуйте положить QtWidgets.qApp.processEvents() сразу после строки, которая устанавливает курсор, и это должно позволить курсору обновляться до запуска функции.

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