Python Kivy: как заставить выполнить метод после загрузки виджетов Kivy file - PullRequest
0 голосов
/ 06 апреля 2020

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

Вот как это выглядит после запуска: How it looks rn

Вот как я хочу, чтобы мое приложение выглядело после запуска:

How it should look

Названия дней и уроки в Poli sh.

Вот код planchart.py

class Okienko(Button):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.lessons = []

        f = open("/interaktywny_plan/classes.dat", "rb")
        pon = pickle.load(f)
        wto = pickle.load(f)
        sro = pickle.load(f)
        czw = pickle.load(f)
        pt = pickle.load(f)
        f.close()
        self.lessons.append(pon)
        self.lessons.append(wto)
        self.lessons.append(sro)
        self.lessons.append(czw)
        self.lessons.append(pt)

        self.lesson = ""
        self.sub_press = ""

    def on_release(self):
        self.text = self.lesson

    def on_press(self):
        self.text = self.sub_press

    def update_button(self):
        if self.name_ == "one_pon":
            self.lesson = self.lessons[0][0][0]
            self.sub_press = self.lessons[0][0][1] + "\n" + self.lessons[0][0][2]
        elif self.name_ == "two_pon":
            self.lesson = self.lessons[0][1][0]
            self.sub_press = self.lessons[0][1][1] + "\n" + self.lessons[0][1][2]
        elif self.name_ == "three_pon":
            self.lesson = self.lessons[0][2][0]
            self.sub_press = self.lessons[0][2][1] + "\n" + self.lessons[0][2][2]
        elif self.name_ == "four_pon":
            self.lesson = self.lessons[0][3][0]
            self.sub_press = self.lessons[0][3][1] + "\n" + self.lessons[0][3][2]

        .............

Вот код Kivy:

<Okienko>:
    background_color: [.5, .9, 1, 1]
    halign: "center"
    size_hint: None, None
    font_size: 24
    size: 96, 96
    on_press: self.on_press()
    on_release: self.on_release()

<PlanChart>:
    cols: 11
    padding: 2
    Dzien:
        id: pon
        text: "Pon"
    Okienko:
        id: one_pon
        name_: "one_pon"
    Okienko:
        id: two_pon
        name_: "two_pon"
    Okienko:
        id: three_pon
        name_: "three_pon"
    Okienko:
        id: four_pon
        name_: "four_pon"
    Okienko:
        id: five_pon
        name_: "five_pon"

     ..............

Я пытался использовать @mainthread и положить self.update_button() в __init__, но он все равно будет пустым. Я попытался просто ввести self.update_button() в __init__, но я получил бы AtributeError, потому что файл Kivy не был загружен. После этого я прочитал о Clock модуле, но не мог понять, как правильно его использовать.

1 Ответ

1 голос
/ 06 апреля 2020

Вы можете использовать модуль Clock, чтобы запланировать вызов метода для после загрузки файла Kivy:

from kivy.clock import Clock
Clock.schedule_once(self.update_button, .1)
...