gpt4 book ai didi

python - 具有负尺寸的 collide_widget

转载 作者:行者123 更新时间:2023-11-28 18:31:49 25 4
gpt4 key购买 nike

我有几个小部件,想“拖动并选择”它们。我使用一个选择小部件作为矩形来显示选择大小,然后使用 for child in root.children: selection.collide_widget(child)。只要我从左下向右上方向拖动,这就很好用,因为选择小部件的大小将是正数。

是否预期具有负尺寸的小部件将无法与 collide_widget 一起使用?

我根本不应该为小部件使用负尺寸吗?

kv文件:

<SelectionBox>:
size: 0,0
size_hint: None, None
canvas:
Color:
rgba: 1, 1, 1, 0.1
Rectangle:
pos: root.pos
size: root.size

<Selectable>:
size: 32, 32
size_hint: None, None
canvas:
Color:
rgba: 0, 1, 0, 1
Rectangle:
pos: root.pos
size: root.size

代码:

class Selectable(Widget):
pass

class Canvas(FloatLayout):

touch_down = False

def on_touch_down(self, touch):
self.selection = sel = SelectionBox()
sel.pos = touch.pos
self.touch_down = True
self.add_widget(sel)

def on_touch_move(self, touch):
if self.touch_down:
#~~~~~~~~~~~~~~~~~~~~~~~~~ Interesting line here ~~~~~~~~~~~~~~~~~~~~~~~~~
# size can get negative
self.selection.size = (touch.pos[0] - self.selection.pos[0] , touch.pos[1] - self.selection.pos[1])

def on_touch_up(self, touch):

for widget in self.children:
if widget is self.selection:
print("Children is selection")
if self.selection.collide_widget(widget):
print("Widget collides: {}".format(widget))

self.touch_down = False
self.remove_widget(self.selection)

canvas = Canvas()

class MyApp(App):
def build(self):
canvas = Canvas()
for i in range(0,11):
sel = Selectable()
sel.pos = random.random() * 1000, random.random() * 1000
self.add_widget(sel)
return canvas

if __name__ == "__main__":
MyApp().run()

最佳答案

确实,这种行为是意料之中的。来自 kivy.uix.widget.Widget :

def collide_widget(self, wid):
if self.right < wid.x:
return False
if self.x > wid.right:
return False
if self.top < wid.y:
return False
if self.y > wid.top:
return False
return True

对于负尺寸,此逻辑将不起作用,例如self.right < self.x .一个简单的解决方法是重新定义 collide_widget对于那些需要负尺寸的类:

def collide_widget(self, wid):    
if max(self.x, self.right) < min(wid.x, wid.right):
return False
if min(self.x, self.right) > max(wid.x, wid.right):
return False
if max(self.top, self.y) < min(wid.y, wid.top):
return False
if min(self.top, self.y) > max(wid.y, wid.top):
return False
return True

这会处理具有正尺寸或负尺寸的两个小部件(一个调用 collide_widget 的小部件和一个被测试的小部件)。

但是,我不确定其他地方的代码是否依赖于未按预期发生碰撞的负尺寸(所以猴子修补到 Widget 时要小心)。

关于python - 具有负尺寸的 collide_widget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36379202/

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