由于我是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导入。
答案 0 :(得分:0)
这似乎是一个继承问题。也许尝试替换
clientProtocol.rdc.__init__(self)
使用
super(RDCToGUI, self).__init__()
我也不是继承专家,也没有真正使用过继承,但是在super()
函数上有大量内容可供阅读,您也许可以从Understanding Python super() with __init__() methods开始并紧随其后在兔子洞里:)