내 오류의 전체 역 추적은 다음과 같습니다비슷한 케이스에서 잘 작동하는 것으로 보이는 스레드 된 pyside 코드에서 'TypeError :'list 'object'를 호출 할 수 없습니다 '오류를 어떻게 해결할 수 있습니까?
> python zthreadtest_tjedit.py
None
Traceback (most recent call last):
File "zthreadtest_tjedit.py", line 17, in run self.function()
TypeError: 'list' object is not callable
내가 그이 코드는 특정 비트 시스템이며 아마도 대부분의 사람들을위한 실행 가능한 예제로 제공되지 않습니다이다 죄송합니다. 잘만되면 누군가가 바로 볼 수있는 솔루션은 간단합니다. 현재 가져온 zpool을 사용하여 zfs를 실행하지 않고 weir.zfs 모듈이 설치된 * nix 플랫폼에있는 경우 비 스레드 코드가 활성화 된 빈 목록을 반환합니다 (스레딩 토글 코드의 주석 참조) . 스레딩 모듈이 활성화되면 위와 같이 오류가 발생합니다.
나를 혼란스럽게하는 것은 Jo Plaete (https://joplaete.wordpress.com/2010/07/21/threading-with-pyqt4/)의 두 번째 코드가 오류없이 실행된다는 것입니다.이 코드를 제 필요에 맞게 간단히 수정했습니다. EDIT :이 오류의 원인은 내 코드에서 사용되는 목록 개체와 관련이있을 수 있지만 필자는 여전히 내 작업을해야합니다.
제 질문은 : 스레드 모듈이 올바르게 실행되는 것과 같은 오류를 어떻게 해결합니까?
이것은 단순 해 보이지만 나는 절대적으로 곤란합니다. 이렇게 많은 것이 이것이 어떤 도움말 포럼 에나 게시 한 첫 번째 질문입니다! 나는 내 질문에 올바르게 대답했기를 바랍니다. 나는 어떤 도움을 주셔서 감사합니다.
내 코드, 훨씬 더 큰 pyside GUI 프로그램에서 : 나는 조 Plaete에서 모델
import PySide, sys
from PySide import QtCore, QtGui
from PySide.QtCore import *
from PySide.QtGui import *
import re, subprocess, threading
from weir import zfs
class WorkerThread(QThread):
def __init__(self, function):
QThread.__init__(self)
self.function = function
def __del__(self):
self.wait()
def run(self):
self.function()
return
class MainZ(QMainWindow):
def __init__(self):
super(MainZ, self).__init__()
# print(self)
# imported_pools = self.get_imported() # No threading
imported_pools = self.thread_test() # Use threading module
print(imported_pools)
def thread_test(self):
self.threader = WorkerThread(self.get_imported())
self.threader.start()
def get_imported(self):
pool_string = subprocess.getoutput(
'zpool list |grep -v ^NAME.*SIZE.*ALLOC |grep -o ^[a-Z0-9]*')
imported_pools = re.split(r'\s *', pool_string)
return imported_pools
app = QApplication(sys.argv)
form = MainZ()
app.exec_()
코드 오류없이 나를 위해 작동 :
import sys, time
from PySide import QtCore, QtGui
class GenericThread(QtCore.QThread):
def __init__(self, function, *args, **kwargs):
QtCore.QThread.__init__(self)
self.function = function
self.args = args
self.kwargs = kwargs
def __del__(self):
self.wait()
def run(self):
self.function(*self.args,**self.kwargs)
return
class MyApp(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 280, 600)
self.setWindowTitle('threads')
self.layout = QtGui.QVBoxLayout(self)
self.testButton = QtGui.QPushButton("test")
self.connect(self.testButton, QtCore.SIGNAL("released()"), self.test)
self.listwidget = QtGui.QListWidget(self)
self.layout.addWidget(self.testButton)
self.layout.addWidget(self.listwidget)
def add(self, text):
""" Add item to list widget """
print("Add: " + text)
self.listwidget.addItem(text)
self.listwidget.sortItems()
def addBatch(self,text="test",iters= 5,delay=0.2):
""" Add several items to list widget """
for i in range(iters):
time.sleep(delay) # artificial time delay
self.add(text+" "+str(i))
def test(self):
self.listwidget.clear()
self.genericThread = GenericThread(
self.addBatch,"from generic thread ",delay=0.3)
self.genericThread.start()
# run
app = QtGui.QApplication(sys.argv)
test = MyApp()
test.show()
app.exec_()
여기에 복사하여 붙여 넣지 않은 추적 코드에는 적어도 일부 대답이 있습니다. –
내 편집 내용이 귀하가 언급 한 내용이되기를 바랍니다. 그곳에있는 아무 것도 나를 즉시 깨닫지 못했지만, 당신의 인도를 받아서 다시 그것을 통과 할 것입니다 ... – airhuff
아직도 그것을 얻지 못하고 있습니다. Plaete의 'GenericThread'클래스를 사용하여 비슷한 미니 프로그램을 성공적으로 구현했습니다. (더 많은 작업 코드로 게시물을 오염시키지 않겠습니다.) 그런 식으로 전화를 걸려고하는 주 프로그램의 모든 부분에 오류가 있습니다. 내가 얻지 못하는 몇 가지 차이가있다. – airhuff