【发布时间】:2017-10-29 21:02:10
【问题描述】:
我正在尝试在我的 Kivy 应用中实现手动创建的设置页面。在这种情况下,我在使用应用程序内部的实际设置时遇到了问题。为了演示这个问题,请使用这个最小的例子:
Python 文件“main.py”,我在其中尝试在两个全局变量 first_size 和 second_size 中写入当前字体大小,然后我想在 Kivy 文件中访问它们:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from settingsjson import settings_json
from kivy.properties import NumericProperty
import settings
class MainMenu(Screen):
pass
class ScreenManagement(ScreenManager):
pass
presentation = Builder.load_file("style.kv")
class MyApp(App):
def build(self):
global first_size, second_size
first_size = NumericProperty(settings.sizes[settings.options[0]]["first_label"])
second_size = NumericProperty(settings.sizes[settings.options[0]]["second_label"])
return presentation
def build_config(self, config):
config.setdefaults('settings', {
'test_size': settings.options[0]
})
def build_settings(self, settings):
settings.add_json_panel('Own Settings',
self.config,
data=settings_json)
def reset_labels(self, first_labelsize, second_labelsize):
global first_size, second_size
first_size = NumericProperty(first_labelsize)
second_size = NumericProperty(second_labelsize)
def on_config_change(self, config, section, key, value):
first_labelsize = settings.sizes[value]['first_label']
second_labelsize = settings.sizes[value]['second_label']
self.reset_labels(first_labelsize, second_labelsize)
myApp = MyApp()
myApp.run()
Python 文件“settingsjson.py”,包含新的设置页面:
import json
import settings
settings_json = json.dumps([
{'type': 'title',
'title': 'Settings'},
{'type': 'options',
'title': 'Size',
'desc': 'Test size',
'options': settings.options,
'section': 'settings',
'key': 'test_size'}])
将设置菜单中的两个选项与字体大小相关联的字典的 Python 文件“settings.py”:
options = ['small', 'large']
small = {'first_label': 20, 'second_label': 15}
large = {'first_label': 30, 'second_label': 25}
sizes = {options[0]: small, options[1]: large}
最后是 Kivy 文件“style.kv”:
ScreenManagement:
MainMenu:
## accessing first global variable (not working)
<Button>:
font_size: root.first_size
## accessing second global variable (not working either)
<TwoLineButton@Button>:
font_size: root.second_size
<MainMenu>:
name: "main"
FloatLayout:
Button:
size_hint: 0.5, 0.2
pos_hint: {"top": 0.5, "right": 1}
text: "One-line dummy"
TwoLineButton:
size_hint: 0.5, 0.2
pos_hint: {"top": 0.5, "left": 1}
text: "This is a two-line\n dummy"
halign: "center"
Button:
on_release:
app.open_settings()
text: "Settings"
font_size: self.height/4
pos_hint: {"top": 0.1, "right": 0.5}
size_hint: 0.2, 0.1
如您所见,当前形式的代码不起作用,因为我无法访问 Kivy 文件中的两个字体大小变量。如果我将 Kivy 文件中的 font_size 属性设置为常量值,应用程序运行没有问题,但当然不允许设置菜单中的更改生效。
有没有办法在Kivy文件中访问main.py-file中的全局变量来重置两种按钮的字体大小?
由于我必须在不止一个屏幕中更改设置,因此我需要一个全局独立于类的解决方案。
我很感激每一种提示......
【问题讨论】:
标签: python-3.x global-variables kivy kivy-language