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