Kivy中float与NumericProperty比较报错问题求助
解决Kivy中Scatter位置与Screen尺寸比较的报错问题
错误原因
你直接通过类名GameScreen访问width/height,得到的是Kivy的NumericProperty对象,不是实际的屏幕尺寸数值,所以和self.pos的float值比较时会触发类型错误。同理,把pos转成NumericProperty也没用——属性对象本身不能直接做大小比较。
解决方案
核心是获取GameScreen实例的实际尺寸值,而不是访问类的属性定义。以下是两种常见实现方式:
方式1:通过父容器获取(Scatter在GameScreen内部时)
如果你的Scatter是GameScreen的直接子控件,直接通过self.parent获取屏幕实例,再访问其尺寸:
# 获取屏幕实例的实际宽高 screen_width = self.parent.width screen_height = self.parent.height # 进行位置判断(如果要判断Scatter是否完全超出屏幕,建议用right/top更准确) if (self.pos[0] < 0 or self.right > screen_width or self.pos[1] < 0 or self.top > screen_height): # 执行你的逻辑 pass
注:
self.right等于self.pos[0] + self.width,self.top等于self.pos[1] + self.height,用这两个值判断控件是否超出屏幕边界更准确,避免只判断左下角坐标导致的误判。
方式2:通过ScreenManager获取屏幕实例
如果Scatter不在GameScreen直接子层级,可通过ScreenManager获取指定屏幕的实例:
from kivy.app import App from kivy.uix.screenmanager import ScreenManager # 获取当前运行app的ScreenManager实例(假设root是ScreenManager) screen_manager = App.get_running_app().root # 通过屏幕名称获取GameScreen实例,替换成你定义的屏幕name game_screen = screen_manager.get_screen('GameScreen') screen_width = game_screen.width screen_height = game_screen.height # 同样进行位置判断 if (self.pos[0] < 0 or self.right > screen_width or self.pos[1] < 0 or self.top > screen_height): # 执行你的逻辑 pass
内容的提问来源于stack exchange,提问作者DonPiero
相关产品推荐
相关产品推荐

