你能在Kivy中获取设备的物理尺寸吗?

15

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

我有文本标签,使用 16sp 字体大小。

在屏幕尺寸为 (1024, 552) 和 (2048, 1536) 的平板电脑上它运行得很好(分别对应宽高比为 1.855 和 1.333)。 enter image description here

在屏幕尺寸为 (1280, 720)(宽高比为 1.778)的电脑上它也能完美显示,但是在这种屏幕尺寸的手机上,字母被截断了 enter image description here

唯一的区别就是设备的物理尺寸。因此看起来,Kivy 文本并非根据像素而渲染,而是考虑了屏幕的物理尺寸。

有没有办法在 Kivy 中确定物理尺寸?从而使我能够相应地调整字体大小。如果我使用更小的字体大小(10sp),文本在手机上(小型设备)显示正确,但在较大的设备上看起来太小。


Pygame还是SDL2在手机上?可能与Pygame有关。 - Peter Badida
不使用PyGame。Kivy 1.9.1和sdl2。 - Psionman
你能发布你的代码吗? - inclement
6个回答

12

是的,你可以使用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不是设备的物理尺寸,而是实际窗口的尺寸。我也在寻找相同的... - Nikola Lukic
Window.size只会返回一个窗口的默认大小...除非你已经设置了大小,此时它将返回你所设置的大小。 - no-one

1

1
我最终做的是将窗口最大化以获得允许的最大非全屏大小,然后读取该大小。我实际上使用它来在屏幕上居中一个较小的窗口:
#-- 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

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

0
根据我的理解,您在多个设备上正确显示文本方面遇到了问题。我不认为您可以通过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是“纯粹的Python”吗? - Psionman
2
GTK是一个完全不同的工具包,我甚至认为它不支持Android。 - inclement

0

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

0

这里有另一种解决方案,当在Android或iOS上测试/运行时将应用程序设置为全屏,但在桌面上进行测试时使用合理的大小(602, 1024):

from kivy.utils import platform

class MyApp(App):
    def build(self):
        if(platform == 'android' | platform == 'ios'):
            Window.maximize()
        else:
            Window.size = (620, 1024)

        return kv

if __name__ == "__main__":
    MyApp().run()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接