我正在用Kivy写一个程序,遇到了一个路障。照相机对象(来自kivy.uix.camera)响应size_hint中的更改,但是而不是响应pos_hint的更改。对于pos_hint,它总是在size_hint绘制的假想框中对摄像机馈送进行居中(也就是说,如果是size_hint: (0.5, 0.5),则该提要将集中在窗口的左下半部分,而不管pos_hint设置为什么)。
下面是一个最小可重现性的例子。如果您想要不同的size_hint或pos_hint值,请随意更改给定的值:
main.py
import kivy
kivy.require('1.11.1')
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.camera import Camera
from kivy.core.window import Window
Window.fullscreen = 'auto' # uses display's current resolution
class CameraStream(FloatLayout):
pass
class RootWidget(FloatLayout):
camera_stream = ObjectProperty(None)
def __init__(self, **kwargs):
super(RootWidget, self).__init__(**kwargs)
class LifterApp(App):
def build(self):
self.root = RootWidget()
return self.root
if __name__ == '__main__':
LifterApp().run()lifter.kv
#:kivy 1.11.1
<CameraStream>:
camera_stream: camera_stream_id
Camera:
id: camera_stream_id
resolution: (320, 240)
play: True
<RootWidget>:
camera_stream: camera_stream_id
CameraStream:
id: camera_stream_id
size_hint: (0.5, 0.5) # this does work
#size_hint: (0.1, 0.1) # ...so does this
#size_hint: (1, 1) # ...and this
pos_hint: {'center_x': 0.1, 'center_y': 0.1} # NOTE this doesn't work
#pos_hint: {'center_x': 0.9, 'center_y': 0.9} # ...neither does this
#pos_hint: {'x': 0, 'y': 0} # ...or this发布于 2020-12-16 08:28:22
我想好了所以我会分享我的解决方案。我的代码有两个问题。首先,我意识到kivy.uix.camera.Camera是从kivy.uix.image.Image派生而来的,所以我检查了那些文档并且肯定地说:
默认情况下,图像是居中的,适合于小部件边界框。如果不想这样做,可以将allow_stretch设置为True,keep_ratio设置为False。
这解释了小部件的大小(即“想象框”),而不是实际的视频提要。我遇到的另一个问题是,我试图在CameraStream: of <RootWidget>下设置所有属性,而实际上我需要将它们设置在Camera: of <CameraStream>下,因为包含它的是我正在修改的照相机对象,而不是CameraStream FloatLayout。
这两个问题的解决都使我的工作如愿以偿。为了完整起见,下面是我更新的lifter.kv文件( main.py文件保持不变):
#:kivy 1.11.1
<CameraStream>:
camera_stream: camera_stream_id
Camera:
id: camera_stream_id
resolution: (320, 240)
play: True
allow_stretch: True
keep_ratio: False
size_hint: (0.5, 0.5)
#size_hint: (0.1, 0.1)
#size_hint: (1, 1)
pos_hint: {'center_x': 0.1, 'center_y': 0.1}
#pos_hint: {'center_x': 0.9, 'center_y': 0.9}
#pos_hint: {'x': 0, 'y': 0}
<RootWidget>:
camera_stream: camera_stream_id
CameraStream:
id: camera_stream_id https://stackoverflow.com/questions/65271992
复制相似问题