我正在构建一个我想在使用pyqt和其他guis的应用程序中使用的API。 如果一个程序员正在使用其他的gui,我不希望她必须导入pyqt等。 我的问题是我使用任务订阅消息并将它们传递给主任务。 我通过传递一个参数(qt)来实现这一点,该参数是True或False,具体取决于我们正在实现的gui。 然后我创建一个类,生成一个QtCore.QThread或Thread的SubscriberParent类。最终的SubscriberThread 是SubscriberThreadParent类型。 主线程轮询interTaskQueue或使用Qt的信号和槽来处理消息。
class Gui(object):
def __init__(self, qt):
if qt:
from PyQt5 import QtCore
from PyQt5.QtCore import Qt, pyqtSignal
class SubScriberThreadParent(QtCore.QThread):
def __init__(self):
QtCore.QThread.__init__(self)
else:
from threading import Thread
class SubScriberThreadParent(Thread):
def __init__(self):
Thread.__init__(self)
class SubscriberThread(Gui.SubScriberThreadParent):
def __init__(self, qt, dsParam, SubScriberThreadParent):
if qt:
from PyQt5 import QtCore
from PyQt5.QtCore import Qt, pyqtSignal
pubIn = pyqtSignal(str, str)
SubScriberThreadParent.__init__(self)
self.interTaskQueue = dsParam.interTaskQueue
.
.
.
.
#
# Pass the message on to the main application
#
def alertMainApp(self, bodyTuple):
if self.qt:
btz = '{0}'.format(bodyTuple)
self.pubIn.emit(btz)
LOGGER.info("Emitted Alert ")
else:
if self.interTaskQueue != None:
self.interTaskQueue.put(bodyTuple) # Pass it to the main thread
LOGGER.info("Queued Alert.")
else:
LOGGER.error("No Inter-task data transfer method available to the subscriber task!")
我用这种方法得到的错误是:" AttributeError:type object' Gui'没有属性' SubScriberThreadParent'"
我该如何做到这一点?
我也想了解条件导入的范围。
答案 0 :(得分:1)
为了让一个类从Gui.SubScriberThreadParent
继承,你必须创建一个Gui
的实例,并为类变量赋值。
考虑以下代码:
class Gui:
def __init__(self, qt):
if qt:
class Foo:
att = 'Foo'
Gui.Parent = Foo
else:
class Bar:
att = 'Bar'
Gui.Parent = Bar
def makeThread():
class Thread(Gui.Parent):
def __init__(self):
self.att = Gui.Parent.att
return Thread()
def main():
Gui(False)
t = makeThread()
print(t.att)
main()
输出:
如上所述Gui(False)
,输出为:
Bar
当更改为Gui(True)
时,输出为:
Foo