2016-06-06 3 views
0

Я пытаюсь использовать переменную из одного класса в другой, но я получаю ошибку «Run() отсутствует 1 необходимый позиционную аргумент:" MyWindowClass»Доступ к переменной из другого класса

class TaskThread(QtCore.QThread): 
    updateProgressSignal = QtCore.pyqtSignal(int) 
    def run(self, MyWindowClass): 
     for i in range(101): 
      self.updateProgressSignal.emit(i) 
      print (MyWindowClass.pbTimeUpdate) 
      time.sleep(MyWindowClass.pbTimeUpdate) 

class MyWindowClass(QtGui.QDialog): 
    def __init__(self, *args): 
     super(MyWindowClass, self).__init__(*args) 
     self.pbTimeUpdate = .2 
     self.myLongTask = TaskThread() 
     self.myLongTask.updateProgressSignal.connect (self.onProgress) 
     self.myLongTask.start() 

    def onProgress (self, val) 
     print (val) 

I «Я попытался сделать переменную global (объявленную за пределами обоих классов в том же файле), но обновив значение переменной в одном классе, другой класс все еще видит исходное значение)

В чем может быть проблема?

+0

Вы звоните 'TaskThread.run' без аргументов где-то, но, как ожидается, будет вызвано с 1 позиционным аргументом, например, * MyWindowClass *, который btw затеняет глобальное имя, ссылающееся на класс. Поскольку 'MyWindowClass' в соответствии с вашим примером является глобальным, просто оставьте аргумент из' def run (self, MyWindowClass): '. –

+0

Просьба поделиться всем сообщением о трассировке стека/ошибкой и кодом, на который ссылается. Нам нужно увидеть неудавшийся вызов 'run()' – skrrgwasme

+0

Не уверен, что это то же самое, но я не вызываю run, я вызываю start ... Я создаю задачу и начинаю следующим образом: self.myLongTask = TaskThread() self.myLongTask.updateProgressSignal.connect (self.onProgress), self.myLongTask.start() .. Эта часть работает, TaskThread начинает работать на этом этапе. Я попробовал просто def run (self), но получаю сообщение об ошибке, что MyWindowClass не имеет атрибута pbTimeUpdate. – ben

ответ

1

Это должно работать:

class MyWindowClass(QtGui.QDialog): 
    pbTimeUpdate = .2 

class TaskThread(QtCore.QThread): 
    updateProgressSignal = QtCore.pyqtSignal(int) 

    def run(self): 
     for i in range(101): 
      self.updateProgressSignal.emit(i) 
      print(MyWindowClass.pbTimeUpdate) 
      time.sleep(MyWindowClass.pbTimeUpdate) 
+0

В этом порядке и только с запуском (self) ошибка изменяется на: AttributeError: тип объекта «MyWindowClass» не имеет атрибута «pbTimeUpdate». Ясно, почему он не признает это? – ben

+0

Да, потому что вам нужно и экземпляр MyWindowClass, так как этот атрибут установлен в __init__ не как атрибут уровня класса –

+0

обновил мой ответ, это должно работать –

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