Способ сделать это - сохранить список CheckBoxes
и соответствующих рас. Затем, в вашем методе Gerar()
, посмотрите на state
каждого из этих CheckBoxes
, чтобы определить, какие расы включить. В приведенном ниже измененном коде я создал список self.race_choices
. Каждый элемент этого списка представляет собой список из двух элементов, CheckBox
и соответствующей расы. Эта информация используется в методе Gerar()
для создания списка available_races
, который затем используется в вашем вызове random.choice()
.
import random
import kivy
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.checkbox import CheckBox
from kivy.uix.widget import Widget
class Grid(GridLayout):
def __init__(self, **kwargs):
super(Grid, self).__init__(**kwargs)
self.cols = 1
self.grid_2 = GridLayout()
self.grid_2.cols = 2
self.grid_2.size_hint = 1, 0.2
self.grid_2.add_widget(Label(text="Number of enemies"))
self.number = TextInput(multiline=False)
self.grid_2.add_widget(self.number)
self.add_widget(self.grid_2)
self.add_widget(Label(text="Races", size_hint=(1,0.2)))
self.grid_3 = GridLayout()
self.grid_3.cols = 4
self.grid_3.size_hint = 0.5, 0.5
# create a list of CheckBoxes and races
self.race_choices = []
self.grid_3.add_widget(Label(text="Human"))
self.chk_human = CheckBox(active=True)
self.grid_3.add_widget(self.chk_human)
self.race_choices.append([self.chk_human, "Human"])
self.grid_3.add_widget(Label(text="Elf"))
self.chk_elf = CheckBox(active=True)
self.grid_3.add_widget(self.chk_elf)
self.race_choices.append([self.chk_elf, "Elf"])
self.grid_3.add_widget(Label(text="Dwarf"))
self.chk_dwarf = CheckBox(active=True)
self.grid_3.add_widget(self.chk_dwarf)
self.race_choices.append([self.chk_dwarf, "Dwarf"])
self.grid_3.add_widget(Label(text="Orc"))
self.chk_orc = CheckBox(active=True)
self.grid_3.add_widget(self.chk_orc)
self.race_choices.append([self.chk_orc, "Orc"])
self.grid_3.add_widget(Label(text="Hobbit"))
self.chk_hobbit = CheckBox(active=True)
self.grid_3.add_widget(self.chk_hobbit)
self.race_choices.append([self.chk_hobbit, "Hobbit"])
self.grid_3.add_widget(Label(text="Viashian"))
self.chk_viashian = CheckBox(active=True)
self.grid_3.add_widget(self.chk_viashian)
self.race_choices.append([self.chk_viashian, "Viahsian"])
self.grid_3.add_widget(Label(text="Goblin"))
self.chk_goblin = CheckBox(active=True)
self.grid_3.add_widget(self.chk_goblin)
self.race_choices.append([self.chk_goblin, "Goblin"])
self.grid_3.add_widget(Label(text="Leonim"))
self.chk_leonin = CheckBox(active=True)
self.grid_3.add_widget(self.chk_leonin)
self.race_choices.append([self.chk_leonin, "Leonin"])
self.grid_3.add_widget(Label(text="Nezumi"))
self.chk_nezumi = CheckBox(active=True)
self.grid_3.add_widget(self.chk_nezumi)
self.race_choices.append([self.chk_nezumi, "Nezumi"])
self.grid_3.add_widget(Label(text="Naga"))
self.chk_naga = CheckBox(active=True)
self.grid_3.add_widget(self.chk_naga)
self.race_choices.append([self.chk_naga, "Naga"])
self.add_widget(self.grid_3)
self.generate = Button(text="Generate", font_size=40, size_hint=(1,0.3))
self.generate.background_color = 0.8,0.5,0.5,0.7
self.generate.bind(on_press=self.Gerar)
self.add_widget(self.generate)
self.encounter_type = (Label(text="Type of encounter", font_size=20, size_hint=(1,0.1)))
self.add_widget(self.encounter_type)
self.show_enemies = Label(text="Click to Generate")
self.add_widget(self.show_enemies)
def Gerar(self, instance):
self.show_enemies.text = ""
int_number = int(self.number.text)
type = ["NEUTRO", "HOSTIL", "ALIADO"]
# races = ["HUMANO", "ELFO", "ANÃO", "HOBBIT", "VIASHINO", "LEONINO", "NEZUMI", "GOBLIN", "NAGA"]
classes = ["FIGHTER", "KNIGHT", "BERSERKER", "FENCER", "NINJA", "HOPLITE", "BEAST TAMER",
"DRAGON TAMER", "ARCHER", "ROUGE", "DOLL MASTER", "WARLOCK", "MAGE", "ACOLYTE", "MONK", "CLERIC",
"BARD", "WARLORD", "SHAMAN", "DRUID", "SPEAKER", "MERCHANT", "ALCHEMIST", "BLACKSMITH", "CHEF"]
elements = ["FIRE", "AIR", "WATER", "EARTH", "LIGHT", "DARK"]
# create a list of available races based on CheckBox state
available_races = []
for chkBox, race in self.race_choices:
if chkBox.state == 'down':
available_races.append(race)
for i in range(int_number):
type_choice = random.choice(type)
race_choice = random.choice(available_races)
class_choice = random.choice(classes)
element_choice = random.choice(elements)
encounter = (race_choice + ' : ' + class_choice + ' - ' + element_choice)
self.encounter_type.text = "ENCONTRO: " + type_choice
if type_choice == "ALIADO":
self.encounter_type.color = 0.2, 0.7, 0.2, 1
elif type_choice == "NEUTRO":
self.encounter_type.color = 0.5, 0.5, 0.5, 1
elif type_choice == "HOSTIL":
self.encounter_type.color = 0.7, 0.2, 0.2, 1
self.show_enemies.text += encounter + "\n\n"
class EncounterApp(App):
def build(self):
return Grid()
if __name__ == "__main__":
EncounterApp().run()
Это можно сделать аналогичным образом, используя kv
, ноэто немного усложняет сборку списка available_races
:
import random
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout
class Grid(GridLayout):
def Gerar(self, instance):
self.ids.show_enemies.text = ""
int_number = int(self.ids.number.text)
types = ["NEUTRO", "HOSTIL", "ALIADO"]
classes = ["FIGHTER", "KNIGHT", "BERSERKER", "FENCER", "NINJA", "HOPLITE", "BEAST TAMER",
"DRAGON TAMER", "ARCHER", "ROUGE", "DOLL MASTER", "WARLOCK", "MAGE", "ACOLYTE", "MONK", "CLERIC",
"BARD", "WARLORD", "SHAMAN", "DRUID", "SPEAKER", "MERCHANT", "ALCHEMIST", "BLACKSMITH", "CHEF"]
elements = ["FIRE", "AIR", "WATER", "EARTH", "LIGHT", "DARK"]
# look at Widgets in grid_3 to determine which races are available
# any change to grid_3 will break this
available_races = []
use_next_race = False
for widget in self.ids.grid_3.children:
if type(widget).__name__ == 'CheckBox':
if widget.state == 'down':
use_next_race = True
else:
use_next_race = False
else:
if use_next_race:
available_races.append(widget.text)
for i in range(int_number):
type_choice = random.choice(types)
race_choice = random.choice(available_races)
class_choice = random.choice(classes)
element_choice = random.choice(elements)
encounter = (race_choice + ' : ' + class_choice + ' - ' + element_choice)
self.ids.encounter_type.text = "ENCONTRO: " + type_choice
if type_choice == "ALIADO":
self.ids.encounter_type.color = 0.2, 0.7, 0.2, 1
elif type_choice == "NEUTRO":
self.ids.encounter_type.color = 0.5, 0.5, 0.5, 1
elif type_choice == "HOSTIL":
self.ids.encounter_type.color = 0.7, 0.2, 0.2, 1
self.ids.show_enemies.text += encounter + "\n\n"
Builder.load_string('''
<Grid>:
cols: 1
GridLayout:
id: grid_2
cols: 2
size_hint: 1, 0.2
Label:
text: "Number of enemies"
TextInput:
id: number
multiline: False
Label:
text: "Races"
size_hint: (1,0.2)
GridLayout:
id: grid_3
cols: 4
size_hint: 0.5, 0.5
Label:
text: "Human"
CheckBox:
id: Human
active: True
Label:
text: "Elf"
CheckBox:
id: Elf
active: True
Label:
text: "Dwarf"
CheckBox:
id: Dwarf
active: True
Label:
text: "Orc"
CheckBox:
id: Orc
active: True
Label:
text: "Hobbit"
CheckBox:
id: Hobbit
active: True
Label:
text: "Viashian"
CheckBox:
id: Viashian
active: True
Label:
text: "Goblin"
CheckBox:
id: Goblin
active: True
Label:
text: "Leonin"
CheckBox:
id: Leonin
active: True
Label:
text: "Nezumi"
CheckBox:
id: Nezumi
active: True
Label:
text: "Naga"
CheckBox:
id: Naga
active: True
Button:
text: "Generate"
font_size: 40
size_hint: 1, 0.3
on_press: root.Gerar(self)
Label:
id: encounter_type
text: "Type of encounter"
font_size: 20
siz_hint: 1, 0.1
Label:
id: show_enemies
text: "Click to Generate"
''')
class EncounterApp(App):
def build(self):
return Grid()
if __name__ == "__main__":
EncounterApp().run()
Все ссылки на Widgets
теперь используют ids
.