是否可以在 App() 中修改不同 class 中的变量而不实例化 class 的新实例
Is it possible to modify variables in different class from within App() without instantiating new instance of class
我正在尝试使用 kivy 的设置面板。但是,如果不实例化我正在尝试使用的 class 的新对象,我无法让它从 App() 中访问和/或修改 class 变量。这对于我想做的事情是不可接受的。 json 文件包含在名为 MyJson.json 的文件中,my_json 是实际的 data.I 知道这是有效的,因为设置面板可以正常弹出。
我想使用此处列出的设置面板(或类似方式)。但是,我需要在设置面板中更改值,以便在发生时更改 myScreen 中的变量。
是否可以从 App() 访问 myScreen(Screen) 而无需像我在下面的示例中那样创建新的 myScreen() 对象?
import sys
import os
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.config import Config
from kivy.config import ConfigParser
from kivy.uix.settings import SettingsWithSidebar
from kivy.uix.button import Button
from MyJson import my_json
class myScreen(Screen):
def __init__(self, **kwargs):
super(myScreen, self).__init__(**kwargs)
self.test_var = 2
def example_func(self):
print(str(self.test_var))
class myScreenManager(ScreenManager):
pass
root_widget = Builder.load_string('''
myScreenManager:
myScreen:
<myScreen>:
Button:
id: test_button
size_hint: .03, .05
pos_hint: {'x': .50, 'y': .50}
on_press: app.open_settings()
''')
class TestApp(App):
def build(self):
self.settings_cls = SettingsWithSidebar
self.temp = myScreen()
return root_widget
def build_config(self, config):
config.setdefaults('settings_stuff', {
'example_one': False,
'example_two': True
})
def build_settings(self, settings):
settings.add_json_panel('Example Panel', self.config, data = my_json)
def on_config_change(self, config, section, key, value):
if key == 'example_one' and value == '1':
self.temp.test_var += 1
self.temp.example_func()
print(self.temp.test_var)
elif key == 'example_one' and value == '0':
self.temp.example_func()
self.temp.test_var -= 1
print(self.temp.test_var)
if __name__ == '__main__':
TestApp().run()
如果我 运行 上面的代码和 "Turn on" 开关它调用函数并打印值 2 而不是 3。它调用了该函数,但并未实现活动屏幕中的更改 class。
Json代码在这里:
import json
my_json = json.dumps([
{
"type": "title",
"title": "Settings Panel"
},
{
"type": "bool",
"title": "Add",
"desc": "increment value",
"section": "settings_stuff",
"key": "example_one"
},
{
"type": "bool",
"title": "random",
"desc": "filler",
"section": "settings_stuff",
"key": "example_two"
}
])
由于根是 ScreenManager
,您可以使用 get_screen()
:
通过其 name
访问屏幕
import sys
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.settings import SettingsWithSidebar
from MyJson import my_json
class MyScreen(Screen):
def __init__(self, **kwargs):
super(MyScreen, self).__init__(**kwargs)
self.test_var = 2
def example_func(self):
print(str(self.test_var))
class MyScreenManager(ScreenManager):
pass
root_widget = Builder.load_string('''
MyScreenManager:
MyScreen:
name: 'name_of_screen'
<MyScreen>:
Button:
id: test_button
size_hint: .03, .05
pos_hint: {'x': .50, 'y': .50}
on_press: app.open_settings()
''')
class TestApp(App):
def build(self):
self.settings_cls = SettingsWithSidebar
self.temp = root_widget.get_screen('name_of_screen')
return root_widget
def build_config(self, config):
config.setdefaults('settings_stuff', {
'example_one': False,
'example_two': True
})
def build_settings(self, settings):
settings.add_json_panel('Example Panel', self.config, data = my_json)
def on_config_change(self, config, section, key, value):
if key == 'example_one' and value == '1':
self.temp.test_var += 1
self.temp.example_func()
print(self.temp.test_var)
elif key == 'example_one' and value == '0':
self.temp.example_func()
self.temp.test_var -= 1
print(self.temp.test_var)
if __name__ == '__main__':
TestApp().run()
我正在尝试使用 kivy 的设置面板。但是,如果不实例化我正在尝试使用的 class 的新对象,我无法让它从 App() 中访问和/或修改 class 变量。这对于我想做的事情是不可接受的。 json 文件包含在名为 MyJson.json 的文件中,my_json 是实际的 data.I 知道这是有效的,因为设置面板可以正常弹出。
我想使用此处列出的设置面板(或类似方式)。但是,我需要在设置面板中更改值,以便在发生时更改 myScreen 中的变量。
是否可以从 App() 访问 myScreen(Screen) 而无需像我在下面的示例中那样创建新的 myScreen() 对象?
import sys
import os
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.config import Config
from kivy.config import ConfigParser
from kivy.uix.settings import SettingsWithSidebar
from kivy.uix.button import Button
from MyJson import my_json
class myScreen(Screen):
def __init__(self, **kwargs):
super(myScreen, self).__init__(**kwargs)
self.test_var = 2
def example_func(self):
print(str(self.test_var))
class myScreenManager(ScreenManager):
pass
root_widget = Builder.load_string('''
myScreenManager:
myScreen:
<myScreen>:
Button:
id: test_button
size_hint: .03, .05
pos_hint: {'x': .50, 'y': .50}
on_press: app.open_settings()
''')
class TestApp(App):
def build(self):
self.settings_cls = SettingsWithSidebar
self.temp = myScreen()
return root_widget
def build_config(self, config):
config.setdefaults('settings_stuff', {
'example_one': False,
'example_two': True
})
def build_settings(self, settings):
settings.add_json_panel('Example Panel', self.config, data = my_json)
def on_config_change(self, config, section, key, value):
if key == 'example_one' and value == '1':
self.temp.test_var += 1
self.temp.example_func()
print(self.temp.test_var)
elif key == 'example_one' and value == '0':
self.temp.example_func()
self.temp.test_var -= 1
print(self.temp.test_var)
if __name__ == '__main__':
TestApp().run()
如果我 运行 上面的代码和 "Turn on" 开关它调用函数并打印值 2 而不是 3。它调用了该函数,但并未实现活动屏幕中的更改 class。
Json代码在这里:
import json
my_json = json.dumps([
{
"type": "title",
"title": "Settings Panel"
},
{
"type": "bool",
"title": "Add",
"desc": "increment value",
"section": "settings_stuff",
"key": "example_one"
},
{
"type": "bool",
"title": "random",
"desc": "filler",
"section": "settings_stuff",
"key": "example_two"
}
])
由于根是 ScreenManager
,您可以使用 get_screen()
:
name
访问屏幕
import sys
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.settings import SettingsWithSidebar
from MyJson import my_json
class MyScreen(Screen):
def __init__(self, **kwargs):
super(MyScreen, self).__init__(**kwargs)
self.test_var = 2
def example_func(self):
print(str(self.test_var))
class MyScreenManager(ScreenManager):
pass
root_widget = Builder.load_string('''
MyScreenManager:
MyScreen:
name: 'name_of_screen'
<MyScreen>:
Button:
id: test_button
size_hint: .03, .05
pos_hint: {'x': .50, 'y': .50}
on_press: app.open_settings()
''')
class TestApp(App):
def build(self):
self.settings_cls = SettingsWithSidebar
self.temp = root_widget.get_screen('name_of_screen')
return root_widget
def build_config(self, config):
config.setdefaults('settings_stuff', {
'example_one': False,
'example_two': True
})
def build_settings(self, settings):
settings.add_json_panel('Example Panel', self.config, data = my_json)
def on_config_change(self, config, section, key, value):
if key == 'example_one' and value == '1':
self.temp.test_var += 1
self.temp.example_func()
print(self.temp.test_var)
elif key == 'example_one' and value == '0':
self.temp.example_func()
self.temp.test_var -= 1
print(self.temp.test_var)
if __name__ == '__main__':
TestApp().run()