Мне нужно, чтобы набор изображений выводил реплицированное закадровое изображение в положение мыши и было перетаскиваемым.
Отредактировано *** Я обнаружил, что лаги возникли из-за размещения GridLayout в Scrollview.К сожалению, мне нужно использовать вложенный макет в Scrollview для моего приложения.Есть ли причина, по которой это происходит?
Отредактированный код
class IconMenuItem(Image):
def on_touch_down(self,touch):
if(self.collide_point(touch.x, touch.y)):
self.update_touch_image(self.id, touch)
touch.grab(self)
return True
def on_touch_move(self, touch):
if touch.grab_current is not self:
return
self.update_touch_image(self.id, touch)
def on_touch_up(self, touch):
if touch.grab_current is not self:
return
touch.ungrab(self)
self.return_image(self.source)
def return_image(self,source):
drag_icons=self.parent.parent.parent.parent.draggable_icons
for icon in drag_icons:
if(icon.source==source):
icon.center=self.to_window(-1000,-1000)
return
def update_touch_image(self, id, touch):
drag_icons=self.parent.parent.parent.parent.draggable_icons
for icon in drag_icons:
if(id==icon.id):
icon.center=self.to_window(touch.x, touch.y)
return
class MainScreen(Screen):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.load_icon_menu()
def load_icon_menu(self):
#print(self.children)
self.draggable_icons=[]
icon_gates=["id", "x", "y", "z", "h", "s", "t", "u", "barrier", "measure", "c", "dagger", "Debug"]
for i in range(len(icon_gates)):
icon=IconMenuItem(source = "images/" + icon_gates[i] + "_icon.png", allow_stretch=True, id=str(i))
self.ids['icon_menu'].add_widget(icon)
drag_icon=Image(source= "images/" + icon_gates[i] + "_icon.png", pos=(-1000, -1000), id=str(i))
self.draggable_icons.append(drag_icon)
self.ids['main_screen'].add_widget(drag_icon)
class RootWidget(ScreenManager):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.add_widget(MainScreen(name= 'screen'))
class EXApp(App):
pass
if __name__ == "__main__":
EXApp().run()
ex.kv
RootWidget:
<MainScreen>:
id:screen
FloatLayout:
id: main_screen
pos_hint: {'x': 0, 'y': 0}
canvas:
Color:
rgba:.7,.5,.7,0.3
Rectangle:
size: self.size
ScrollView:
size_hint: 0.25, 0.7/5*5
pos_hint:{'x': 0.7, 'y': 0.2}
GridLayout:
id: icon_menu
cols: 3
rows: 5
padding: 10
spacing: 10
canvas:
Color:
rgba:0,0,1,0.3
Rectangle:
pos: self.pos
size: self.size