Python 基维:为什么巴顿在案例2中失去了它的属性?
这个问题似乎很长,但不是。刚刚添加了代码和相应的日志供查看者参考。 我在用时钟做实验 目标:按下按钮后,最初为0的标签文本将增加10倍 我用两种方式写了这篇文章。案例1很好用。案例2(案例1代码中的少量编辑)在按下属性时丢失按钮 案例1:Python 基维:为什么巴顿在案例2中失去了它的属性?,python,python-3.x,kivy,Python,Python 3.x,Kivy,这个问题似乎很长,但不是。刚刚添加了代码和相应的日志供查看者参考。 我在用时钟做实验 目标:按下按钮后,最初为0的标签文本将增加10倍 我用两种方式写了这篇文章。案例1很好用。案例2(案例1代码中的少量编辑)在按下属性时丢失按钮 案例1: from kivy.app import App from kivy.lang import Builder from kivy.uix.widget import Widget from kivy.properties import ObjectProper
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty, ListProperty
from kivy.clock import Clock, _default_time as time
kv = '''
Some:
target: target
tick: tick
id: tick
BoxLayout:
orientation: 'vertical'
size: root.width, root.height
Label:
id: target
text: '0'
font_size: 32
size_hint: 1, .5
Button:
text: 'Change'
on_press:
root.chik.extend(range(int(target.text)+1, int(target.text)+ 11))
app.con.extend([root.change] * 10)
'''
class Some(Widget):
target = ObjectProperty(None)
tick = ObjectProperty(None)
chik = ListProperty([])
def __init__(self, **kwargs):
Widget.__init__(self, **kwargs)
def change(self):
print(f'From widget: {self.chik} and Label text: {self.target.text}')
if self.chik:
self.target.text = str(self.chik.pop(0))
class TestingApp(App):
con = ListProperty([])
def build(self):
Clock.schedule_interval(self.consume, 1)
return Builder.load_string(kv)
def consume(self, *args):
print(f'from app: {self.con}')
if self.con:
self.con.pop(0)()
if __name__ == "__main__":
TestingApp().run()
日志1:
[INFO ] [Base ] Start application main loop
from app: []
[INFO ] [GL ] NPOT texture support is available
from app: []
from app: []
from app: []
from app: []
from app: [<bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method
Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>]
From widget: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and Label text: 0
from app: [<bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method
Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>]
From widget: [2, 3, 4, 5, 6, 7, 8, 9, 10] and Label text: 1
from app: [<bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method
Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>]
From widget: [3, 4, 5, 6, 7, 8, 9, 10] and Label text: 2
from app: [<bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method
Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>]
From widget: [4, 5, 6, 7, 8, 9, 10] and Label text: 3
from app: [<bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method
Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>]
From widget: [5, 6, 7, 8, 9, 10] and Label text: 4
from app: [<bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method
Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>]
From widget: [6, 7, 8, 9, 10] and Label text: 5
from app: [<bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method
Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>]
From widget: [7, 8, 9, 10] and Label text: 6
from app: [<bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method
Some.change of <__main__.Some object at 0x000001DFFDFA5040>>]
From widget: [8, 9, 10] and Label text: 7
from app: [<bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>, <bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>]
From widget: [9, 10] and Label text: 8
from app: [<bound method Some.change of <__main__.Some object at 0x000001DFFDFA5040>>]
From widget: [10] and Label text: 9
from app: []
from app: []
from app: []
from app: []
from app: []
from app: []
from app: []
from app: []
from app: []
[INFO ] [Base ] Leaving application in progress...
使用def change:
中的print(self.target.text)
记录2
[INFO ] [Base ] Start application main loop
[INFO ] [Base ] Leaving application in progress...
Traceback (most recent call last):
File "e:\Search_GUI\practice.py", line 58, in <module>
TestingApp().run()
File "E:\Search_GUI\search_env\lib\site-packages\kivy\app.py", line 950, in run
runTouchApp()
File "E:\Search_GUI\search_env\lib\site-packages\kivy\base.py", line 582, in runTouchApp
EventLoop.mainloop()
File "E:\Search_GUI\search_env\lib\site-packages\kivy\base.py", line 347, in mainloop
self.idle()
File "E:\Search_GUI\search_env\lib\site-packages\kivy\base.py", line 387, in idle
Clock.tick()
File "E:\Search_GUI\search_env\lib\site-packages\kivy\clock.py", line 733, in tick
self.post_idle(ts, self.idle())
File "E:\Search_GUI\search_env\lib\site-packages\kivy\clock.py", line 776, in post_idle
self._process_events()
File "kivy\_clock.pyx", line 616, in kivy._clock.CyClockBase._process_events
File "kivy\_clock.pyx", line 649, in kivy._clock.CyClockBase._process_events
File "kivy\_clock.pyx", line 645, in kivy._clock.CyClockBase._process_events
File "kivy\_clock.pyx", line 218, in kivy._clock.ClockEvent.tick
File "e:\Search_GUI\practice.py", line 55, in consume
self.get_running_app().Some.change() # Change here
File "e:\Search_GUI\practice.py", line 41, in change
print(f'From widget: {self.chik} and Label text: {self.target.text}')
AttributeError: 'NoneType' object has no attribute 'text'
日志2未打印(self.target.text):
对于上述情况,按下按钮时不会发生任何情况
我想知道为什么会这样?如何让我的代码像案例1那样为案例2工作?在您的案例2中,有两个正在创建的
Some
。一个是由该线建造的:
return Builder.load_string(kv)
self.Some = Some() # Change here
这是你的应用程序显示的根
该行正在创建另一个:
return Builder.load_string(kv)
self.Some = Some() # Change here
第二个实例不是应用程序显示的一部分。因此,当您计划调用self.consume()
时,consume()
方法调用Some
实例的change()
方法,该实例不属于应用程序显示的一部分。另外,第二个实例没有在kv
字符串中定义的任何项,因为kv
字符串有一个根小部件定义,但没有创建Some
实例的规则
解决此问题的一种方法是通过更改以下内容将
kv
中的根小部件定义更改为规则:
Some:
致:
是否有方法访问
.py文件
中另一个小部件类中一个小部件类的ID?类似地,我们如何在.py文件
中引用应用程序类中的小部件ID?是的,但是ID
仅通过加载kv
创建,并且它们仅出现在创建它们的根小部件或根规则中。您需要访问从根小部件或根规则创建的实例,您可以访问该实例中的ids
字典。
Some:
<Some>:
def build(self):
Builder.load_string(kv)
self.Some = Some() # create just one instance of Some
Clock.schedule_interval(self.consume, 1)
return self.Some # use that one instance as the App root widget