Почему в моем коде на Python не отображаются кнопки?

#python #button #widget #kivy

#python #кнопка #виджет #kivy

Вопрос:

Смысл следующего кода в том, чтобы показать список кнопок (например, меню), которые вы бы использовали для изменения экранов сейчас … Это вообще не работает, и я не вижу, в чем проблема

Раньше я получал сообщение «typeerror init () принимает 1 позиционный аргумент, но было задано 2″, и я заставил его исчезнуть, создав новый класс для экрана, после чего я получил экземпляр app.root, который не установлен, и теперь я не получаю никаких ошибок

 import kivy
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.lang import Builder
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
import random
import main
kivy.require('1.10.1')

 class Game(BoxLayout):
    layout = BoxLayout(padding=5, orientation="vertical")
    colors = [(1, 0, 0, 1), (0, 1, 0, 1), (1, 0, 1, 1), (0, 0, 1, 1)]
    Buttonz= ('Button1', 'Button2', 'Button3', 'Button4')
    def Buttons(self):
        for i in range(len(self.Buttonz)):
            btn = Button(text=self.Buttonz[i],background_color=random.choice(self.colors))
            self.layout.add_widget(btn)
            btn.bind(on_press=main.Political)
        return self.layout


class Main(App):

    title='ButtonGame'
    def build(self):
       return Game()

if __name__ == '__main__':

   Main().run()
  

Я ожидал, что код покажет 4 кнопки со случайно выбранными цветами из 4, которые я объявил, но вместо этого он показывает полностью черный экран. Кнопки должны переключаться на другой экран из другого модуля. Возможно, мне следует использовать ScreenManager в обоих модулях??? ( Извините за ужасный отступ, я пытался отформатировать код так, как он должен быть здесь, но у меня не получилось)

Комментарии:

1. Отступ по-прежнему неправильный. Пожалуйста, исправьте. class Game(BoxLayout) под ним должен быть материал с отступом, а этого не происходит.

2. Я только что это исправил, надеюсь, я ничего не пропустил в сообщении…

Ответ №1:

Вам нужно добавить конструктор для вызова Buttons метода.

Фрагменты

 class Game(BoxLayout):
    layout = BoxLayout(padding=5, orientation="vertical")
    colors = [(1, 0, 0, 1), (0, 1, 0, 1), (1, 0, 1, 1), (0, 0, 1, 1)]
    Buttonz = ('Button1', 'Button2', 'Button3', 'Button4')

    def __init__(self, **kwargs):
        super(Game, self).__init__(**kwargs)
        self.Buttons()
        self.add_widget(self.layout)

    def Buttons(self):
        for i in range(len(self.Buttonz)):
            btn = Button(text=self.Buttonz[i], background_color=random.choice(self.colors))
            self.layout.add_widget(btn)
            btn.bind(on_press=main.Political)
  

Пример

В следующем примере в качестве корневого используется только один BoxLayout виджет.

main.py

 import kivy
kivy.require('1.10.1')

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
import random
# import main


class Game(BoxLayout):
    colors = [(1, 0, 0, 1), (0, 1, 0, 1), (1, 0, 1, 1), (0, 0, 1, 1)]
    Buttonz = ('Button1', 'Button2', 'Button3', 'Button4')

    def __init__(self, **kwargs):
        super(Game, self).__init__(**kwargs)
        self.padding = 5
        self.orientation = "vertical"
        self.Buttons()

    def Buttons(self):
        for i in range(len(self.Buttonz)):
            btn = Button(text=self.Buttonz[i], background_color=random.choice(self.colors))
            self.add_widget(btn)
            # btn.bind(on_press=main.Political)


class Main(App):
    title = 'ButtonGame'

    def build(self):
        return Game()


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

Вывод

Результат