首页 > 解决方案 > 无法移动写在 .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()

谢谢你已经回答...

标签: pythonwidgetkivy

解决方案


  1. 实现一个自定义的小部件类,例如MyWidget()使用方法来更新possize
  2. 替换Widget(...)MyWidget(...)
  3. 删除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])

推荐阅读