Рисование виджета на ощупь - PullRequest
0 голосов
/ 02 февраля 2020

Мне снова нужна ваша помощь, пожалуйста. Я пытаюсь создать простое меню (topMenu), которое будет обновлять сетку кнопок слева (сбоку от центра экрана). Не могли бы вы взглянуть ниже и посоветовать, почему на экране ничего не рисуется, несмотря на правильное выполнение кода в фоновом режиме? (журнал консоли: кнопка добавления: 0 - 24).

TopMenu.py:

import Categories
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.togglebutton import ToggleButton
from kivy.properties import StringProperty
from kivy.properties import ObjectProperty
import Left

class TopMenu(GridLayout):
    def __init__(self, **kwargs):
        super(TopMenu, self).__init__(**kwargs)
        print("Top is alive!")

        self.drawBtns()

    # Get buttons from the category and draw them on the top screen
    def drawBtns(self):
        mainCats = Categories.Categories()
        for i in range(len(mainCats.mainCats)):
            but = MenuButton(mainCats.mainCats[i])
            self.add_widget(but)

# Custom class to create a button that contains all required parameters
class MenuButton(ToggleButton):
    def __init__(self, btnText, **kwargs):
        super(MenuButton, self).__init__(**kwargs)

        self.text = btnText
        self.group = "topMenuGroup"
        self.bind(on_press = self.topMenuPressed)

    ############################### FIRE EVENT IN THIS METHOD ############################
    def topMenuPressed(event, self):
        print("Pressed " + self.text + ":" + self.state)
        if self.state == "down":
            left = Left.Left()
            left.addBtns()

Left.py:

from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button

class Left(GridLayout):
    def __init__(self, **kwargs):
        super(Left, self).__init__(**kwargs)
        print("Left is alive!")
    ####################### DRAW BUTTONS TO THE GRID LAYOUT AND DISPLAY ON THE SCREEN #########
    def addBtns(self):
        for i in range(0, 25):
            print("Adding button: " + str(i))
            but = Button(text="X" + str(i) + "\n23." + str(i))
            self.add_widget(but)

Я думаю, что моя проблема может быть связано с некоторым обновлением экрана? Но я понятия не имею, как это кусать:)

1 Ответ

0 голосов
/ 02 февраля 2020

@ Джон Андерсон, спасибо, что вывели меня на правильный путь (снова!). Я провел небольшое исследование и придумал идею ниже. Это работает просто отлично, но я не уверен, что это лучший / самый элегантный способ решить эту проблему. Любые предложения будут наиболее ценными. Сейчас я могу двигаться вместе с моим проектом: -)

Left.py

class Left(GridLayout):
    leftInstances = [] # Store all instances of this class
    def __init__(self, **kwargs):
        super(Left, self).__init__(**kwargs)
        self.__class__.leftInstances.append(self) # Add instance to instances list

    def drawBttns(self):
        for i in range(0, 25):
            but = Button(text="X" + str(i))
            self.add_widget(but)

и TopMenu.py:

    def topMenuPressed(event, self):
        print("Pressed " + self.text + ":" + self.state)
        print(Left.Left.leftInstances)
        Left.Left.leftInstances[0].drawBttns()
...