Вычитание позиции ModalView
из координат touch
работает.Я думаю, вы запутались в размерах и положении вашего ModalView
.При написании вашего кода ModalView
имеет тот же размер и положение, что и ваш GalleryWindow
(напомним, что по умолчанию size_hint
(1.0, 1.0)).Таким образом, для того, чтобы между координатами в ModalView
и GalleryWindow
была какая-либо разница, вам нужно изменить size_hint
для ModalView
.
После исправления многих ошибок в вашем коде (чтобы получитьэто бежать).Я внес некоторые изменения, чтобы продемонстрировать положение ModalView
и местоположение касания.
Вот код:
from kivy.app import App
from kivy.core.window import Window
from kivy.graphics.vertex_instructions import Line
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.modalview import ModalView
from kivy.uix.button import Button
class CropBounds(ModalView):
def __init__(self, **kwargs):
super(CropBounds, self).__init__(**kwargs)
self.to_crop = True
self.size_hint = (None, None) # without this, the size below has no effect
self.size = (400,400)
print('Center: ',self.center)
print('Size: ',self.size)
print('Window Center: ',Window.center)
print('Window Size:(',Window.width,',',Window.height,')')
def on_touch_down(self, touch):
if self.collide_point(*touch.pos) and self.to_crop:
self.canvas.clear()
with self.canvas:
# plot the boundary of the ModalView
Line(points=[self.pos[0], self.pos[1],
self.pos[0], self.pos[1] + self.height,
self.pos[0] + self.width, self.pos[1] + self.height,
self.pos[0] + self.width, self.pos[1],
self.pos[0], self.pos[1]])
# plot a line from the touch point to the pos of the ModalView
Line(points=[self.pos[0], self.pos[1], touch.x, touch.y])
# calculate touch minus position of ModalView
touch_in_modal = (touch.x - self.pos[0], touch.y - self.pos[1])
print('touch : ' + str(touch.pos) + ', touch in modal: ' + str(touch_in_modal))
return True
#return MainWindow().on_touch_down(touch)
class GalleryWindow(BoxLayout):
def __init__(self, **kwargs):
super(GalleryWindow, self).__init__(**kwargs)
self.add_widget(Button(text='crop',size_hint=(1,None),size=(40,40),on_release=self.crop_img))
def crop_img(self, *args):
bounds = CropBounds()
bounds.open()
class GalleryApp(App):
def build(self):
return GalleryWindow()
if __name__=='__main__':
GalleryApp().run()
Если вы хотите увидеть, что происходило вВаш код, просто закомментируйте строку size_hint
.
Кроме того, когда мы просим вас опубликовать пример MCV, попробуйте выполнить то, что вы публикуете.Если нам придется отладить ваш пример, прежде чем мы увидим, в чем ваша проблема, вы не получите много ответов.