首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeError - QThread和Win32com

AttributeError - QThread和Win32com
EN

Stack Overflow用户
提问于 2014-12-09 01:25:59
回答 1查看 1.1K关注 0票数 2

我有一个函数需要一个线程,我使用一个QThread来处理它,在这个函数中有一些win32com调用,但是它们正在引发AttributeError

为什么会发生这种事,我能解决吗?

下面是一些代码:

代码语言:javascript
复制
class MyThread(QtCore.QThread):
    def __init__(self):
        super(MyThread, self).__init__()

    def run(self):
        FB2K = foobar()
        while True:
            CurrentVolume = float(FB2K.currentVolumeLevel().strip('dB'))
            FB2K.setVolumeLevel(CurrentVolume - 0.1)
            sleep(1)


class MainFrame(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.button = QPushButton(self)
        self.thread = MyThread()
        self.button.clicked.connect(self.my_function)

    def my_function(self):
        self.thread.start()

如果运行此脚本并单击按钮,它将引发AttributeError:

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:/My Python Programs/foobar_acess.py", line 18, in run
    CurrentVolume = float(FB2K.currentVolumeLevel().strip('dB'))
  File "C:\Python27\pyfoobar.py", line 50, in currentVolumeLevel
    return str(playback.Settings.Volume) + "dB"
  File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 516, in __getattr__
    raise AttributeError("%s.%s" % (self._username_, attr))
AttributeError: <unknown>.Settings

吡咯烷酮是一个访问foobar2000的模块,它可以设置音量、捕捉歌曲名等。

它是围绕win32com模块构建的,回放(引发错误的那个)是:

代码语言:javascript
复制
playback = win32com.client.Dispatch("Foobar2000.Application.0.7")

如果QThread不运行,run()下的代码可以正常工作,但是它会冻结UI,因为使用了while循环。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-09 02:31:51

不知道为什么这个能修好它。但以下是如何:

代码语言:javascript
复制
class MyThread(QtCore.QThread):
    def __init__(self):
        super(MyThread, self).__init__()

    def run(self):
        import win32com.client
        import pythoncom
        pythoncom.CoInitialize()
        ProgID = "Foobar2000.Application.0.7"
        foobar_COM_object = win32com.client.Dispatch(ProgID)
        playback = foobar_COM_object.Playback

        while True:
            playback.Settings.Volume -= 0.1
            sleep(1)


class MainFrame(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.button = QPushButton(self)
        self.thread = MyThread()
        self.button.clicked.connect(self.my_function)

    def my_function(self):
        self.thread.start()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27369995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档