几天来,我一直在尝试在 Kivy 中为小部件属性创建一个全局变量。我感到非常沮丧(可能是因为我一般是编码新手),而且网上似乎没有任何关于这个问题的帮助。
我的代码如下[PYTHON后跟KIVY]:
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.accordion import Accordion, AccordionItem
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
class ScreensManaged(ScreenManager):
pass
class MainScreen(Screen):
pass
class SettingsScreen(Screen):
pass
class StoryScreen(Screen):
pass
class StoryApp(App):
def build(self):
return ScreensManaged()
if __name__ == '__main__':
StoryApp().run()
和。。。。
#:kivy 1.8.0
<ScreensManaged>:
MainScreen:
SettingsScreen:
<MainScreen>:
name: "main"
FloatLayout:
Button:
text: "Begin the story!"
size_hint: .25, 0.10
pos_hint: {'x':.70, 'y':.25}
on_release: app.root.current = "settings"
Button:
text: "Settings"
size_hint: .25, 0.10
pos_hint: {'x':.70, 'y': .13}
on_release: app.root.current = "settings"
<SettingsScreen>:
name: "settings"
BoxLayout:
orientation: "vertical"
Accordion:
orientation: "vertical"
AccordionItem:
title: "Main Character"
size_hint:.9, 0.10
pos_hint: {'x':0.05, 'y':0.85}
Label:
text: "First Name"
TextInput:
id: firstName
text: "There's an animal in trouble!"
AccordionItem:
title: "Love Interest"
size_hint: .9, 0.10
pos_hint: {'x':0.05, 'y':0.70}
Button:
text: "What's up"
on_release: app.root.current = "main"
感兴趣的问题领域:
<StoryScreen>:
Label:
text: firstname.text
我知道它不是这样工作的,因为小部件的属性仅限于类范围 - 但是当我尝试使 StoryScreen 成为 Python 中 SettingsScreen 的一个类时,Kivy 无法打开 - 当我尝试在 SettingsScreen 类中创建全局变量时
class SettingsScreen(Screen):
global first
first = self.ids['first name']
class SettingsScreen(Screen):
first = self.ids['first name']
global first
或者当我尝试在 StoryApp 中创建变量时,程序崩溃了——也许我不需要全局变量,但我使用全局变量使用纯 Python 编写了这个应用程序的基本内部,而且尝试通过 Kivy 创建这个应用程序似乎比在 Python 之上学习 Swift 和 Java 更容易(它们太循环了。为什么我必须做十八件事才能让程序记住 Swift 中的一串文本?
有什么帮助吗?
附言我确实浏览了StackOverflow,虽然有很多本地类Python解决方案,但没有任何基于Kivy语言的解决方案。
附言我尝试设置一个全局值(如 API 中建议的那样),但它也会使程序崩溃......
P.P.P.S.故事屏幕当前没有附加到任何按钮,因为我正在调试并试图找出代码的哪一部分使程序崩溃 - 这就是为什么所有按钮都设置为"设置"或"主要"的原因。
不要设置全局变量,计算出两个类的关系并在它们之间传递直接引用。
class SettingsScreen(Screen):
global first
first = self.ids['first name']
这纯粹是出于pythonic原因而不起作用的 - self.ids是为类的每个实例填充的,但是此代码不是按实例运行,而是在类本身的定义中运行...此时它没有此属性,即使有也不会填充。
但是当我尝试在 Python 中使 StoryScreen 成为 SettingsScreen 的一个类时,Kivy 无法打开
您的示例似乎不包括此部分,但选择一种在类之间传递变量的便捷方法至关重要。您的意思是故事屏幕将是设置屏幕的子类吗?
此外,包含程序崩溃时获得的 python 回溯通常很有用。这包括有关问题的信息,并且对于调试比仅仅知道程序崩溃更有用。