Python 我的kivy应用程序属性更新,但不是我的屏幕viwe
我正在尝试为我的应用程序创建一个重新滚动按钮。 应用程序正在创建一个随机的5x5网格,我想在每次按下reroll时更改网格(同时更改网格大小) 但当我按下它时,我的屏幕一点也没有改变。我可以在控制台日志中看到属性已更新,但我始终有相同的屏幕。 这是我的密码: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
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()
这很有效,我明白我做错了什么。