2014-12-09 11 views
2

스레드를 필요로하는 함수가 있습니다.이 함수에는 QThread을 사용하고 있는데,이 함수에는 win32com 호출이 있지만, 그들은 AttributeError을 발생시킵니다.AttributeError - QThread and Win32com

왜 그런 일이 벌어지며 해결할 수 있습니까? 나는이 스크립트를 실행하고 버튼을 클릭하면이 AttributeError 제기

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() 

: 여기

가 일부 코드의

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 

pyfoobar이 볼륨을 설정할 수 있습니다 foobar2000에 액세스하려면 모듈을 캐치 노래 이름 등

win32com 모듈 주위에 빌드, 재생 (오류 제기 하나)입니다 :

playback = win32com.client.Dispatch("Foobar2000.Application.0.7") 

QThread에서 실행하지 않으면 코드가 잘 작동하지만 while 루프 때문에 UI가 정지됩니다.

답변

1

왜이 문제가 해결되었는지 잘 모르겠습니다. 하지만 여기에 있습니다 :

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()