Python - AttributeError:'MyLogger'对象没有属性'ui'

时间:2015-10-12 20:36:34

标签: python pyqt

我是python和对象的新手,对不起,我需要帮助。 :) 当我运行我的代码时获取此错误:“Python - AttributeError:'MyLogger'对象没有属性'ui'”。

这是因为我正在使用两个课程? 我可以改变进度条的值吗?

这是我的代码:

from __future__ import unicode_literals
from Musicdl import *
import sys, youtube_dl, re, threading

class Musicdl(QtGui.QDialog):
     def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Window()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.button_download,     QtCore.SIGNAL('clicked()'), start_thread)

class MyLogger(object):
    def debug(self, msg):
        get_progressvalue(self, msg)
    def warning(self, msg):
        pass
    def error(self, msg):
        pass

def start_thread():
    t = threading.Thread(target=download)
    t.start()

def my_hook(d):
    if d['status'] == 'finished':
        print('Descarga completada. Convirtiendo ...')

ydl_opts = {
    "progress_with_newline": True,
    "outtmpl": "%(title)s.%(ext)s",
    'format': 'bestaudio/best',
    'postprocessors': [{
        'key': 'FFmpegExtractAudio',
        'preferredcodec': 'mp3',
        'preferredquality': '320',
    }],
    'logger': MyLogger(),
    'progress_hooks': [my_hook],
}

progressvalue = int(0)

def get_progressvalue(self, msg):
    global progressvalue
    match = re.match(r'\[\w+\]\s+(\d{1,3})', msg)
    if match:
        value = int(match.group(1))
        if value != progressvalue:
            progressvalue = value
            print(progressvalue)
            self.ui.progressbar.setValue(10)

def download():
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download(['...'])
        print('Terminado.')

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = Musicdl()
    myapp.show()
    sys.exit(app.exec_())

很抱歉写了所有代码,但我不知道该怎么做。

非常感谢!!

1 个答案:

答案 0 :(得分:1)

我怀疑使用第一个参数作为记录器调用get_progressvalue()

self.ui.progressbar.setValue(10)

这是产生错误的行(内部MyLogger

    def debug(self, msg):
        get_progressvalue(self, msg)

我怀疑get_progressvalue中的self必须被Musicdl对象替换为MyLogger,而不是MyLogger。

看到你的评论,你应该做的是将Musicdls self传递给myLoggers初始化程序。更好的是只传递音乐属性。

class MyLogger(object):
    def __init__(self, musicdl=None):
        self.musicdl = musicdl
    def debug(self, msg):
        get_progressvalue(self.musicdl, msg)
    def warning(self, msg):
        pass
    def error(self, msg):
        pass

这不是最佳解决方案,但要使其正常工作,您必须将ydl_opts["logger"]条目更改为&#34;如果名称为主循环&#34; {<1}}。