Kivy Popup 无法访问 root 方法
Kivy Popup not able to access root method
我是这里的新手,如果我没有遵循正确的程序,请随时纠正我。
我有一个会打开弹出窗口的 Kivy 应用程序。在弹出窗口中,我可以输入 2 个数字,然后单击应添加 2 个数字的添加按钮。我收到一条错误消息,说 "AttributeError: 'CustomPopup' object has no attribute 'addNum'"
为什么会这样?
test.py file
import kivy
kivy.require('1.9.1') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.properties import StringProperty
from kivy.properties import ObjectProperty
class CustomPopup(Popup):
pass
class MyStuff(BoxLayout):
num1 = StringProperty
num2 = StringProperty
answer = ''
def openPopup(self):
the_popup = CustomPopup()
the_popup.open()
def addNum(self):
self.answer = str(int(self.num1) + int(self.num2))
class MyStuffApp(App):
def build(self):
return MyStuff()
if __name__ == '__main__':
MyStuffApp().run()
mystuff.kv 文件
#: import main test
<MyStuff>:
orientation: 'vertical'
spacing: 5
padding: 5
Button:
text: 'Change numbers'
on_press: root.openPopup()
font_size: 50
Label:
text: root.answer
<CustomPopup>:
size_hint: .5, .5
auto_dismiss: False
title: 'Addition'
num1: number2
num2: number2
BoxLayout:
orientation: 'vertical'
Label:
text: '1st number'
TextInput:
id: number1
Label
text: '2nd number'
TextInput
id: number2
Button:
text: 'Add'
on_press: root.addNum()
首先,要访问addNum
,您必须从kv 部分调用app.root.addNum
。
您还必须发送要添加的值,即您在文本框中输入的文本:(number1.text, number2.text)
。
所以 运行 代码可能是这样的:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
Builder.load_string("""
<MyStuff>:
orientation: 'vertical'
spacing: 5
padding: 5
Button:
text: 'Change numbers'
on_press: root.openPopup()
font_size: 50
Label:
text: root.answer
<CustomPopup>:
size_hint: .5, .5
auto_dismiss: False
title: 'Addition'
num1: number2
num2: number2
BoxLayout:
orientation: 'vertical'
Label:
text: '1st number'
TextInput:
id: number1
Label
text: '2nd number'
TextInput
id: number2
Button:
text: 'Add'
on_press: app.root.addNum(number1.text, number2.text)
""")
class CustomPopup(Popup):
pass
class MyStuff(BoxLayout):
# num1 = StringProperty()
# num2 = StringProperty()
answer = ''
def openPopup(self):
the_popup = CustomPopup()
the_popup.open()
def addNum(self, *args):
# self.answer = str(int(self.num1) + int(self.num2))
self.answer = str(int(args[0]) + int(args[1]))
print(self.answer)
class MyStuffApp(App):
def build(self):
return MyStuff()
if __name__ == '__main__':
MyStuffApp().run()
如果您在某处有对 class 的引用,则可以访问 MyStuff
中的方法。
当您执行 root.addNum()
时,您尝试访问 CustomPopup
中的方法,在这种情况下它是根。
所以在这种情况下我要做的是将 MyStuff
定义为 App
class、(self.ms = MyStuff()
) 的属性。这样你就可以通过 app.ms.addNum()
在 kv
中访问它
您还需要将数字传递给 addNum
在 py.:
class MyStuff(BoxLayout):
answer = ''
def openPopup(self):
the_popup = CustomPopup()
the_popup.open()
def addNum(self, num1, num2):
self.answer = str(int(num1) + int(num2))
class MyStuffApp(App):
def build(self):
self.ms = MyStuff()
return self.ms
并以 kv 为单位:
Button:
text: 'Add'
on_press: app.ms.addNum(number1.text, number2.text)
我是这里的新手,如果我没有遵循正确的程序,请随时纠正我。
我有一个会打开弹出窗口的 Kivy 应用程序。在弹出窗口中,我可以输入 2 个数字,然后单击应添加 2 个数字的添加按钮。我收到一条错误消息,说 "AttributeError: 'CustomPopup' object has no attribute 'addNum'"
为什么会这样?
test.py file
import kivy
kivy.require('1.9.1') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.properties import StringProperty
from kivy.properties import ObjectProperty
class CustomPopup(Popup):
pass
class MyStuff(BoxLayout):
num1 = StringProperty
num2 = StringProperty
answer = ''
def openPopup(self):
the_popup = CustomPopup()
the_popup.open()
def addNum(self):
self.answer = str(int(self.num1) + int(self.num2))
class MyStuffApp(App):
def build(self):
return MyStuff()
if __name__ == '__main__':
MyStuffApp().run()
mystuff.kv 文件
#: import main test
<MyStuff>:
orientation: 'vertical'
spacing: 5
padding: 5
Button:
text: 'Change numbers'
on_press: root.openPopup()
font_size: 50
Label:
text: root.answer
<CustomPopup>:
size_hint: .5, .5
auto_dismiss: False
title: 'Addition'
num1: number2
num2: number2
BoxLayout:
orientation: 'vertical'
Label:
text: '1st number'
TextInput:
id: number1
Label
text: '2nd number'
TextInput
id: number2
Button:
text: 'Add'
on_press: root.addNum()
首先,要访问addNum
,您必须从kv 部分调用app.root.addNum
。
您还必须发送要添加的值,即您在文本框中输入的文本:(number1.text, number2.text)
。
所以 运行 代码可能是这样的:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
Builder.load_string("""
<MyStuff>:
orientation: 'vertical'
spacing: 5
padding: 5
Button:
text: 'Change numbers'
on_press: root.openPopup()
font_size: 50
Label:
text: root.answer
<CustomPopup>:
size_hint: .5, .5
auto_dismiss: False
title: 'Addition'
num1: number2
num2: number2
BoxLayout:
orientation: 'vertical'
Label:
text: '1st number'
TextInput:
id: number1
Label
text: '2nd number'
TextInput
id: number2
Button:
text: 'Add'
on_press: app.root.addNum(number1.text, number2.text)
""")
class CustomPopup(Popup):
pass
class MyStuff(BoxLayout):
# num1 = StringProperty()
# num2 = StringProperty()
answer = ''
def openPopup(self):
the_popup = CustomPopup()
the_popup.open()
def addNum(self, *args):
# self.answer = str(int(self.num1) + int(self.num2))
self.answer = str(int(args[0]) + int(args[1]))
print(self.answer)
class MyStuffApp(App):
def build(self):
return MyStuff()
if __name__ == '__main__':
MyStuffApp().run()
如果您在某处有对 class 的引用,则可以访问 MyStuff
中的方法。
当您执行 root.addNum()
时,您尝试访问 CustomPopup
中的方法,在这种情况下它是根。
所以在这种情况下我要做的是将 MyStuff
定义为 App
class、(self.ms = MyStuff()
) 的属性。这样你就可以通过 app.ms.addNum()
在 kv
中访问它
您还需要将数字传递给 addNum
在 py.:
class MyStuff(BoxLayout):
answer = ''
def openPopup(self):
the_popup = CustomPopup()
the_popup.open()
def addNum(self, num1, num2):
self.answer = str(int(num1) + int(num2))
class MyStuffApp(App):
def build(self):
self.ms = MyStuff()
return self.ms
并以 kv 为单位:
Button:
text: 'Add'
on_press: app.ms.addNum(number1.text, number2.text)