Как я могу обновить экран Kivy при нажатии кнопки - PullRequest
0 голосов
/ 10 октября 2019

Я создаю игру Tic Tac Toe, используя Kivy. Сначала я хочу представить основные вещи, которые делает приложение, чтобы оно дало представление о том, как работает мое приложение. В настоящее время приложение поддерживает многопользовательский вход. Многие игроки могут зарегистрироваться, и их информация будет сохранена и может быть использована для дальнейшего использования (с использованием внешнего файла .txt). Игра также сохраняет результаты отдельных игроков в другой файл .txt. Приложение имеет много разных экранов, таких как экран регистрации, экран входа в систему, экран рекордов, экран настроек и т. Д.

Когда кто-то регистрируется, его информация, такая как имя, адрес электронной почты и пароль, сохраняется в файле login_info.txt. файл. В то же время их имя и начальная оценка 0 сохраняются в файле highscores.txt. Если игрок выигрывает игру, ноль увеличивается на 1 и снова сохраняется в файле рекордов.

Я показываю экран настроек ниже: settings screen

Основной темой этого вопроса является экран «Управление игроками».

Manage Players screen

Когда я нажимаю «Удалить игрока», появляется всплывающее окно:

deletion popup

Нажатие на «Удалить игрока» делает несколько вещей:

  • Удаляет имя, электронную почту и пароль данного игрока из файла login_info.txt
  • Удаляет имя и счет игрока из файла highscores.txt
  • Отключает всплывающее окно

Таким образом, главный вопрос здесь заключается в том, что после закрытия всплывающего окна и удаления игрока из обоих файлов .txt на экране «Управление игроками» по-прежнему отображается имя этого игрока и кнопка для его удаления. Когда я закрываю приложение и затем снова запускаю его, я вижу, что проигрыватель, который я удалил ранее, исчез. Я хочу улучшить это. Я хочу, чтобы плеер и его кнопка немедленно исчезали при удалении информации из файлов .txt. Есть ли способ «загрузить» или «обновить» экран после нажатия кнопки «удалить плеер», чтобы экран был перезагружен и, поскольку экран считывает данные из файлов .txt, он не будет отображать проигрыватель, посколькумы удалили его. Другим способом, который я думаю, может быть очистка экрана (возможно, с помощью self.canvas.clear()?), А затем чтение файлов .txt и добавление имен игроков и их кнопок снова на экран.

Это мой код дляЭкран управления игроками. Это довольно большой и может содержать запутанный код, поэтому я написал о том, что происходит, когда кто-то регистрируется или что делает удаление игрока.

class ManagePlayers(GridLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        # Creating an inside Layout allows the player names and buttons to be
        # on one layout and the "back" button to be on another layout.
        self.inside = GridLayout()

        self.file = open("login_info.txt", "r")
        self.inside.cols = 2
        self.inside.rows = len(self.file.readlines())
        self.file.close()

        self.highscores = open("highscores.txt", "r")
        self.file = self.highscores.readlines()[1:]
        # Here we are reading all the scores of each players and also 
        # converting them to integers and stripping of 
        # the newline character
        self.scores = [int(entry.split(",")[1].strip("\n")) for entry in self.file]
        self.highscores.close()

        with open("login_info.txt", "r") as file:
            file_contents = file.readlines()[1:]
            file_contents = [content.strip("\n") for content in file_contents]

            buttons_dict = {}
            labels_dict = {}

            def manage_player_deletion(instance):
                pop_up_layout = BoxLayout(orientation='vertical', padding=(10))

                deletion_message = Label(
                    text="Are you sure? You cannot undo this.", color=[1, 0, 0, 1])
                pop_up_layout.add_widget(deletion_message)

                yes_button = Button(text="Yes delete the player")
                no_button = Button(
                    text="I changed my mind. The player can stay!")

                pop_up_layout.add_widget(yes_button)
                pop_up_layout.add_widget(no_button)

                def delete_player(fake_instance):
                    # The parameter is named "fake_instance" so that it 
                    # doesn't get mixed with the main
                    # "instance" in the outer function manage_player_deletion

                    for label in labels_dict.values():
                        if label.text in instance.text:
                            for data in file_contents:

                                # Stripping the whitespace between first and last name
                                # This code removes player from login_info.txt
                                if label.text.replace(" ", "") == "".join(data.split(",")[0] + data.split(",")[1]):

                                    with open("login_info.txt", "r") as f:
                                        lines = f.readlines()

                                    with open("login_info.txt", "w") as f:
                                        for line in lines:
                                            if line.strip("\n") != data:
                                                f.write(line)


                    # This code removes player from highscores.txt
                    with open("highscores.txt", "r") as f:
                        lines = f.readlines()

                    with open("highscores.txt", "w") as f:
                        for line in lines:
                            name, _ = line.split(",")

                            if name not in instance.text:
                                f.write(line)      


                    deletion_message.text = "Success! This popup will dismiss any time now."
                    deletion_message.color = [0, 1, 0, 1]

                    Clock.schedule_once(popup.dismiss, 0.5)

                popup = Popup(title='Player deletion confirmation', title_size=(30),
                              title_align='center', content=pop_up_layout,
                              size_hint=(None, None), size=(400, 400),
                              auto_dismiss=False)

                yes_button.bind(on_press=delete_player)
                no_button.bind(on_press=popup.dismiss)

                popup.open()

            for count, content in enumerate(file_contents, start=1):
                first, last, *_ = content.split(",")
                name = first + " " + last

                labels_dict["player_label_" + str(count)] = Label(text=name)
                buttons_dict["remove_butt_" + str(count)] = Button(
                    text=f"Remove {name}", on_press=manage_player_deletion)

            for label, button in zip(labels_dict.values(), buttons_dict.values()):
                self.inside.add_widget(label)
                self.inside.add_widget(button)

        self.add_widget(self.inside)

        self.cols = 1
        self.go_back = Button(text="Go back to settings", size_hint=(
            0.8, 0.19), on_press=self.back_to_settings)
        self.add_widget(self.go_back)


    def back_to_settings(self, instance):
        tic_tac_toe.screen_manager.current = "Settings Page"

Спасибо, и любая помощь очень ценится.

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