Kivy-显示Python变量并在变量更改时自动更新的标签
我一直在试图找到这个问题的答案,但毫无结果 我有一个需要显示全局Python变量的Label对象。但是,它们最初只显示在Kivy文件中设置的文本,除非按下按钮,否则不会更改。我需要标签立即显示变量,以及在变量更改时自动更新 下面是一个例子:Kivy-显示Python变量并在变量更改时自动更新的标签,python,python-3.x,kivy,python-3.7,kivy-language,Python,Python 3.x,Kivy,Python 3.7,Kivy Language,我一直在试图找到这个问题的答案,但毫无结果 我有一个需要显示全局Python变量的Label对象。但是,它们最初只显示在Kivy文件中设置的文本,除非按下按钮,否则不会更改。我需要标签立即显示变量,以及在变量更改时自动更新 下面是一个例子: """Hopefully this is a better example of what I need.""" # ============================== Import Modules ========================
"""Hopefully this is a better example of what I need."""
# ============================== Import Modules ==============================
# ===== Import Kivy =====
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.properties import StringProperty
# ============================================================================
# =========================== Variable Definitions ===========================
# ===== Define ScreenManager =====
sm = ScreenManager()
# ============================================================================
# ========================== Define screen classes ===========================
class InputScreen(Screen):
"""Input stuff into text boxes."""
var1 = StringProperty()
var2 = StringProperty()
var3 = StringProperty()
# Take the input from these text boxes and show them on the next screen
class DisplayScreen(Screen):
"""Show content from previous text boxes."""
# ============================================================================
# ============================= Define main app ==============================
class MainApp(App):
"""Class for main app."""
def build(self):
"""Build app."""
# Add screens to ScreenManager
sm.add_widget(InputScreen(name='input'))
sm.add_widget(DisplayScreen(name='display'))
# Display current screen
return sm
# ============================================================================
# ===== Run program =====
if __name__ == '__main__':
MainApp().run()
解决这个问题的一种方法是使用Kivy属性 将变量作为StringProperties添加到应用程序中。 设置每次更改输入文本时要更新的变量。。 设置显示标签以显示变量。。。 您的代码,正在工作: .py: 从kivy.app导入应用程序 从kivy.uix.screenmanager导入屏幕,screenmanager 从kivy.properties导入StringProperty sm=屏幕管理器 类输入屏幕: 在文本框中输入内容。 类显示屏幕: 显示以前文本框中的内容。 类别mainappp: 主应用程序的类。 var1=StringProperty var2=StringProperty var3=StringProperty def buildself: 构建应用程序。 向ScreenManager添加屏幕 sm.add_widgetInputScreenname='input' sm.add_widgetDisplayScreenname='display' 显示当前屏幕 返回sm ====运行程序===== 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': MainApp.run …和.kv: : 标签: 字体大小:20 位置提示:{'center_x':0.5,'center_y':0.85} 文本:var1= 文本输入: id:var1_输入 字体大小:24 大小提示:无,无 尺码:96,48 位置提示:{'center_x':0.5,'center_y':0.77} 多行:False 当文本更改时,将其写入变量 on_text:app.var1=self.text 标签: 字体大小:20 位置提示:{'center_x':0.5,'center_y':0.65} 文本:var2= 文本输入: id:var2_输入 字体大小:24 大小提示:无,无 尺码:96,48 位置提示:{'center_x':0.5,'center_y':0.57} 多行:False 当文本更改时,将其写入变量 on_text:app.var2=self.text 标签: 字体大小:20 位置提示:{'center_x':0.5,'center_y':0.45} 文本:var3= 文本输入: id:var3_输入 字体大小:24 大小提示:无,无 尺码:96,48 位置提示:{'center_x':0.5,'center_y':0.37} 多行:False 当文本更改时,将其写入变量 on_text:app.var3=self.text 按钮: 字体大小:20 大小提示:无,无 尺码:120、50 位置提示:{'center_x':0.5,'center_y':0.15} 正文:继续 新闻界: root.manager.transition.direction='left' root.manager.current='display' : 按钮: 字体大小:20 大小提示:无,无 尺码:80,50 位置提示:{x':0,'top':1} 文本:返回 新闻界: root.manager.transition.direction='right' root.manager.current='input' 标签: id:label1 文本到显示:这应该显示上一屏幕中的var1 字体大小:20 位置提示:{'center_x':0.5,'center_y':0.7} text:var1=+app.var1获取更新的值 标签: id:label2 文本到显示:这应该显示上一屏幕中的var2 字体大小:20 位置提示:{'center_x':0.5,'center_y':0.5} text:var2=+app.var2获取更新的值 标签: id:label3 文本到显示:这应该显示上一屏幕中的var3 字体大小:20 位置提示:{'center_x':0.5,'center_y':0.3} text:var3=+app.var3获取更新的值
我需要它立即显示变量,无需输入。这必须从变量中加载值,因为在我的实际应用程序中,无法提前知道值是什么。也许我解释得不好。。。我将制作一个更好的示例并编辑此评论,以添加指向Github要点的链接。留意。无法编辑我的上一条评论,所以。。。我可以回答你的问题,但你也必须更新你的代码。编辑您的问题并用要点中的代码替换您的代码。。否则,阅读它的人会感到困惑…:o@Offbox您可以将running app保存在如下变量中:self.app=app.get\u running\u app。之后,您可以通过self.app.my_var=任意更改变量
#:kivy 1.11.1
<InputScreen>:
var1: var1_input.text
var2: var2_input.text
var3: var3_input.text
Label:
font_size: 20
pos_hint: {'center_x': 0.5, 'center_y': 0.85}
text: "var1 ="
TextInput:
id: var1_input
font_size: 24
size_hint: None, None
size: 96, 48
pos_hint: {'center_x': 0.5, 'center_y': 0.77}
multiline: False
Label:
font_size: 20
pos_hint: {'center_x': 0.5, 'center_y': 0.65}
text: "var2 ="
TextInput:
id: var2_input
font_size: 24
size_hint: None, None
size: 96, 48
pos_hint: {'center_x': 0.5, 'center_y': 0.57}
multiline: False
Label:
font_size: 20
pos_hint: {'center_x': 0.5, 'center_y': 0.45}
text: "var3 ="
TextInput:
id: var3_input
font_size: 24
size_hint: None, None
size: 96, 48
pos_hint: {'center_x': 0.5, 'center_y': 0.37}
multiline: False
Button:
font_size: 20
size_hint: None, None
size: 120, 50
pos_hint: {'center_x': 0.5, 'center_y': 0.15}
text: "Continue"
on_press:
root.manager.transition.direction = 'left'
root.manager.current = 'display'
<DisplayScreen>:
Button:
font_size: 20
size_hint: None, None
size: 80, 50
pos_hint: {'x': 0, 'top': 1}
text: "Back"
on_press:
root.manager.transition.direction = 'right'
root.manager.current = 'input'
Label:
id: label1
text_to_display:"(this should show var1 from previous screen)"
font_size: 20
pos_hint: {'center_x': 0.5, 'center_y': 0.7}
text: "var1 = " + self.text_to_display
Label:
id: label2
text_to_display:"(this should show var2 from previous screen)"
font_size: 20
pos_hint: {'center_x': 0.5, 'center_y': 0.5}
text: "var2 = " + self.text_to_display
Label:
id: label3
text_to_display:"(this should show var3 from previous screen)"
font_size: 20
pos_hint: {'center_x': 0.5, 'center_y': 0.3}
text: "var3 = " + self.text_to_display