AttributeError: у объекта 'float' нет атрибута 'texty' - PullRequest
1 голос
/ 08 января 2020

Я впервые экспериментирую с Python, пробуя язык, я выбрал Kivy как свою GUI библиотеку и получил ее частичную работу. Однако, похоже, он не распознает определенную функцию, хотя я установил ее как глобальную переменную.

import psutil
import time
import threading
from kivy.clock import Clock
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout

class ExampleApp(App):
    def build(self):
        b = BoxLayout()
        self.texty = Label(text=str(psutil.cpu_percent()))
        b.add_widget(self.texty)
        return b

    def update(self):
            self.texty.text = str(psutil.cpu_percent())

    Clock.schedule_interval(update, 1.0)

ExampleApp().run()

Отслеживание:

Traceback (most recent call last):
   File "D:\Python Projects\Kivy\main.py", line 21, in <module>
     ExampleApp().run()
   File "C:\Users\K0vac\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kivy\app.py", line 855, in run
     runTouchApp()
   File "C:\Users\K0vac\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kivy\base.py", line 504, in runTouchApp
     EventLoop.window.mainloop()
   File "C:\Users\K0vac\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kivy\core\window\window_sdl2.py", line 747, in mainloop
     self._mainloop()
   File "C:\Users\K0vac\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kivy\core\window\window_sdl2.py", line 479, in _mainloop
     EventLoop.idle()
   File "C:\Users\K0vac\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kivy\base.py", line 339, in idle
     Clock.tick()
   File "C:\Users\K0vac\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kivy\clock.py", line 591, in tick
     self._process_events()
   File "kivy\_clock.pyx", line 384, in kivy._clock.CyClockBase._process_events
   File "kivy\_clock.pyx", line 414, in kivy._clock.CyClockBase._process_events
   File "kivy\_clock.pyx", line 412, in kivy._clock.CyClockBase._process_events
   File "kivy\_clock.pyx", line 167, in kivy._clock.ClockEvent.tick
   File "D:\Python Projects\Kivy\main.py", line 17, in update
     self.texty.text = str(psutil.cpu_percent())
 AttributeError: 'float' object has no attribute 'texty'

Любые идеи о том, как решить эту проблему ошибка? Спасибо!

1 Ответ

1 голос
/ 08 января 2020

Чтобы понять проблему, сделайте следующее изменение:

def update(self):
    print(self)

И вы увидите, что вы получите следующее:

# ...
0.995747223001672
0.9959899680106901
0.9982999769854359
0.9948770129994955
# ...

Почему self число, а не экземпляр класса? Ну, потому что в области, где вы используете Часы, он ведет себя как функция и schedule_interval() передает в качестве первого параметра время, которое он запускает, что, как вы видите, почти совпадает с периодом 1,0 секунды.

Так что Решение лучше использовать schedule_interval внутри методов, таких как build:

import psutil

from kivy.app import App
from kivy.clock import Clock

from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout


class ExampleApp(App):
    def build(self):
        b = BoxLayout()
        self.texty = Label(text=str(psutil.cpu_percent()))
        b.add_widget(self.texty)
        <b>Clock.schedule_interval(self.update, 1.0)</b>
        return b

    def update(self, <b>dt</b>):
        self.texty.text = str(psutil.cpu_percent())


if __name__ == "__main__":
    ExampleApp().run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...