Python 我的kivy应用程序属性更新,但不是我的屏幕viwe

Python 我的kivy应用程序属性更新,但不是我的屏幕viwe,python,Python,我正在尝试为我的应用程序创建一个重新滚动按钮。 应用程序正在创建一个随机的5x5网格,我想在每次按下reroll时更改网格(同时更改网格大小) 但当我按下它时,我的屏幕一点也没有改变。我可以在控制台日志中看到属性已更新,但我始终有相同的屏幕。 这是我的密码: from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button from kivy.uix.texti

我正在尝试为我的应用程序创建一个重新滚动按钮。 应用程序正在创建一个随机的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()

每次调用affichage函数时,您都会创建box layout的新对象,但build方法只调用一次,并且它只返回box layout的前一个对象。因此,创建一个对象并使用它:

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()

这很有效,我明白我做错了什么。