首页 > 解决方案 > 我的 kivy 应用程序属性更新但不是我的屏幕显示

问题描述

我正在尝试为我的应用程序制作一个重新滚动按钮。该应用程序正在创建一个随机的 5x5 网格,我想在每次按下 reroll 时更改网格(同时也更改网格大小)但是当我按下它时,我的屏幕根本不会改变。我可以在控制台日志中看到属性已更新,但我总是有相同的屏幕。这是我的代码:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
import random


class MainApp(App):

    def build(self):
        self.lignes=5
        self.colonnes=5
        self.agents=8
        self.assassins=1

        self.main_layout = self.affichage()
        return self.main_layout

    def affichage(self):
        main_layout = BoxLayout(orientation="vertical")

        nb_cases=self.lignes*self.colonnes


        color_dic={
        'R':[1,0,0,1],
        'B':[1,0,1,1],
        'A':[1,0,0,1],
        '.':[1,1,1,1]
        }

        teams=['R','B']
        first_team=random.choice(teams)

        cases=[]
        cases.append(first_team)

        for i in range(self.agents):
            cases.append('R')
            cases.append('B')

        for i in range(self.assassins):
            cases.append('A')

        for i in range(len(cases),nb_cases):
            cases.append('.')

        plateau=[]

        while cases:
            case=random.choice(cases)
            plateau.append(case)
            cases.remove(case)


        top_layout = BoxLayout()
        button = Button(
            text='First team is ' + first_team,
            pos_hint={"center_x": 0.5, "center_y": 0.5},
            background_color=color_dic[first_team]
            )
        top_layout.add_widget(button)

        main_layout.add_widget(top_layout)

        info_layout = BoxLayout()
        button = Button(
            text='Plateau : '+str(self.lignes)+'x'+str(self.colonnes)+', Agents : '+str(self.agents)+', Assassins : '+str(self.assassins),
            pos_hint={"center_x": 0.5, "center_y": 0.5},
            background_color=[0,1,1,1]
            )
        info_layout.add_widget(button)

        main_layout.add_widget(info_layout)



        for i in range(self.lignes):
            h_layout = BoxLayout()
            for j in range(self.colonnes):
                case=plateau[i*self.colonnes+j]
                couleur=color_dic[case]
                button = Button(
                    text=case,
                    pos_hint={"center_x": 0.5, "center_y": 0.5},
                    background_color=couleur
                )
                h_layout.add_widget(button)
            main_layout.add_widget(h_layout)


        menu_layout = BoxLayout()
        button = Button(
            text='ReRoll',
            pos_hint={"center_x": 0.5, "center_y": 0.5},
            background_color=[0,1,0,1]
            )
        button.bind(on_press=self.reroll)
        menu_layout.add_widget(button)

        main_layout.add_widget(menu_layout)

        return main_layout



    def reroll(self,instance):
        self.lignes+=1
        self.colonnes+=1
        self.main_layout=self.affichage()
        print(self.lignes)
        print(self.main_layout)


if __name__ == "__main__":
    app = MainApp()
    app.run()

标签: python

解决方案


每次调用 affichage 函数时,都会创建新的盒子布局对象,但 build 方法只调用一次,它只返回盒子布局的第一个对象。所以创建一个对象并使用它:

class MainApp(App):

    def build(self):
        self.lignes=5
        self.colonnes=5
        self.agents=8
        self.assassins=1
        self.main_layout = BoxLayout(orientation="vertical")
        self.affichage()
        return self.main_layout

    def affichage(self):

        self.main_layout.clear_widgets()
        nb_cases=self.lignes*self.colonnes


        color_dic={
        'R':[1,0,0,1],
        'B':[1,0,1,1],
        'A':[1,0,0,1],
        '.':[1,1,1,1]
        }

        teams=['R','B']
        first_team=random.choice(teams)

        cases=[]
        cases.append(first_team)

        for i in range(self.agents):
            cases.append('R')
            cases.append('B')

        for i in range(self.assassins):
            cases.append('A')

        for i in range(len(cases),nb_cases):
            cases.append('.')

        plateau=[]

        while cases:
            case=random.choice(cases)
            plateau.append(case)
            cases.remove(case)

        top_layout = BoxLayout()
        button = Button(
            text='First team is ' + first_team,
            pos_hint={"center_x": 0.5, "center_y": 0.5},
            background_color=color_dic[first_team]
            )
        top_layout.add_widget(button)

        main_layout.add_widget(top_layout)

        info_layout = BoxLayout()
        button = Button(
            text='Plateau : '+str(self.lignes)+'x'+str(self.colonnes)+', Agents : '+str(self.agents)+', Assassins : '+str(self.assassins),
            pos_hint={"center_x": 0.5, "center_y": 0.5},
            background_color=[0,1,1,1]
            )
        info_layout.add_widget(button)

        main_layout.add_widget(info_layout)

        for i in range(self.lignes):
            h_layout = BoxLayout()
            for j in range(self.colonnes):
                case=plateau[i*self.colonnes+j]
                couleur=color_dic[case]
                button = Button(
                    text=case,
                    pos_hint={"center_x": 0.5, "center_y": 0.5},
                    background_color=couleur
                )
                h_layout.add_widget(button)
            main_layout.add_widget(h_layout)

        menu_layout = BoxLayout()
        button = Button(
            text='ReRoll',
            pos_hint={"center_x": 0.5, "center_y": 0.5},
            background_color=[0,1,0,1]
            )
        button.bind(on_press=self.reroll)
        menu_layout.add_widget(button)
        main_layout.add_widget(menu_layout)

    def reroll(self,instance):
        self.lignes+=1
        self.colonnes+=1
        self.affichage()
        print(self.lignes)
        print(self.main_layout)


if __name__ == "__main__":
    app = MainApp()
    app.run()

推荐阅读