python - 无法移动写在 .py 文件中的小部件位置
问题描述
您好,感谢您的阅读。我无法在屏幕上移动小部件位置。实际上我检查了小部件的位置,它随我的意愿而变化,但在屏幕上我看不到任何变化。我也试过这个,在 for 循环self.remove_widget(i)
然后self.add_widget(i)
. 但也没有任何改变。
.py 文件:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.uix.widget import Widget
from kivy.graphics import Color,Rectangle
from random import randint
class Page(Screen):
def on_enter(self, *args):
self.list1 = []
self.list2 = []
self.currentball = 0
def add(self):
self.currentball += 1
self.list1.append('Ball[{}]'.format(self.currentball))
self.list2.append(self.list1[len(self.list1)-1])
print('List1 => ',self.list1)
print('List2 => ',self.list2)
#Widget oluşturalım:
self.list2[len(self.list1)-1] = Widget(size_hint=(.1,.1),pos=(randint(100,200),randint(250,500)))
with self.list2[len(self.list1)-1].canvas:
Color(1,1,1,1)
Rectangle(source='worker.png',size=self.list2[len(self.list1)-1].size,pos=self.list2[len(self.list1)-1].pos)
self.add_widget(self.list2[len(self.list1)-1])
def move(self):
for i in self.list2:
i.pos[0] += randint(0,20)
print(i.pos)
def remove(self):
self.update()
class ScMn(ScreenManager):
pass
class test2(App):
def build(self):
return ScMn()
if __name__ == '__main__':
test2().run()
.kv 文件:
<ScMn>:
Page:
name: 'page'
id: pageid
<Page>:
RelativeLayout:
Button:
size_hint: .1,.1
pos: 0,0
text: 'Add'
on_press: root.add()
Button:
size_hint: .1,.1
pos_hint:{'x':.1,'y':0}
text: 'Move'
on_press: root.move()
Button:
size_hint: .1,.1
pos_hint:{'x':.2,'y':0}
text: 'RemoveLast'
on_press: root.remove()
谢谢你已经回答...
解决方案
- 实现一个自定义的小部件类,例如
MyWidget()
使用方法来更新pos
和size
- 替换
Widget(...)
为MyWidget(...)
- 删除
with self.list2[len(self.list1)-1].canvas: ...
,因为它是在新类中完成的MyWidget()
片段
class MyWidget(Widget):
def __init__(self, **kwargs):
super(MyWidget, self).__init__(**kwargs)
with self.canvas:
self.rect = Rectangle(pos=self.pos, size=self.size)
self.bind(pos=self.update_rect, size=self.update_rect)
def update_rect(self, *args):
self.rect.pos = self.pos
self.rect.size = self.size
class Page(Screen):
...
def add(self):
...
self.list2[len(self.list1) - 1] = MyWidget(size_hint=(.1, .1), pos=(randint(100, 200), randint(250, 500)))
self.add_widget(self.list2[len(self.list1) - 1])
推荐阅读
- c# - Razor 类库 MSBuild MSB4062 编译期间出错
- javascript - 为什么在这个不可变 JS 测试中 equals 很慢?
- php - 为什么我在这方面遇到这么多麻烦:
- javascript - 显示/隐藏独特的 div
- intellij-idea - 更改 WebStorm 上选定文本的背景颜色?
- java - 从 Parent 类型的实例调用 child 的方法
- objective-c - 如果使用 NSMutableArray 而不是 NSArray,应用程序崩溃
- android - 您需要使用不同的包名称,因为“com.caspianz.hayatkhan.flashlight”已被您的其他应用程序之一使用
- sql - SQL->Informix DB 链接服务器
- keras - Keras 回调:Learnig Rate Schedular 并降低高原学习率