我正在使用 kivy 做一个项目,但我对复选框有疑问。起初我试图像 python 编码一样编写程序(我知道它不干净,但我了解更多)我有一个带有此编码的第一个屏幕:
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.checkbox import CheckBox
class MainScreen(GridLayout):
def __init__(self,**kwargs):
e=[]
super(MainScreen, self).__init__(**kwargs)
self.cols=2
def on_checkbox_active(checkbox, value):
if value:
e.append(value)
print e
else:
print('The checkbox', checkbox, 'is inactive')
self.add_widget(Label(text='Inserta assignatures desitjades',font_size=35))
self.add_widget(Label(text=''))
ch1 = CheckBox()
self.add_widget(ch1)
self.add_widget(Label(text='Termotecnia'))
ch2 = CheckBox()
self.add_widget(ch2)
self.add_widget(Label(text='Termotecnia'))
ch3 = CheckBox()
self.add_widget(ch3)
self.add_widget(Label(text='Termotecnia'))
ch4 = CheckBox()
self.add_widget(ch4)
self.add_widget(Label(text='Termotecnia'))
b1=Button(text='Exit',background_color=[0.7,0.7,1,1],font_size=24)
self.add_widget(b1)
b2=Button(text='Next',font_size=24,font_color=[1,3,4,0],background_color=[1,2,3,6])
self.add_widget(b2)
ch1.bind(active=on_checkbox_active)
ch2.bind(active=on_checkbox_active)
b1.bind(on_press=exit)
b2.bind(on_press=reloaded)
...
class SimpleKivy(App):
def build(self):
return MainScreen()
if __name__=='__main__':
SimpleKivy().run()
例如,我想选择两个或三个选项,并将其保存到下一个屏幕,就像一种选择。如果有人知道如何做并为下一个屏幕保存信息,那将对我有很大帮助,因为我有下一个屏幕的所有选项的代码,但我想在第一个屏幕中预选,然后只使用我已选择。另外,如果有人可以帮助我,我想知道在按下“下一步”按钮时如何过渡到另一个类(class)(屏幕)。我知道这个问题很简单,但我是 kivy 编程的新手,有些概念非常困难。谢谢。
最佳答案
您想要的是访问其他类中的变量。有时这会很烦人,你可以用所有 __init__()
来做这件事。和东西,或者......一个更简单的方法出现了:它是 get_running_app()
.
您可以创建一个字典或其他东西,您可以在其中存储您的其他类需要访问的任何值。它类似于使用 globals
而且它花费你更少的代码行。例如,在您的情况下,您可以使用字典(或嵌套字典、json、...)来存储例如 'checkboxes':'<names of checked ones>'
在每个初始化中,您可以遍历这些值以创建复选框 active
基本上您只需要 a = App.get_running_app()
在 main - App - 类中访问某处和某物。
例子:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
Builder.load_string('''
<Root>:
MainScreen:
name: 'main'
AnotherScreen:
name: 'another'
<MainScreen>:
BoxLayout:
Button:
text: 'next screen'
on_release: root.parent.current='another'
Button:
text: 'ping!'
on_release: root.ping()
<AnotherScreen>:
BoxLayout:
Button:
text: 'previous screen'
on_release: root.parent.current='main'
Button:
text: 'ping!'
on_release: root.ping()
''')
class MainScreen(Screen):
def __init__(self, **kw):
super(MainScreen, self).__init__(**kw)
self.a = App.get_running_app()
def ping(self):
print self.a.big_dict['hi']
class AnotherScreen(Screen):
def ping(self):
b = App.get_running_app()
print b.big_dict['hi']
class Root(ScreenManager):
pass
class SimpleKivy(App):
big_dict={'hi':'hi there!'}
def build(self):
return Root()
SimpleKivy().run()
您可以看到不需要调用 __init__()
,如果你真的不需要,就不需要写更多的代码行。
关于python - Python 中 Kivy 小部件之间的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35993548/