你能在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中获得设备的物理尺寸吗?的主要内容,如果未能解决你的问题,请参考以下文章