首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基维:照相机不尊重pos_hint (但是尊重size_hint)

基维:照相机不尊重pos_hint (但是尊重size_hint)
EN

Stack Overflow用户
提问于 2020-12-13 03:07:31
回答 1查看 162关注 0票数 0

我正在用Kivy写一个程序,遇到了一个路障。照相机对象(来自kivy.uix.camera)响应size_hint中的更改,但是而不是响应pos_hint的更改。对于pos_hint,它总是在size_hint绘制的假想框中对摄像机馈送进行居中(也就是说,如果是size_hint: (0.5, 0.5),则该提要将集中在窗口的左下半部分,而不管pos_hint设置为什么)。

下面是一个最小可重现性的例子。如果您想要不同的size_hintpos_hint值,请随意更改给定的值:

main.py

代码语言:javascript
复制
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

代码语言:javascript
复制
#: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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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文件保持不变):

代码语言:javascript
复制
#: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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65271992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档