我一直在努力尝试在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更容易(他们只是如此循环。为什么我要做十八件事来让程序记住一串文本在斯威夫特?)。
有任何帮助吗?
P.S。我绝对看过StackOverflow,虽然有很多本地类Python解决方案,但是没有任何基于Kivy语言的解决方案。
P.P.S。我尝试设置一个全局值(如API中所建议的那样),但它也会使程序崩溃......
P.P.P.S。故事屏幕目前没有附加到任何按钮,因为我正在调试并试图弄清楚代码的哪个部分崩溃程序 - 这就是为什么所有按钮都设置为&#34;设置&#34;或&#34;主要&#34;。
答案 0 :(得分:1)
不要设置全局变量,计算两个类的关系,并在它们之间传递直接引用。
class SettingsScreen(Screen):
global first
first = self.ids['first name']
这并不适用于纯粹的pythonic原因 - 为类的每个实例填充self.ids,但此代码不是按实例运行,而是在类本身的定义中运行...此时它没有这个属性,即使它已经填充也不会被填充。
但是当我试图让StoryScreen成为Python中的SettingsScreen类时,Kivy不会打开
您的示例似乎并未包含此部分,但选择在类之间传递变量的便捷方式至关重要。你的意思是StoryScreen是SettingsScreen的子类吗?
此外,包含程序崩溃时获得的python回溯通常很有用。这包括有关问题的信息,对于调试而言,远比只知道程序崩溃更有用。