Python 基维-我能';无法更改id为的源
我想在一个盒子里改变我的照片,我正试图在id的帮助下做到这一点。我已经尝试了很多解决方案,并且已经搜索了3个多小时,但是我什么都做不好,所以我非常感谢您的帮助。我对Kivy也很陌生 我试着改变: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' 我试着自己去摆弄它,但除了把错误改成另一个错误之外,我
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")