Python 3.x 如何让嵌套的Kivy小部件彼此交互?

Python 3.x 如何让嵌套的Kivy小部件彼此交互?,python-3.x,kivy,Python 3.x,Kivy,我正在使用Kivy教程中提供的示例。我能够创建嵌套的小部件,但似乎无法获得按钮来修改屏幕其他部分中的对象 在本例中,我尝试修改Kivy示例脚本,将其转换为一个简单的登录窗口,其中包含一个从按钮中提取的numpad(在本例中,我们忽略vkeyboard,我尝试获取按钮…)。简而言之,按钮在左边,登录文本输入在右边。我似乎无法让按钮上的操作影响右侧的文本输入。听起来很简单,但我似乎不明白。我应该使用全局变量吗?我是否为此目的错误地创建了对象 from kivy.app import App from

我正在使用Kivy教程中提供的示例。我能够创建嵌套的小部件,但似乎无法获得按钮来修改屏幕其他部分中的对象

在本例中,我尝试修改Kivy示例脚本,将其转换为一个简单的登录窗口,其中包含一个从按钮中提取的numpad(在本例中,我们忽略vkeyboard,我尝试获取按钮…)。简而言之,按钮在左边,登录文本输入在右边。我似乎无法让按钮上的操作影响右侧的文本输入。听起来很简单,但我似乎不明白。我应该使用全局变量吗?我是否为此目的错误地创建了对象

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput


class AddNumpad(GridLayout):
    def __init__(self, **kwargs):
        super(AddNumpad, self).__init__(**kwargs)
        self.cols = 3
        self.padding = 50

        def callback(instance):
            print('The button <%s> is being pressed' % instance.text)
            # TODO: trying to populate the password textinput here

        for i in range(1,10):
            btn = Button(text=str(i))
            btn.bind(on_press=callback)
            self.add_widget(btn)
        self.add_widget(Label(text=''))
        btn = Button(text='0')
        btn.bind(on_press=callback)
        self.add_widget(btn)

class LoginScreen(GridLayout):

    def __init__(self, **kwargs):
        super(LoginScreen, self).__init__(**kwargs)
        self.password = TextInput(password=True, multiline=False)
        self.cols = 2
        self.numpad = AddNumpad()
        self.add_widget(self.numpad)
        self.entry = ''
        self.password.text = self.entry
        self.add_widget(self.password)


class MyApp(App):
    userInput = ''
    def build(self):
        return LoginScreen()


if __name__ == '__main__':
    MyApp().run()
从kivy.app导入应用
从kivy.uix.gridlayout导入gridlayout
从kivy.uix.label导入标签
从kivy.uix.button导入按钮
从kivy.uix.textinput导入textinput
类AddNumpad(网格布局):
定义初始(自我,**kwargs):
super(AddNumpad,self)。\uuuu init\uuuuuuuu(**kwargs)
self.cols=3
self.padding=50
def回调(实例):
打印('正在按下按钮''%instance.text〕)
#TODO:尝试在此处填充密码文本输入
对于范围(1,10)内的i:
btn=按钮(文本=str(i))
绑定(按=回调时)
self.add_小部件(btn)
self.add_小部件(标签(文本=“”))
btn=按钮(text='0')
绑定(按=回调时)
self.add_小部件(btn)
类登录屏幕(GridLayout):
定义初始(自我,**kwargs):
超级(LoginScreen,self)。\uuuuu初始化(**kwargs)
self.password=TextInput(password=True,multiline=False)
self.cols=2
self.numpad=AddNumpad()
self.add\u小部件(self.numpad)
self.entry=''
self.password.text=self.entry
self.add_小部件(self.password)
类别MyApp(应用程序):
用户输入=“”
def生成(自):
返回LoginScreen()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
MyApp().run()

您可以使用自定义属性并将其绑定到
LogginScreen
类中的回调:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.properties import StringProperty

class AddNumpad(GridLayout):
    passwIn = StringProperty()                            # <<<<<<<<<<<<<

    def __init__(self, **kwargs):
        super(AddNumpad, self).__init__(**kwargs)
        self.cols = 3
        self.padding = 50

        for i in range(1, 10):
            btn = Button(text=str(i))
            btn.bind(on_press=self.callback)
            self.add_widget(btn)

        self.add_widget(Label(text=''))
        btn = Button(text='0')
        btn.bind(on_press=self.callback)
        self.add_widget(btn)

    def callback(self, instance):
        self.passwIn += instance.text                     # <<<<<<<<<<<<<



class LoginScreen(GridLayout):
    def __init__(self, **kwargs):
        super(LoginScreen, self).__init__(**kwargs)
        self.password = TextInput(password=True, multiline=False)
        self.cols = 2
        self.numpad = AddNumpad()
        self.numpad.bind(passwIn=self.numpad_pressed)     # <<<<<<<<<<<<<
        self.add_widget(self.numpad)
        self.add_widget(self.password)

    def numpad_pressed(self, instance, value):
        self.password.text = value    


class MyApp(App):
    def build(self):
        return LoginScreen()


if __name__ == '__main__':
    MyApp().run()
从kivy.app导入应用
从kivy.uix.gridlayout导入gridlayout
从kivy.uix.label导入标签
从kivy.uix.button导入按钮
从kivy.uix.textinput导入textinput
从kivy.properties导入StringProperty
类AddNumpad(网格布局):

passwIn=StringProperty()#谢谢您的回答!这让我明白了很多!!在bind函数中,我有点惊讶于属性位于左侧(passwIn=self.numpad_)。如果我理解正确,通过这样写,passwIn将整个回调作为self.numpad\u的值传递?我试图理解为什么numpad_pressed函数接收3个变量而不是“self”。通过这样做,我们绑定到一个属性更改事件。当属性的值更改时,将调用回调。这将传递2个参数、其绑定方法被调用的实例(
self.num)和属性值
self
自动传递,因为
numpad\U pressed
LogginScreen
类的一种方法。