简体   繁体   English

Python 中 Kivy 小部件之间的交互

[英]Interaction between Kivy widgets in Python

I'm doing a proyect using kivy but i have a problem with the checkboxes.我正在使用 kivy 做一个项目,但我的复选框有问题。 At first I'm trying to do the program like python coding (I know it is'nt clean, but I understand more) And i have a first screen with this coding:起初,我正在尝试使用 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()

I want to select two or three options for example, and save it for the next screen, like a type of selection.例如,我想选择两个或三个选项,并将其保存到下一个屏幕,就像一种选择。 If anyone knows how to do it and save information for the next screen it woul help me a lot, because i have the code of the next screen for all the options, but i want to preselect in the first screen and then only use which i have selected.如果有人知道如何做并为下一个屏幕保存信息,它会对我有很大帮助,因为我有所有选项的下一个屏幕的代码,但我想在第一个屏幕中预选,然后只使用我选择了。 Also if anyone can help me, i want to know hoy to do the transition to another class (screen) when the button "Next" is pressed.另外,如果有人可以帮助我,我想知道如何在按下“下一步”按钮时转换到另一个类(屏幕)。 I know this question are pretty simple but I'm new in kivy programming and some concepts are pretty difficult.我知道这个问题很简单,但我是 kivy 编程的新手,有些概念很困难。 Thanks.谢谢。

What you want is accessing variables in other classes.您想要的是访问其他类中的变量。 Sometimes this can be annoying and you can do it either hard way with all __init__() and stuff, or... a simplier way comes along: it's get_running_app() .有时这可能很烦人,你可以用所有__init__()和其他东西来做它,或者......一个更简单的方法:它是get_running_app()

You can create a dictionary or something else, where you can store any value your other classes need to access.您可以创建一个字典或其他东西,您可以在其中存储其他类需要访问的任何值。 It's similar to using globals and it costs you less lines of code.它类似于使用globals ,并且花费更少的代码行。 For example in your case you could use a dictionary(or nested dictionaries, json, ...) to store for example 'checkboxes':'<names of checked ones>' and in each init you can loop over these values to make checkboxes active例如,在您的情况下,您可以使用字典(或嵌套字典,json,...)来存储例如'checkboxes':'<names of checked ones>'并且在每个 init 中,您可以遍历这些值以制作复选框active

Basically all you need is a = App.get_running_app() somewhere and something to access in main - App - class.基本上所有你需要的是a = App.get_running_app()某处和一些可以在 main - App - 类中访问的东西。

Example:例子:

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()

You can see there's no need to call __init__() , no need to write more lines of code if you really don't need to.您可以看到无需调用__init__() ,如果您真的不需要,则无需编写更多代码行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM