基于文本的游戏 Kivy- 文本不更新
Text based game Kivy- text not updating
我目前正在使用 Python 制作一个基于文本的游戏,我一直想使用 Kivy 为它制作一个图形界面。到目前为止,我一直无法让它工作。
原因是我已经从打印和输入更改为 self.label1 = Label(text='Hello world') 等(有多个变量 - label2、3 和 4。)然后 for输入,一个文本输入框,当按下按钮时输入由一个函数使用(目前不涉及文本框,因为我首先只是测试按钮是否有效。)。问题是,我需要一种方法来更新用新值显示的文本。例如,我希望 label1 更改为 "These are the controls"。但是当单击按钮时,不会发生更改 - 我希望通过更改标签变量的值来使用新文本更新 GUI。我相信,因为那些被返回,上面的代码不再循环。我得到的想法是将不同的部分放入函数中,或者使用线程。有没有人有任何提示可以将我推向正确的方向。我知道问这个问题可能太多了,如果是这样,我会继续自己寻找解决方案。如果需要,我可以展示一些代码。
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()
如果你被建议使用线程,那么你的顾问似乎不了解 GUI,在 GUI 中,任务是通过事件异步完成的,也就是说,GUI 会为你提供方法来指示什么时候有事情发生发生在 GUI 中,例如事件 on_press 会在按下按钮时通知您,因此他们将信号连接到该事件。另一方面,GUI 具有面向对象编程、面向事件编程的重要组成部分,并且在 .kv 中是一种声明性语言,因此我建议您阅读这些概念,为此 kivy 提供了很好的文档和示例,审查他们。如果你想更新一个标签,至少它必须在整个 class 中是可访问的,所以它必须是 class 的一个属性并且使用文本 属性,另一方面如果你想显示多行文本使用\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()
我目前正在使用 Python 制作一个基于文本的游戏,我一直想使用 Kivy 为它制作一个图形界面。到目前为止,我一直无法让它工作。
原因是我已经从打印和输入更改为 self.label1 = Label(text='Hello world') 等(有多个变量 - label2、3 和 4。)然后 for输入,一个文本输入框,当按下按钮时输入由一个函数使用(目前不涉及文本框,因为我首先只是测试按钮是否有效。)。问题是,我需要一种方法来更新用新值显示的文本。例如,我希望 label1 更改为 "These are the controls"。但是当单击按钮时,不会发生更改 - 我希望通过更改标签变量的值来使用新文本更新 GUI。我相信,因为那些被返回,上面的代码不再循环。我得到的想法是将不同的部分放入函数中,或者使用线程。有没有人有任何提示可以将我推向正确的方向。我知道问这个问题可能太多了,如果是这样,我会继续自己寻找解决方案。如果需要,我可以展示一些代码。
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()
如果你被建议使用线程,那么你的顾问似乎不了解 GUI,在 GUI 中,任务是通过事件异步完成的,也就是说,GUI 会为你提供方法来指示什么时候有事情发生发生在 GUI 中,例如事件 on_press 会在按下按钮时通知您,因此他们将信号连接到该事件。另一方面,GUI 具有面向对象编程、面向事件编程的重要组成部分,并且在 .kv 中是一种声明性语言,因此我建议您阅读这些概念,为此 kivy 提供了很好的文档和示例,审查他们。如果你想更新一个标签,至少它必须在整个 class 中是可访问的,所以它必须是 class 的一个属性并且使用文本 属性,另一方面如果你想显示多行文本使用\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()