Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基维:为什么巴顿在案例2中失去了它的属性?_Python_Python 3.x_Kivy - Fatal编程技术网

Python 基维:为什么巴顿在案例2中失去了它的属性?

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

这个问题似乎很长,但不是。刚刚添加了代码和相应的日志供查看者参考。

我在用时钟做实验

目标:按下按钮后,最初为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 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