Я хочу создать функцию выбора с флажком - PullRequest
0 голосов
/ 06 октября 2019

Я работаю над генератором игровых встреч с python kivy и хочу создать функцию, которая при снятии флажка сгенерирует random.choice(), за исключением не отмеченного флажка из списка race.

это мой код

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

        self.grid_3.add_widget(Label(text="Human"))
        self.chk_human = CheckBox(active=True)
        self.grid_3.add_widget(self.chk_human)

        self.grid_3.add_widget(Label(text="Elf"))
        self.chk_elf = CheckBox(active=True)
        self.grid_3.add_widget(self.chk_elf)

        self.grid_3.add_widget(Label(text="Dwarf"))
        self.chk_dwarf = CheckBox(active=True)
        self.grid_3.add_widget(self.chk_dwarf)

        self.grid_3.add_widget(Label(text="Orc"))
        self.chk_orc = CheckBox(active=True)
        self.grid_3.add_widget(self.chk_orc)

        self.grid_3.add_widget(Label(text="Hobbit"))
        self.chk_hobbit = CheckBox(active=True)
        self.grid_3.add_widget(self.chk_hobbit)

        self.grid_3.add_widget(Label(text="Viashian"))
        self.chk_viashian = CheckBox(active=True)
        self.grid_3.add_widget(self.chk_viashian)

        self.grid_3.add_widget(Label(text="Goblin"))
        self.chk_goblin = CheckBox(active=True)
        self.grid_3.add_widget(self.chk_goblin)

        self.grid_3.add_widget(Label(text="Leonim"))
        self.chk_leonin = CheckBox(active=True)
        self.grid_3.add_widget(self.chk_leonin)

        self.grid_3.add_widget(Label(text="Nezumi"))
        self.chk_nezumi = CheckBox(active=True)
        self.grid_3.add_widget(self.chk_nezumi)

        self.grid_3.add_widget(Label(text="Naga"))
        self.chk_naga = CheckBox(active=True)
        self.grid_3.add_widget(self.chk_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"]

        for i in range(int_number):
            type_choice = random.choice(type)
            if self.chk_human is False:
                race_choice = random.choice(races-["HUMANO"])
            else:
                race_choice = random.choice(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()

Что я могу сделать, чтобы этот код работал?

1 Ответ

0 голосов
/ 07 октября 2019

Способ сделать это - сохранить список 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...