gpt4 book ai didi

python - 如何将 Kivy 触摸坐标转换为小部件空间

转载 作者:行者123 更新时间:2023-12-01 08:53:50 25 4
gpt4 key购买 nike

我有一个简单的ModalView,它的大小(640,426)。我的窗口大小是(1366,732).我的屏幕分辨率是(1366,768)。当我点击ModalView的左上角时,我得到类似363,690的信息code>。这是我从窗口本身获取的触摸坐标。但是我想以某种方式将此值转换为本地小部件空间,以便触摸左上角我得到坐标(0,0)而不是 (363,690)。这可以用 kivy 或任何其他方式实现吗?我想做的是,对于那些感兴趣的人来说,使用用户绘制的框来裁剪图像。绘制框不是'问题是,问题是获取这些边界并将它们传输到图像的坐标。

注意:我读到了关于 to_local(),to_parent(),to_window() 的内容,这些函数根本不起作用......出于某种原因,也许我错过了那里的一些东西,我会很感激你的帮助很大

这是与我的用例类似但被删除的代码

from kivy.app import App
from kivy.uix.modalview import ModalView
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.label import Label

class CropBounds(ModalView):

def __init__(self, **kwargs):
super(CropBounds, self).__init__(**kwargs)
self.to_crop = True
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):
self.canvas.clear()

if self.collide_point(*touch.pos) and self.to_crop:
with self.canvas:

self.start_x = touch.x
self.start_y = touch.y
touch.ud['area'] = Line(points=(touch.x, touch.y, touch.x, 400,touch.x, touch.y,touch.x, touch.y, touch.x, touch.y))
print("Pos: ",touch.pos)
print(touch.x,touch.y)
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=(None,40),on_release=self.crop_img))
def crop_img(self):
bounds = CropBounds()
bounds.open()

class GalleryApp(App):
def build(self):
return GalleryWindow()

if __name__=='__main__':
GalleryApp().run()

最佳答案

touch坐标中减去ModalView位置确实有效。我认为您对 ModalView 的大小和位置感到困惑。按照代码编写方式,ModalView 的大小和位置与 GalleryWindow 相同(回想一下,默认的 size_hint 为 (1.0, 1.0 ))。因此,如果 ModalViewGalleryWindow 中的坐标存在任何差异,您需要更改 ModalView< 的 size_hint/.

纠正代码中的许多错误后(使其运行)。我做了一些更改来演示 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 示例时,请尝试运行您发布的内容。如果我们必须先调试您的示例才能了解您的问题所在,那么您将不会得到太多回复。

关于python - 如何将 Kivy 触摸坐标转换为小部件空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52917706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com