Не смог понять, почему функция в Киви второй раз не работаетPython

Программы на Python
Anonymous
Не смог понять, почему функция в Киви второй раз не работает

Сообщение Anonymous »

Здравствуйте, я написал программу, которая создает 6 настраиваемых виджетов, которые я назвал Cell, и я хочу, чтобы они менялись местами, если один из них перекрывает другой. Поэтому я написал функцию под названием swap_locations, и поначалу она работает правильно, но когда я пытаюсь поменять ячейку (которую я сначала выбрал) снова, она занимает место целевой ячейки, но целевая ячейка не меняет своего места. Вот мои части кода, которые я считаю подозрительными:
class Cell (FloatLayout, DragBehavior):

def __init__(self,**kwargs):
super(Cell, self).__init__(**kwargs)
self.previous_pos = [0,0]

def swap_locations(self, target):
target_pos = target.pos
self.pos = target_pos
target.pos = self.previous_pos
self.previous_pos = self.pos
target.previous_pos = target_pos

class BaseLayout (GridLayout):
clock = StringProperty()
day = StringProperty()
date = StringProperty()
temp = StringProperty()
icon = StringProperty()
selected_cell = Cell
target = Cell

def __init__(self, **kwargs):
super(BaseLayout, self).__init__(**kwargs),
Clock.schedule_once(self.calculate_cell_positions)

def calculate_cell_positions(self, dt):
cell_count = len(self.children)
if cell_count == 0:
return

cols = self.cols
rows = self.rows
cell_width = self.width / cols
cell_height = self.height / rows

for i, cell in enumerate(self.children):
if i % 2 == 0:
factor = 1
else:
factor = 0
row = i // cols
cell.previous_pos = [factor * cell_width, row * cell_height ]
cell.pos = cell.previous_pos

def on_touch_down(self, touch):
x, y = touch.pos
for child in self.children:
if child.collide_point(x,y):
target = child
self.selected_cell = target
return True
return True

def on_touch_move(self, touch):
if self.selected_cell:
x, y = touch.pos
self.selected_cell.pos = (x - self.selected_cell.width / 2, y - self.selected_cell.height / 2)
return True
return True

def on_touch_up(self, touch):
if self.selected_cell:
for child in self.children:

if child.collide_point(*touch.pos) and self.selected_cell != child:
self.selected_cell.swap_locations(child)
elif child.collide_point(*touch.pos) == None:
self.selected_cell.pos = self.selected_cell.previous_pos
else:
self.selected_cell.pos = self.selected_cell.previous_pos
return True

Я написал метод Calculate_cell_positions, чтобы вручную вычислять позиции ячеек, поскольку у моих ячеек нет начальных позиций. Возможно, это глупая идея, и если у вас есть лучшее решение, не стесняйтесь сообщить об этом. Спасибо!
Чтобы разобраться и смоделировать проблему, я прикрепил несколько фотографий своей программы1 2 3


Подробнее здесь: https://stackoverflow.com/questions/782 ... me-in-kivy

Вернуться в «Python»