Использование часов в киви - PullRequest
0 голосов
/ 03 августа 2020

Я новичок в разделе разработки мобильных приложений. Я попытался использовать kivy.clock.Clock для планирования задачи, которая добавляет 1 к текущему тексту (целому числу) в метке внутри простого приложения, которое я создал. Просто мне нужно обновлять значение в метке один раз в три секунды. Начальное значение текста метки равно 4. Мне также нужно распечатать текущее значение, которое находится в метке, когда я нажал кнопку в своем приложении. Но это не работает. Может ли кто-нибудь помочь мне выяснить, в чем я виноват? Я опубликую полные коды в файлах main.py и my.kv ниже.

main.py

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.properties import ObjectProperty
from kivy.clock import Clock

class MyGrid(Widget):
    txtLbl = ObjectProperty(None)
    bTn = ObjectProperty(None)
    def on_start(self):
        Clock.schedule_interval(self.printNum, 3)
    def printNum(self, *args):
        self.txtLbl.text = str(int(self.txtLbl.text)+1)
    def myFunc(self):
        print('Current number in Label is ', self.txtLbl.text)

class MyApp(App):
    def build(self):
        return MyGrid()

if __name__ == '__main__':
    MyApp().run()


code in my.kv
=============


<MyGrid>:
    GridLayout:
        txtLbl:txtlbl
        bTn:btn
        size:root.width-100, root.height-100
        pos:50, 50
        cols:1
        Label:
            id:txtlbl
            text:'4'

        GridLayout:
            cols:1
            Button:
                text:'Print current number'
                id:btn
                on_press:root.myFunc()



1 Ответ

0 голосов
/ 03 августа 2020

Вот модифицированная версия вашего кода, которая делает то, что, я думаю, вы хотите:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.clock import Clock

kv = '''
<MyGrid>:
    txtLbl:txtlbl
    bTn:btn
    GridLayout:
        size:root.width-100, root.height-100
        pos:50, 50
        cols:1
        Label:
            id:txtlbl
            text:'4'

        GridLayout:
            cols:1
            Button:
                text:'Print current number'
                id:btn
                on_press:root.myFunc()
'''

class MyGrid(Widget):
    txtLbl = ObjectProperty(None)
    bTn = ObjectProperty(None)
    def on_start(self):
        Clock.schedule_interval(self.printNUm, 3)
    def printNum(self, *args):
        self.txtLbl.text = str(int(self.txtLbl.text)+1)
    def myFunc(self):
        print('Current number in Label is ', self.txtLbl.text)
    def update(self, dt):
        self.txtLbl.text = str(int(self.txtLbl.text) + 1)

class MyApp(App):
    def build(self):
        Builder.load_string(kv)
        mygrid = MyGrid()
        Clock.schedule_interval(mygrid.update, 3)
        return mygrid

if __name__ == '__main__':
    MyApp().run()

Обратите внимание, что txtLbl:txtlbl и bTn:btn в kv были перемещены вверх, чтобы они соответствует txtLbl = ObjectProperty(None) и bTn = ObjectProperty(None) класса MyGrid.

Clock используется для планирования метода update каждые 3 секунды. Этот метод обновляет текст Label, увеличивая его значение на единицу.

Я использовал Builder.load_string() только для собственного удобства.

...