计时器线程-AttributeError'...'没有属性'...'

时间:2019-04-03 19:53:38

标签: python multithreading timer

由于我是python的新手,所以我可能错过了显而易见的内容。

我已经为该RDP程序中计算fps的类编写了updateRates方法。

当我尝试从计时器方法的调用中访问某些属性时,出现此奇怪错误:

“ AttributeError:类型对象'RDCToGUI'没有属性'_cnt_framerate'”

很明显,此类继承了该属性,但是 Timer线程 中,它似乎不再存在

所以问题是:我可以调用super的继承方法(例如self.rates),但是 inside 中的某些属性不存在

class RDCToGUI(clientProtocol.rdc):
    def __init__(self):
        clientProtocol.rdc.__init__(self)
        self.num = 0
        self.count = 0
        self.framerate_before = 0

    def updateRates(self, framerate_label, datarate_label):
        divisor = 1
        datarate_text = "b/s"

        self.rates(self)
        framerate = self.framerate
        datarate = self.datarate

        if self.logged_in == 1 and self.framerate_before == 0 == framerate:
            self.framebufferUpdateRequest(
                width=800, height=800)
        if datarate > 1000000:
            divisor = 1000000
            rateText = "Mb/s"
        elif datarate > 1000:
            divisor = 1000
            rateText = "Kb/s"

        self.framerate_before = framerate

        framerate_label.setText(f"Framerate: {framerate}")
        datarate_label.setText(
            f"Datarate: {round(datarate / divisor, 2)} {datarate_text}")

        threading.Timer(1, self.updateRates, args=(self,
                                                   framerate_label, datarate_label)).start()
class rdc(Protocol):
    def __init__(self):
        self._packet = ""
        self._expected_len = 0
        self._cnt_framerate = 0
        self._cnt_datarate = 0
        self.framerate = 0
        self.datarate = 0
        self.logged_in = 0

    def rates(self):
        self.setRates(self)
        self.resetCounter(self)

    def setRates(self):
        self.framerate = self._cnt_framerate
        self.datarate = self._cnt_datarate

    def resetCounter(self):
        self._cnt_datarate = 0
        self._cnt_framerate = 0

    def incFramerate(self):
        self._cnt_framerate += 1

    def addDataSize(self, size):
        self._cnt_datarate += size

与我展示的相比,这些类具有更多的方法和成员,但希望将其切入最重要的内容。

试图将方法放在不同的类中,并使用属性名称

rdc类在另一个文件中,该文件作为clientProtocol导入。

1 个答案:

答案 0 :(得分:0)

这似乎是一个继承问题。也许尝试替换

clientProtocol.rdc.__init__(self)

使用

super(RDCToGUI, self).__init__()

我也不是继承专家,也没有真正使用过继承,但是在super()函数上有大量内容可供阅读,您也许可以从Understanding Python super() with __init__() methods开始并紧随其后在兔子洞里:)