Home > database >  Kivy: update label asynchronous
Kivy: update label asynchronous

Time:10-28

I'm new to python and I'm writing this program in kivy to tell me which class it is when I turn on the program but I want to update the label for which subject I'm in continuously but when I try to use a while loop, I can't run any other things. I want to run the class Main.checkclass continuously.

Heres my python code:

from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.core.clipboard import Clipboard
from kivy.config import Config
from datetime import datetime
from kivy.app import App
import webbrowser
# ===========
Config.set('graphics', 'width', '1200')
Config.set('graphics', 'height', '600')
# ===========
with open("data.txt", "r") as a:
    All = a.readlines()
# ===========
ver = str.split(str.split(All[1], " = ")[1])
ver = ''.join(ver)
# ===========
Mon = str.split(str.split(All[3], " = ")[1])
Tue = str.split(str.split(All[4], " = ")[1])
Wed = str.split(str.split(All[5], " = ")[1])
Thu = str.split(str.split(All[6], " = ")[1])
Fri = str.split(str.split(All[7], " = ")[1])
Sat = str.split(str.split(All[8], " = ")[1])
# ===========
Math = str.split(str.split(All[10], " = ")[1])[0]
KNM = str.split(str.split(All[11], " = ")[1])[0]
Chem = str.split(str.split(All[12], " = ")[1])[0]
Lit = str.split(str.split(All[13], " = ")[1])[0]
Phys = str.split(str.split(All[14], " = ")[1])[0]
PE = str.split(str.split(All[15], " = ")[1])[0]
# ===========
Days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
Subject = ["Math", "KNM", "Chem", "Lit", "Phys", "PE"]
# ===========
Time = ["01:00 - 08:45",
        "08:45 - 09:35",
        "09:35 - 10:40",
        "10:40 - 11:30"]
# ===========
Trans = [
    "Math", "Toán",
    "KNM", "Kỹ năng mềm",
    "Chem", "Hóa học",
    "Lit", "Ngữ Văn",
    "Phys", "Vật lí",
    "PE", "Vovinam",
    "No class right now", "Không có lớp",
    "No class on Sunday", "Không học vào chủ nhật"]


def timecompare(time, clas):
    hr = time[:2]
    minu = time[-2:]
    mi = clas[:5]
    ma = clas[-5:]
    hrmin = mi[:2]
    minumin = mi[-2:]
    hrmax = ma[:2]
    minumax = ma[-2:]
    var = False
    if hrmin <= hr <= hrmax:
        if hr == hrmin and minumin <= minu:
            var = True
        if hr == hrmax and minu <= minumax:
            var = True
        if hrmin < hr < hrmax:
            var = True
    print(var)
    return var


def findclass(time, timelist):
    clas = 0
    for x in range(4):
        value = timecompare(time, timelist[x])
        if value is True:
            clas = x   1
    return clas


def checksubject(timenow, timer):
    now = datetime.now()
    day = now.strftime("%a")
    subject = "No class right now"
    clas = findclass(timenow, timer)
    if clas != 0:
        for i in range(len(Days)):
            if day == Days[i]:
                subject = eval(Days[i])[clas - 1]
    if day == "Sun":
        subject = "No class on Sunday"
    return subject


class Main(Screen):
    ip = ObjectProperty(None)
    text = ObjectProperty(None)
    ver = ObjectProperty(None)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.checkclass()
        self.ver.text = "  version: "   ver

    def checkclass(self):
        now = datetime.now()
        nowtime = now.strftime("%H:%M")
        subject = Trans.index(checksubject(nowtime, Time))   1
        self.text.text = Trans[subject]
        nowtime = now.strftime("%H:%M")
        subject = checksubject(nowtime, Time)
        ip = None
        for x in range(len(Subject)):
            if subject == Subject[x]:
                ip = eval(Subject[x])
        if ip is not None:
            self.ip.text = ip
        else:
            self.ip.text = ""

    @staticmethod
    def joinclass():
        now = datetime.now()
        nowtime = now.strftime("%H:%M")
        subject = checksubject(nowtime, Time)
        ip = None
        for x in range(len(Subject)):
            if subject == Subject[x]:
                ip = eval(Subject[x])
        if ip is not None:
            webbrowser.open_new_tab(ip)

    def copy(self):
        super()
        self.checkclass()
        if self.ip.text != "":
            Clipboard.copy(self.ip.text)


class TKB(Screen):
    ver = ObjectProperty(None)

    a2 = ObjectProperty(None)
    a3 = ObjectProperty(None)
    a4 = ObjectProperty(None)
    a5 = ObjectProperty(None)
    a6 = ObjectProperty(None)
    a7 = ObjectProperty(None)

    b2 = ObjectProperty(None)
    b3 = ObjectProperty(None)
    b4 = ObjectProperty(None)
    b5 = ObjectProperty(None)
    b6 = ObjectProperty(None)
    b7 = ObjectProperty(None)

    c2 = ObjectProperty(None)
    c3 = ObjectProperty(None)
    c4 = ObjectProperty(None)
    c5 = ObjectProperty(None)
    c6 = ObjectProperty(None)
    c7 = ObjectProperty(None)

    d2 = ObjectProperty(None)
    d3 = ObjectProperty(None)
    d4 = ObjectProperty(None)
    d5 = ObjectProperty(None)
    d6 = ObjectProperty(None)
    d7 = ObjectProperty(None)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.ver.text = "  version: "   ver

        self.a2.text = Trans[Trans.index(Mon[0])   1]
        self.b2.text = Trans[Trans.index(Mon[1])   1]
        self.c2.text = Trans[Trans.index(Mon[2])   1]
        self.d2.text = Trans[Trans.index(Mon[3])   1]

        self.a3.text = Trans[Trans.index(Tue[0])   1]
        self.b3.text = Trans[Trans.index(Tue[1])   1]
        self.c3.text = Trans[Trans.index(Tue[2])   1]
        self.d3.text = Trans[Trans.index(Tue[3])   1]

        self.a4.text = Trans[Trans.index(Wed[0])   1]
        self.b4.text = Trans[Trans.index(Wed[1])   1]
        self.c4.text = Trans[Trans.index(Wed[2])   1]
        self.d4.text = Trans[Trans.index(Wed[3])   1]

        self.a5.text = Trans[Trans.index(Thu[0])   1]
        self.b5.text = Trans[Trans.index(Thu[1])   1]
        self.c5.text = Trans[Trans.index(Thu[2])   1]
        self.d5.text = Trans[Trans.index(Thu[3])   1]

        self.a6.text = Trans[Trans.index(Fri[0])   1]
        self.b6.text = Trans[Trans.index(Fri[1])   1]
        self.c6.text = Trans[Trans.index(Fri[2])   1]
        self.d6.text = Trans[Trans.index(Fri[3])   1]

        self.a7.text = Trans[Trans.index(Sat[0])   1]
        self.b7.text = Trans[Trans.index(Sat[1])   1]
        self.c7.text = Trans[Trans.index(Sat[2])   1]
        self.d7.text = Trans[Trans.index(Sat[3])   1]


class ClassRemindApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(Main(name='Main'))
        sm.add_widget(TKB(name='TKB'))
        return sm


if __name__ == "__main__":
    ClassRemindApp().run()

the kv file:

<Main>
    text: text
    ip: ip
    ver: ver
    canvas:
        Rectangle:
            pos: 0, root.height / 5 * 4 - 2
            size: root.width, 4
        Rectangle:
            pos: 0, root.height / 5 * 0.7 - 2
            size: root.width, 4
        Rectangle:
            pos: 0, root.height / 5 * 0.2 - 2
            size: root.width, 4
        Rectangle:
            pos: 0, root.height - 2
            size: root.width, 4
        Rectangle:
            pos: 0, 0 - 2
            size: root.width, 4
        Rectangle:
            pos: 0 - 2, 0
            size: 4, root.height
        Rectangle:
            pos: root.width - 2, 0
            size: 4, root.height
        Rectangle:
            pos: root.width / 6 - 2, root.height / 5 * 0.2 - 2
            size: 4, root.height
    GridLayout:
        cols: 1
        rows: 4
        GridLayout:
            cols: 2
            rows: 1
            Button:
                text: "Xem lớp"
                font_size: 30
                on_press: root.checkclass()
                size_hint: 0.2, 1
            Label:
                text: "Không có lớp"
                font_size: 30
                id: text
        GridLayout:
            cols: 2
            rows: 1
            size_hint: 1, 3.3
            Button:
                size_hint: 0.2, 1
                text: "Xem TKB"
                font_size: 30
                on_press:
                    root.manager.transition.direction = 'left'
                    root.manager.current = 'TKB'
            Button:
                text: "Mở link"
                font_size: root.width * root.height / 4000
                on_press: root.joinclass()
        GridLayout:
            cols: 2
            rows: 1
            size_hint: 1, 0.5
            Button:
                text: "Copy link"
                font_size: 30
                size_hint: 0.2, 1
                on_press: root.copy()
            Label:
                text: ""
                font_size : 30
                id: ip
                halign: 'left'
                valign: 'middle'
        Label:
            text: ""
            id: ver
            size_hint: 1, 0.2
            text_size: self.size
            halign: 'left'
            valign: 'middle'
<TKB>
    a2: a2
    a3: a3
    a4: a4
    a5: a5
    a6: a6
    a7: a7

    b2: b2
    b3: b3
    b4: b4
    b5: b5
    b6: b6
    b7: b7

    c2: c2
    c3: c3
    c4: c4
    c5: c5
    c6: c6
    c7: c7

    d2: d2
    d3: d3
    d4: d4
    d5: d5
    d6: d6
    d7: d7

    ver: ver
    canvas:
        Rectangle:
            pos: 0, root.height - 2
            size: root.width, 4
        Rectangle:
            pos: 0, 0 - 2
            size: root.width, 4
        Rectangle:
            pos: 0 - 2, 0
            size: 4, root.height
        Rectangle:
            pos: root.width - 2, 0
            size: 4, root.height
        Rectangle:
            pos: 0, root.height / 5 * 0.2 - 2
            size: root.width, 4
        Rectangle:
            pos: root.width / 6 - 2, root.height * 0.04
            size: 4, root.height
        Rectangle:
            pos: root.width / 6 - 2   root.width * 0.14, root.height * 0.04
            size: 4, root.height * 0.16 * 2
        Rectangle:
            pos: root.width / 6 - 2   root.width * 0.14 * 2, root.height * 0.04
            size: 4, root.height * 0.16 * 2
        Rectangle:
            pos: root.width / 6 - 2   root.width * 0.14 * 3, root.height * 0.04
            size: 4, root.height * 0.16 * 2
        Rectangle:
            pos: root.width / 6 - 2   root.width * 0.14 * 4, root.height * 0.04
            size: 4, root.height * 0.16 * 2
        Rectangle:
            pos: root.width / 6 - 2   root.width * 0.14 * 5, root.height * 0.04
            size: 4, root.height * 0.16 * 2
        Rectangle:
            pos: root.width / 6 - 2   root.width * 0.14 * 1, root.height * 0.04   root.height * 0.16 * 3
            size: 4, root.height * 0.16 * 3
        Rectangle:
            pos: root.width / 6 - 2   root.width * 0.14 * 2, root.height * 0.04   root.height * 0.16 * 3
            size: 4, root.height * 0.16 * 3
        Rectangle:
            pos: root.width / 6 - 2   root.width * 0.14 * 3, root.height * 0.04   root.height * 0.16 * 3
            size: 4, root.height * 0.16 * 3
        Rectangle:
            pos: root.width / 6 - 2   root.width * 0.14 * 4, root.height * 0.04   root.height * 0.16 * 3
            size: 4, root.height * 0.16 * 3
        Rectangle:
            pos: root.width / 6 - 2   root.width * 0.14 * 5, root.height * 0.04   root.height * 0.16 * 3
            size: 4, root.height * 0.16 * 3
        Rectangle:
            pos: root.width / 6, root.height * 0.04   root.height * 0.16 - 2
            size: root.width, 4
        Rectangle:
            pos: root.width / 6, root.height * 0.04   root.height * 0.16 * 2 - 2
            size: root.width, 4
        Rectangle:
            pos: root.width / 6, root.height * 0.04   root.height * 0.16 * 3 - 2
            size: root.width, 4
        Rectangle:
            pos: root.width / 6, root.height * 0.04   root.height * 0.16 * 4 - 2
            size: root.width, 4
        Rectangle:
            pos: root.width / 6, root.height * 0.04   root.height * 0.16 * 5 - 2
            size: root.width, 4
    GridLayout:
        cols: 1
        rows: 2
        GridLayout:
            cols: 2
            rows: 1
            Button:
                size_hint: 0.2, 1
                text: 'Quay về'
                font_size: 30
                on_press:
                    root.manager.transition.direction = 'right'
                    root.manager.current = 'Main'
            GridLayout:
                cols: 1
                rows: 3
                GridLayout:
                    size_hint: 1, 1.5
                    cols: 6
                    rows: 3
                    Label:
                        font_size: 30
                        text: 'Thứ 2'
                    Label:
                        font_size: 30
                        text: 'Thứ 3'
                    Label:
                        font_size: 30
                        text: 'Thứ 4'
                    Label:
                        font_size: 30
                        text: 'Thứ 5'
                    Label:
                        font_size: 30
                        text: 'Thứ 6'
                    Label:
                        font_size: 30
                        text: 'Thứ 7'
                    Label:
                        font_size: 20
                        id: a2
                        text: ''
                    Label:
                        font_size: 20
                        id: a3
                        text: ''
                    Label:
                        font_size: 20
                        id: a4
                        text: ''
                    Label:
                        font_size: 20
                        id: a5
                        text: ''
                    Label:
                        font_size: 20
                        id: a6
                        text: ''
                    Label:
                        font_size: 20
                        id: a7
                        text: ''

                    Label:
                        font_size: 20
                        id: b2
                        text: ''
                    Label:
                        font_size: 20
                        id: b3
                        text: ''
                    Label:
                        font_size: 20
                        id: b4
                        text: ''
                    Label:
                        font_size: 20
                        id: b5
                        text: ''
                    Label:
                        font_size: 20
                        id: b6
                        text: ''
                    Label:
                        font_size: 20
                        id: b7
                        text: ''

                Label:
                    size_hint: 1, 0.5
                    font_size: 30
                    text: 'Nghỉ 20p'

                GridLayout:
                    cols: 6
                    rows: 2
                    Label:
                        font_size: 20
                        id: c2
                        text: ''
                    Label:
                        font_size: 20
                        id: c3
                        text: ''
                    Label:
                        font_size: 20
                        id: c4
                        text: ''
                    Label:
                        font_size: 20
                        id: c5
                        text: ''
                    Label:
                        font_size: 20
                        id: c6
                        text: ''
                    Label:
                        font_size: 20
                        id: c7
                        text: ''

                    Label:
                        font_size: 20
                        id: d2
                        text: ''
                    Label:
                        font_size: 20
                        id: d3
                        text: ''
                    Label:
                        font_size: 20
                        id: d4
                        text: ''
                    Label:
                        font_size: 20
                        id: d5
                        text: ''
                    Label:
                        font_size: 20
                        id: d6
                        text: ''
                    Label:
                        font_size: 20
                        id: d7
                        text: ''
        Label:
            text: ""
            id: ver
            size_hint: 1, 0.04
            text_size: self.size
            halign: 'left'
            valign: 'middle'

and the data.txt file:

========================
ver = 2.0c
========================
Mon = Math Math KNM KNM
Tue = Chem Chem Phys Phys
Wed = Lit Lit Phys Phys
Thu = Chem Chem PE PE
Fri = Math Math Phys Phys
Sat = Chem Chem Math Math
========================
Math = https://meet.google.com/[link hidden]
KNM = https://meet.google.com/[link hidden]
Chem = https://meet.google.com/[link hidden]
Lit = https://meet.google.com/[link hidden]
Phys = https://meet.google.com/[link hidden]
PE = https://meet.google.com/[link hidden]
========================

CodePudding user response:

You need to look into asyncio, threading, and coprocessing. Python needs to be told you want things done asynchronously.

  • Related