2013-12-04 2 views
1

Я пытаюсь завершить свое первое учебное приложение для Python, я использовал конструктор PyQT5 для создания базового пользовательского интерфейса и использовал следующее, чтобы проверить, и я получаю ошибку NameError: global name 'self' is not defined. Мой вопрос заключается в том, что является правильной процедурой для обновления txtProg (текстовый редактор) в графическом интерфейсе.Self scope в приложении PyQT5?

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'main.ui' 
# 
# Created: Sun Dec 1 20:19:03 2013 
#  by: PyQt5 UI code generator 5.1.1 
# 
# WARNING! All changes made in this file will be lost! 

import sys 
from PyQt5 import QtCore, QtGui, QtWidgets 
from mydl import TheDLClass 

def progress_hook(txt): 
    self.txtProg.setText(txt) 


class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(800, 600) 
     self.centralwidget = QtWidgets.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.txtProg = QtWidgets.QPlainTextEdit(self.centralwidget) 
     self.txtProg.setGeometry(QtCore.QRect(50, 80, 661, 431)) 
     self.txtProg.setObjectName("txtProg") 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtWidgets.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) 
     self.menubar.setObjectName("menubar") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtWidgets.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 
     self.retranslateUi(MainWindow) 
     self.launchit(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 




    def retranslateUi(self, MainWindow): 
     _translate = QtCore.QCoreApplication.translate 
     MainWindow.setWindowTitle(_translate("MainWindow", "My Downloader")) 

    def launchit(self, MainWindow): 
     MainWindow.setWindowTitle('Launching..') 
     with TheDLClass() as dl: 
      dl.fd.add_progress_hook(progress_hook) 
      dl.download(['http://myurl.com/']) 

if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    MainWindow = QtWidgets.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

ответ

0

Вы не можете получить доступ к self, не передавая его явно. (С использованием метода или лямбда)

Более предпочтительно, определяют progress_hook как метод экземпляра:

def progress_hook(self, txt): 
    self.txtProg.setText(txt) 

и привязать его следующим образом:

def launchit(self, MainWindow): 
    MainWindow.setWindowTitle('Launching..') 
    with TheDLClass() as dl: 
     dl.fd.add_progress_hook(self.progress_hook) # <---- 
     dl.download(['http://myurl.com/']) 
+0

Теперь это 'AttributeError: объект 'Ui_MainWindow' не имеет атрибута 'progress_hook'' – Stacked

+0

@Stacked, вы определили 'progress_hook' как' Ui_MainWindow'? – falsetru

+0

Нет, как это сделать? – Stacked

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