Не появляется текст после нажатия на кнопку
Делаю игру типа «Правда или действие» на kivy. Когда должно вывестись задание, оно не выводится. Причем кнопка рабочая, я проверял, используя команду print(), и текст, что находился там, выводился в консоль, после нажатия этой кнопки, а тот текст, что должен бы выводиться на экран, не выводится. Помогите, пожалуйста, буду очень благодарен!
Вот код:
from kivy.app import App
from kivy.config import Config
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.anchorlayout import AnchorLayout
import random
Config.set("graphics", "resizable", "0")
category6 = ["Присядь 10 раз", "Пригни 20 раз", "Подтянись 1 раз"]
Builder.load_string("""
<MenuScreen>:
BoxLayout:
orientation:
"vertical"
spacing: 10
padding: [30]
Button:
text: 'Играть'
background_color: [5, 1.7, 1, 5]
size_hint: [1, 0.1]
font_size: 50
on_press: root.manager.current = 'settings'
<SettingsScreen>:
BoxLayout:
orientation:
"vertical"
spacing: 10
padding: [30]
Button:
text: 'Назад'
size_hint: [1, 0.5]
background_color: [5, 1, 1, 5]
on_press: root.manager.current = "menu"
Label:
text: "Выбери возрастную категорию"
size_hint: [1, 0.5]
font_size: 35
Button:
text: "6+"
background_color: [2.3, 0.1, 4, 1]
font_size: 40
on_press: root.manager.current = "Six"
<SixScreen>:
AnchorLayout:
anchor_x: "center"
anchor_y: "top"
padding: [25]
Button:
text: "Назад"
background_color: [5, 1, 1, 5]
size_hint: [1, 0.07]
on_press: root.manager.current = 'settings'
AnchorLayout:
anchor_x: "center"
anchor_y: "bottom"
padding: [25]
Button:
text: "Получить задание"
background_color: [0, 1.7, 0, 1]
size_hint: [1, 0.07]
on_press: root.randomNamber()
""")
class MenuScreen(Screen):
pass
class SetScreen(Screen):
pass
class SettingsScreen(Screen):
pass
class SixScreen(Screen):
def randomNamber(Screen):
strings = AnchorLayout(anchor_x = "center", anchor_y = "center")
strings.add_widget(Label(text = random.choice(category6), color = [5, 1, 1, 5]))
return strings
game = ScreenManager()
game.add_widget(MenuScreen(name = 'menu'))
game.add_widget(SettingsScreen(name = 'settings'))
game.add_widget(SixScreen(name = "Six"))
class PlayPutannyApp(App):
def build(self):
return game
if __name__ == "__main__":
PlayPutannyApp().run()
Ответы (1 шт):
Смотри какая штука забавная. Ты пытаешься сделать return рандомного задания, с надеждой, что он магическим образом отобразится в экземпляре объекта Screen, однако, когда ты обращаешься из kv разметки к методу этого экземляра, ты фактически запрашиваешь это значение, поскольку сама функция у тебя предполагает возвращение значения. Проще и правильнее это будет сделать на стороне питона, а не размети kv. Вот рабочий вариант кода.
from kivy.app import App
from kivy.config import Config
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.anchorlayout import AnchorLayout
import random
Config.set("graphics", "resizable", "1")
category6 = ["Присядь 10 раз", "Пригни 20 раз", "Подтянись 1 раз"]
Builder.load_string("""
<MenuScreen>:
BoxLayout:
orientation: "vertical"
spacing: 10
padding: [30]
Button:
text: 'Играть'
background_color: [5, 1.7, 1, 5]
size_hint: [1, 0.1]
font_size: 50
on_press: root.manager.current = 'settings'
<SettingsScreen>:
BoxLayout:
orientation: "vertical"
spacing: 10
padding: [30]
Button:
text: 'Назад'
size_hint: [1, 0.5]
background_color: [5, 1, 1, 5]
on_press: root.manager.current = "menu"
Label:
text: "Выбери возрастную категорию"
size_hint: [1, 0.5]
font_size: 35
Button:
text: "6+"
background_color: [2.3, 0.1, 4, 1]
font_size: 40
on_press: root.manager.current = "Six"
<SixScreen>:
AnchorLayout:
anchor_x: "center"
anchor_y: "top"
padding: [25]
Button:
text: "Назад"
background_color: [5, 1, 1, 5]
size_hint: [1, 0.07]
on_press: root.manager.current = 'settings'
AnchorLayout:
anchor_x: "center"
anchor_y: "bottom"
padding: [25]
Button:
text: "Получить задание"
background_color: [0, 1.7, 0, 1]
size_hint: [1, 0.07]
on_press: root.random_number()
""")
class MenuScreen(Screen):
pass
class SetScreen(Screen):
pass
class SettingsScreen(Screen):
pass
class SixScreen(Screen):
def random_number(self): # Вместо Screen нужно указать на текущий экземпляр, посредством self
strings = AnchorLayout(anchor_x="center", anchor_y="center")
strings.add_widget(Label(text=random.choice(category6), color=[5, 1, 1, 5]))
self.add_widget(strings) # А вот момент, который всё починил. Добавление виджета на экран происходит путём добавления этого элемента в текущий экземпляр самого экрана.
game = ScreenManager()
game.add_widget(MenuScreen(name='menu'))
game.add_widget(SettingsScreen(name='settings'))
game.add_widget(SixScreen(name="Six"))
class PlayPutannyApp(App):
def build(self):
return game
if __name__ == "__main__":
PlayPutannyApp().run()