Python 基维-我能';无法更改id为的源

Python 基维-我能';无法更改id为的源,python,class,kivy,kivy-language,Python,Class,Kivy,Kivy Language,我想在一个盒子里改变我的照片,我正试图在id的帮助下做到这一点。我已经尝试了很多解决方案,并且已经搜索了3个多小时,但是我什么都做不好,所以我非常感谢您的帮助。我对Kivy也很陌生 我试着改变: self.ids.rec.source = 'download.jpg' 致(如建议的) 它不起作用,只将我的错误更改为: AttributeError: 'NoneType' object has no attribute 'parent' 我试着自己去摆弄它,但除了把错误改成另一个错误之外,我

我想在一个盒子里改变我的照片,我正试图在id的帮助下做到这一点。我已经尝试了很多解决方案,并且已经搜索了3个多小时,但是我什么都做不好,所以我非常感谢您的帮助。我对Kivy也很陌生

我试着改变:

self.ids.rec.source = 'download.jpg'
致(如建议的)

它不起作用,只将我的错误更改为:

 AttributeError: 'NoneType' object has no attribute 'parent'
我试着自己去摆弄它,但除了把错误改成另一个错误之外,我实在无能为力

这是我的python文件:

from kivy.app import *
from kivy.uix.button import *
from kivy.graphics import *
from kivy.uix.widget import *
from kivy.uix.label import *
from kivy.uix.floatlayout import *
from kivy.uix.boxlayout import *
from kivy.uix.relativelayout import *
from kivy.properties import ListProperty, StringProperty,ObjectProperty
x = []
f = []
#---------------------------------------------------------------------------------
class Picture(FloatLayout):
    def __init__(self, **kwargs):
        super(Picture, self).__init__(**kwargs)
    def change(self,**kwargs):
        y = len(x)
        if y % 2 == 0:
            self.ids.rec.source = 'download.jpg'
            tilesource = 'download.jpg'
            print("aaaa")
        else:
            tilesource = 'images.jpg'
            print("bbbbb")

#---------------------------------------------------------------------------------
class TileWidget(FloatLayout):
    def __init__(self, **kwargs):
        super(TileWidget, self).__init__(**kwargs)
        self.pos = (0, 0)
        self.size = (1,1)
        d = Picture()
        self.add_widget(d)

    def swap(self):
        x.append("0")
        Picture().change()
#---------------------------------------------------------------------------------
class langApp(App):
    def build(self):
        return TileWidget()
#---------------------------------------------------------------------------------

if __name__ == '__main__':
    langApp().run()


And this is my .kv file:

    #:kivy 1.11.1
<TileWidget>:
    FloatLayout:
        pos: 0,0
        size: root.width,root.height
        Button:
            text: 'Last'
            pos_hint: {'x':.25,'y':.1}
            size_hint: .1,.1
        Button:
            text: 'Stop'
            pos_hint: {'x':.45,'y':.1}
            size_hint: .1,.1
        Button:
            on_press: root.swap()
            text: 'Next'
            pos_hint: {'x':.65,'y':.1}
            size_hint: .1,.1
<Picture>:
    pos_hint: {'x':.25,'y':.4}
    canvas:
        Rectangle:
            id: rec
            size: self.size[0]*0.5,self.size[1]*0.5
            pos: self.pos[0],self.pos[1]
            source: "images.jpg"
从kivy.app导入*
从kivy.uix.button导入*
从kivy.graphics导入*
从kivy.uix.widget导入*
从kivy.uix.label导入*
从kivy.uix.floatlayout导入*
从kivy.uix.boxlayout导入*
从kivy.uix.relativelayout导入*
从kivy.properties导入ListProperty、StringProperty、ObjectProperty
x=[]
f=[]
#---------------------------------------------------------------------------------
班级图片(版式):
定义初始(自我,**kwargs):
超级(图片,自我)。\uuuuu初始值(**kwargs)
def更改(自身,**kwargs):
y=len(x)
如果y%2==0:
self.ids.rec.source='download.jpg'
tilesource='download.jpg'
印刷品(“aaaa”)
其他:
tilesource='images.jpg'
打印(“BBB”)
#---------------------------------------------------------------------------------
类平铺边(浮动布局):
定义初始(自我,**kwargs):
super(TileWidget,self)。uuu init_uuuuuuuu(**kwargs)
self.pos=(0,0)
self.size=(1,1)
d=图片()
self.add_小部件(d)
def交换(自):
x、 附加(“0”)
图片().change()
#---------------------------------------------------------------------------------
类应用程序(应用程序):
def生成(自):
返回TileWidget()
#---------------------------------------------------------------------------------
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
langApp().run()
这是我的.kv文件:
#:kivy 1.11.1
:
浮动布局:
位置:0,0
尺寸:根。宽度,根。高度
按钮:
文字:“最后”
位置提示:{'x':.25,'y':.1}
大小提示:.1,.1
按钮:
文本:“停止”
位置提示:{'x':.45,'y':.1}
大小提示:.1,.1
按钮:
按:root.swap()
文本:“下一个”
位置提示:{'x':.65,'y':.1}
大小提示:.1,.1
:
位置提示:{'x':.25,'y':.4}
画布:
矩形:
id:rec
大小:self.size[0]*0.5,self.size[1]*0.5
位置:self.pos[0],self.pos[1]
资料来源:“images.jpg”
这是我的完整错误日志:

 Traceback (most recent call last):
   File "kivy\properties.pyx", line 861, in kivy.properties.ObservableDict.__getattr__
 KeyError: 'rec'

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "c:/Users/Leon/mobile/main.py", line 45, in <module>
     langApp().run()
   File "C:\Users\Leon\mobile\env\lib\site-packages\kivy\app.py", line 950, in run
     runTouchApp()
   File "C:\Users\Leon\mobile\env\lib\site-packages\kivy\base.py", line 582, in runTouchApp
     EventLoop.mainloop()
   File "C:\Users\Leon\mobile\env\lib\site-packages\kivy\base.py", line 347, in mainloop
     self.idle()
   File "C:\Users\Leon\mobile\env\lib\site-packages\kivy\base.py", line 391, in idle
     self.dispatch_input()
   File "C:\Users\Leon\mobile\env\lib\site-packages\kivy\base.py", line 342, in dispatch_input
     post_dispatch_input(*pop(0))
   File "C:\Users\Leon\mobile\env\lib\site-packages\kivy\base.py", line 248, in post_dispatch_input
     listener.dispatch('on_motion', etype, me)
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Leon\mobile\env\lib\site-packages\kivy\core\window\__init__.py", line 1412, in on_motion
     self.dispatch('on_touch_down', me)
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Leon\mobile\env\lib\site-packages\kivy\core\window\__init__.py", line 1428, in on_touch_down
     if w.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Leon\mobile\env\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Leon\mobile\env\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Leon\mobile\env\lib\site-packages\kivy\uix\behaviors\button.py", line 151, in on_touch_down
     self.dispatch('on_press')
   File "kivy\_event.pyx", line 705, in kivy._event.EventDispatcher.dispatch
   File "kivy\_event.pyx", line 1248, in kivy._event.EventObservers.dispatch
   File "kivy\_event.pyx", line 1132, in kivy._event.EventObservers._dispatch
   File "C:\Users\Leon\mobile\env\lib\site-packages\kivy\lang\builder.py", line 57, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "c:\Users\Leon\mobile\lang.kv", line 15, in <module>
     on_press: root.swap()
   File "c:/Users/Leon/mobile/main.py", line 37, in swap
     Picture().change()
   File "c:/Users/Leon/mobile/main.py", line 19, in change
     self.ids.rec.source = 'download.jpg'
   File "kivy\properties.pyx", line 864, in kivy.properties.ObservableDict.__getattr__
 AttributeError: 'super' object has no attribute '__getattr__'
回溯(最近一次呼叫最后一次):
文件“kivy\properties.pyx”,第861行,位于kivy.properties.observedict.\uu getattr__
KeyError:“rec”
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“c:/Users/Leon/mobile/main.py”,第45行,在
langApp().run()
文件“C:\Users\Leon\mobile\env\lib\site packages\kivy\app.py”,第950行,正在运行
runTouchApp()
runTouchApp中的文件“C:\Users\Leon\mobile\env\lib\site packages\kivy\base.py”,第582行
EventLoop.mainloop()
文件“C:\Users\Leon\mobile\env\lib\site packages\kivy\base.py”,第347行,在mainloop中
self.idle()
文件“C:\Users\Leon\mobile\env\lib\site packages\kivy\base.py”,第391行,空闲
self.dispatch_input()
文件“C:\Users\Leon\mobile\env\lib\site packages\kivy\base.py”,第342行,在dispatch\u输入中
发送后输入(*pop(0))
文件“C:\Users\Leon\mobile\env\lib\site packages\kivy\base.py”,第248行,在发送后输入中
dispatch('on_motion',etype,me)
文件“kivy\\ u event.pyx”,第709行,在kivy.\u event.EventDispatcher.dispatch中
文件“C:\Users\Leon\mobile\env\lib\site packages\kivy\core\window\\ uuu init\uuu.py”,第1412行,动态
自我派遣(“在我触地时”)
文件“kivy\\ u event.pyx”,第709行,在kivy.\u event.EventDispatcher.dispatch中
文件“C:\Users\Leon\mobile\env\lib\site packages\kivy\core\window\\ uuuu init\uuuu.py”,第1428行,在on\u触摸屏中
如果w.dispatch('打开触摸屏',触摸屏):
文件“kivy\\ u event.pyx”,第709行,在kivy.\u event.EventDispatcher.dispatch中
文件“C:\Users\Leon\mobile\env\lib\site packages\kivy\uix\widget.py”,第545行,在on\u触摸屏中
如果是child.dispatch('on_touch_down',touch):
文件“kivy\\ u event.pyx”,第709行,在kivy.\u event.EventDispatcher.dispatch中
文件“C:\Users\Leon\mobile\env\lib\site packages\kivy\uix\widget.py”,第545行,在on\u触摸屏中
如果是child.dispatch('on_touch_down',touch):
文件“kivy\\ u event.pyx”,第709行,在kivy.\u event.EventDispatcher.dispatch中
文件“C:\Users\Leon\mobile\env\lib\site packages\kivy\uix\behaviors\button.py”,第151行,在on\u触控下
自动发送('在印刷机上')
文件“kivy\\ u event.pyx”,第705行,在kivy.\u event.EventDispatcher.dispatch中
文件“kivy\\u event.pyx”,第1248行,在kivy.\u event.eventobserver.dispatch中
文件“kivy\\ u event.pyx”,第1132行,位于kivy.\u event.eventobserver.\u调度
文件“C:\Users\Leon\mobile\env\lib\site packages\kivy\lang\builder.py”,第57行,在自定义\u回调中
exec(\uuuukVLANG\uuuuuuu.co\u值,idmap)
文件“c:\Users\Leon\mobile\lang.kv”,第15行,在
按:root.swap()
文件“c:/Users/Leon/mobile/main.py”,第37行,在swap中
图片().change()
文件“c:/Users/Leon/mobile/main.py”,第19行,更改中
self.ids.rec.source='download.jpg'
文件“kivy\properties.pyx”,第864行,位于kivy.properties.observedict.\uu getattr__
AttributeError:“super”对象没有属性“\uuu getattr\uuuu”

您的代码有两个问题:

swap()
方法:

def swap(self):
    x.append("0")
    Picture().change()
class TileWidget(FloatLayout):
    def __init__(self, **kwargs):
        super(TileWidget, self).__init__(**kwargs)
        self.pos = (0, 0)
        self.size = (1,1)
        self.d = Picture()
        self.add_widget(self.d)

    def swap(self):
        x.append("0")
        self.d.change()
正在创建
Picture
的新实例,并对该新实例调用
change()
。这对GUI中实际存在的
Picture
实例没有影响。解决这个问题的一个简单方法是
class TileWidget(FloatLayout):
    def __init__(self, **kwargs):
        super(TileWidget, self).__init__(**kwargs)
        self.pos = (0, 0)
        self.size = (1,1)
        self.d = Picture()
        self.add_widget(self.d)

    def swap(self):
        x.append("0")
        self.d.change()
<Picture>:
    pos_hint: {'x':.25,'y':.4}
    canvas:
        Rectangle:
            group: 'rec'  # place this instruction in its own group
            size: self.size[0]*0.5,self.size[1]*0.5
            pos: self.pos[0],self.pos[1]
            source: "images.jpg"
def change(self,**kwargs):
    y = len(x)
    if y % 2 == 0:
        rec = self.canvas.get_group('rec')[0]
        rec.source = 'download.jpg'
        tilesource = 'download.jpg'
        print("aaaa")
    else:
        tilesource = 'images.jpg'
        print("bbbbb")