你能在kivy中获得设备的物理尺寸吗?

Posted

技术标签:

【中文标题】你能在kivy中获得设备的物理尺寸吗?【英文标题】:Can you obtain physical size of device in kivy? 【发布时间】:2016-10-17 20:41:12 【问题描述】:

有谁知道 Kivy 如何以不同的字体呈现文本?

我有 16sp 的文本标签。

在屏幕尺寸为 (1024, 552) 和 (2048, 1536) 的平板电脑上,它可以完美运行(宽高比分别为 1.855 和 1.333)

在屏幕尺寸为 (1280, 720)(比率 1.778)的电脑上,它也能完美显示,但在这种屏幕尺寸的手机上,字母会被截断

这里唯一的区别是设备的物理尺寸。因此,Kivy 文本似乎不是根据某些基于像素的算法渲染的,而是考虑了屏幕的物理尺寸

有什么方法可以确定 Kivy 中的物理尺寸吗?因此允许我相应地调整字体大小。如果我使用较小 (10sp) 的字体大小,文本在手机(小型设备)上可以正确显示,但在较大的设备上显示太小。

【问题讨论】:

手机上的 Pygame 还是 sdl2?可能与 pygame 相关。 不使用 PyGame。 Kivy 1.9.1 和 sdl2 你能发布你的代码吗? 【参考方案1】:

是的,您可以使用 kivy 确定屏幕的物理尺寸 - 你可以简单地使用这个模块:

(from kivy.core.window import Window)

然后通过这样写来确定大小:

(Window.size)

检查此代码(此代码确定简单标签上的屏幕物理尺寸):

⬇️⬇️

from kivy.app import App
from kivy.uix.label import Label
from kivy.core.window import Window

class MyApp(App):

   def build(self):

     window_sizes=Window.size

     return Label(text="screen sizes= "+str(window_sizes))

MyApp().run()

【讨论】:

Window.size 不是设备的物理尺寸。它是实际窗口的大小。我也在寻找相同的...【参考方案2】:

可以获取屏幕尺寸,但需要先安装plyer,在打包前还要安装patch,以便获取信息。

或者只使用普通的pyjnius 并使用autoclass 访问android.util.DisplayMetrics

【讨论】:

【参考方案3】:

据我了解,您在通过多种设备正确显示文本时遇到问题。现在,我不认为您可以通过 Kivy 本身获得设备的实际尺寸,但是使用普通的旧 python,您可以。

Python 中的示例:

import gtk

window = gtk.Window()

screen = window.get_screen()
print "screen size: %d x %d" % (
gtk.gdk.screen_width(),gtk.gdk.screen_height())        

上面的代码将打印出屏幕的高度和宽度,或分辨率,供您使用。

将它们存储在变量中:

import gtk

window = gtk.Window()

screen = window.get_screen()
ScreenWidth = gtk.gdk.screen_width()
ScreenHeight = gtk.gdk.screen_height()
# And to prove it worked (You would not want to include this part in code
#########################################################################
print str(ScreenWidth) + 'x' + str(ScreenHeight)

现在你有了这些变量,你可以在你的 .kv 文件中使用它们,通过从 python 文件中提取它们,或者以某种方式将整个函数直接实现到你的 Kivy 代码中。

【讨论】:

嗨 Moosez。你已经准确地理解了我的问题。然而,让 gtk 和 kivy 一起工作似乎没有那么简单。它在模拟器中运行良好,但是当我尝试在设备上使用它时它崩溃:(对不起。gtk 'plain old python'? GTK 是一个完全不同的工具包,我认为它甚至不支持 android。【参考方案4】:

来自:https://kivy.org/docs/api-kivy.metrics.html 我们了解到“sp”是与比例无关的像素大小。因此它已经包含了像素密度,并且每个设备上的字体大小都相同(至少应该如此)。

字体被裁剪的原因是容器的大小。您还应该给出所需的尺寸,就像在这个例子中一样(注意:如果你想要一个特定的高度,你必须包括 size_hint_y: None 参数)

TextInput:
        id: text_input
        size_hint_y: None
        height: '30sp'
        multiline: False

【讨论】:

【参考方案5】:

我最终做的是最大化我的窗口以获得最大允许的非全屏尺寸,然后读取该尺寸。我实际上用它来在屏幕上将一个较小的窗口居中:

#-- maximize first, to get the screen size, minus any OS toolbars
Window.maximize()
maxSize = Window.system_size

#-- set the actual window size, to be slightly smaller than full screen
desiredSize = (maxSize[0]*0.9, maxSize[1]*0.9)
Window.size = desiredSize

#-- center the window
Window.left = (maxSize[0] - desiredSize[0])*0.5
Window.top = (maxSize[1] - desiredSize[1])*0.5

请注意,通过首先最大化我的窗口,我将获得最大允许大小,减去任何操作系统的工具栏等,即当您按下最大化按钮时窗口的大小。

【讨论】:

以上是关于你能在kivy中获得设备的物理尺寸吗?的主要内容,如果未能解决你的问题,请参考以下文章

44 像素的宽度是不是等同于所有设备的相同物理尺寸?

获取磁盘设备的物理设备对象名称

移动设备的尺寸

是否有可能使设备尺寸颤动?

你能获得Apple Watch的大概电池百分比吗?

带有flutter项目的Nodejs在物理设备上运行