python - 我的 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()
解决方案
每次调用 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()
推荐阅读
- matplotlib - 如何使用 timstamp 和坐标进行绘图?
- php - Artisan::call 命令包抛出错误异常将通过网页调用
- validation - LUA 信用卡有效期验证
- docker - 如何在创建 docker 映像时将 jdk 挂载到卷中并在容器中使用它
- python - 如何在没有 matlab 的情况下将 v 7.3 的 .mat 文件转换为 excel 或 csv?
- ios - 在 Swift 中将 %1$s 等占位符转换为 {x}
- r - 防止 withSpinner 默认出现
- r - 根据提供的数据编写 r GET 查询
- octave - 在 Octave 上更改默认编辑器会出现错误消息
- javascript - 渲染后如何执行除“setTimeout()”之外的函数