Текстовая игра Kivy - текст не обновляется - PullRequest
0 голосов
/ 21 октября 2018

В настоящее время я делаю текстовую игру на Python, и я хотел использовать Kivy для создания графического интерфейса для нее.Пока я не смог заставить его работать.

Причина в том, что я перешел с того, что было Печать и Ввод, на self.label1 = Label (text = 'Hello world') и т. Д. (Естьнесколько переменных - label2, 3 и 4.), а затем для ввода - текстовое поле, в котором ввод используется функцией при нажатии кнопки (в настоящее время текстовое поле не задействовано, так как я сначала просто проверяю,кнопка работает.).Проблема в том, что мне нужен способ обновить отображаемый текст новым значением.Например, я хотел бы, чтобы label1 изменился на «Это элементы управления».Но когда кнопка нажата, изменений не происходит - я бы хотел, чтобы графический интерфейс обновлялся с новым текстом, путем изменения значений переменных метки.Я считаю, что, поскольку они возвращаются, приведенный выше код больше не перебирает.Идея, которую мне дали, состоит в том, чтобы поместить различные разделы в функции или использовать многопоточность.У кого-нибудь есть советы, чтобы подтолкнуть меня в правильном направлении.Я понимаю, что это может быть слишком много, чтобы спросить, если так, я буду продолжать искать решение самостоятельно.Я могу показать часть кода при необходимости.

import kivy.uix.boxlayout
import kivy.uix.textinput
import kivy.uix.label
import kivy.uix.button
from kivy.app import App
from random import shuffle
import time
from kivy.uix.button import Button
from kivy.clock import Clock

alive = 1
buttonPressed = 0


class SimpleApp(App):
    def build(self):
        global alive
        global buttonPressed
        donext = 0
        alive = 1

        def callback(self):
            global buttonPressed
            buttonPressed = 1

        self.label1 = kivy.uix.label.Label(text="")
        self.label2 = kivy.uix.label.Label(text="")
        self.label3 = kivy.uix.label.Label(text="You have found yourself in a dungeon, somewhere is your escape path, will you make it out, and if so, what with?")
        self.label4 = kivy.uix.label.Label(text="")
        print(buttonPressed)
        if buttonPressed == 1:
            print("Has been pressed should work theoretically")
            self.label1 = kivy.uix.label.Label(text="These are the basic controls-")
            self.label2 = kivy.uix.label.Label(text="The controls-")
            self.label3 = kivy.uix.label.Label(text="A- approach enemy/ attack enemy")
            self.label4 = kivy.uix.label.Label(text="C- Go to chest")
        print("Press enter to continue.")

        self.boxLayout = kivy.uix.boxlayout.BoxLayout(orientation="vertical")
        self.boxLayout.add_widget(self.label1)
        self.boxLayout.add_widget(self.label2)
        self.boxLayout.add_widget(self.label3)
        self.boxLayout.add_widget(self.label4)
        self.btn1 = Button(text='Hello world 1', on_press=callback)
        self.boxLayout.add_widget(self.btn1)

        return self.boxLayout # Causes script not to continue
if __name__ == "__main__":
    simple = SimpleApp()
    simple.run()

1 Ответ

0 голосов
/ 21 октября 2018

Если вам посоветовали использовать потоки, похоже, что ваш советник не знает о GUI, в GUI задачи выполняются асинхронно с помощью событий, то есть GUI предоставит вам методы, чтобы указать, когда что-то произошло вGUI, например, событие on_press уведомляет вас, когда кнопка нажата, поэтому они связывают сигнал с этим событием.С другой стороны, GUI имеют высокий компонент объектно-ориентированного программирования, событийно-ориентированного программирования, а в .kv это декларативный язык, поэтому я рекомендую вам прочитать об этих концепциях, и для него kivy предлагает отличную документацию и примеры,просмотреть их.Если вы хотите обновить Label, по крайней мере, он должен быть доступен во всем классе, поэтому он должен быть атрибутом класса и использовать свойство text, с другой стороны, если вы хотите показать текст из нескольких строк, используйте \n для обозначения скачка линии.

Учитывая вышеизложенное, решение выглядит следующим образом:

from kivy.app import App

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label


class SimpleApp(App):
    def build(self):
        self.label = Label(text="You have found yourself in a dungeon,\nsomewhere is your escape path,\nwill you make it out, and if so, what with?")
        self.button = Button(text="Press Me", on_press=self.on_clicked, size_hint=(1.0, None))
        layout = BoxLayout(orientation="vertical")
        layout.add_widget(self.label)
        layout.add_widget(self.button)
        return layout

    def on_clicked(self, instance):
        self.label.text = "These are the basic controls-\nThe controls-\nA- approach enemy/ attack enemy\nC- Go to chest"


if __name__ == "__main__":
    SimpleApp().run()
...