Seite 1 von 1

Wozu das super()-__init__(**kwargs)?

Verfasst: Mittwoch 17. Mai 2023, 18:30
von Pythonfan3000
Hallo Community,

Bei dem Code im Anhang, der Hangman als Python App mit dem Kivy Framework erstellt, weiß ich nicht wozu man die Zeile mit dem super() braucht. Also warum muss man die **kwargs Argumente an die Basisklasse weitergeben?

Code: Alles auswählen

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.core.window import Window
import random


class HangmanGame(BoxLayout):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.word_list = ["python", "java", "ruby", "javascript", "php"]
        self.guess_word = []
        self.secret_word = ""
        self.remaining_guesses = 6
        self.img_path = "img/hangman_{}.png"
        self.create_game_layout()
        self.new_game()

    def create_game_layout(self):
        self.orientation = "vertical"
        self.image = Image(source=self.img_path.format(0))
        self.word_label = Label(text=" ".join(self.guess_word),
                                font_size="50sp",
                                halign="center",
                                valign="middle")
        self.remaining_guesses_label = Label(text=f"Remaining guesses: {self.remaining_guesses}")
        self.input_label = Label(text="Enter a letter:")
        self.input = TextInput(multiline=False)
        self.submit_button = Button(text="Submit", on_press=self.check_letter)
        self.add_widget(self.image)
        self.add_widget(self.word_label)
        self.add_widget(self.remaining_guesses_label)
        self.add_widget(self.input_label)
        self.add_widget(self.input)
        self.add_widget(self.submit_button)

    def new_game(self):
        self.secret_word = random.choice(self.word_list)
        self.guess_word = ["_"] * len(self.secret_word)
        self.remaining_guesses = 6
        self.image.source = self.img_path.format(0)
        self.input.text = ""
        self.word_label.text = " ".join(self.guess_word)
        self.remaining_guesses_label.text = f"Remaining guesses: {self.remaining_guesses}"

    def check_letter(self, instance):
        letter = self.input.text
        if letter in self.secret_word:
            for i, c in enumerate(self.secret_word):
                if c == letter:
                    self.guess_word[i] = letter
            if "_" not in self.guess_word:
                self.end_game(True)
        else:
            self.remaining_guesses -= 1
            self.image.source = self.img_path.format(6 - self.remaining_guesses)
            self.remaining_guesses_label.text = f"Remaining guesses: {self.remaining_guesses}"
            if self.remaining_guesses == 0:
                self.end_game(False)
        self.input.text = ""
        self.word_label.text = " ".join(self.guess_word)

    def end_game(self, victory):
        message = "Congratulations, you won!" if victory else f"Sorry, the word was {self.secret_word}."
        self.remaining_guesses_label.text = message
        self.remove_widget(self.input_label)
        self.remove_widget(self.input)
        self.remove_widget(self.submit_button)
        self.add_widget(Button(text="New Game", on_press=self.new_game))


class HangmanApp(App):

    def build(self):
        Window.clearcolor = (0.5, 0.5, 0.5, 1)
        return HangmanGame()


if __name__ == '__main__':
    HangmanApp().run()
LG Pythonfan3000 :wink:

Re: Wozu das super()-__init__(**kwargs)?

Verfasst: Mittwoch 17. Mai 2023, 20:46
von __blackjack__
Die Frage hast Du doch gerade hier gestellt gehabt: viewtopic.php?p=420041

Meine Antwort bleibt an und für sich die gleiche. 🤓