如何设置kivy字体大小或标签大小,使其适合所有手机设备屏幕? (通过均值拟合不会与边界,矩形甚至屏幕重叠)
我知道Kivy中的按钮和其他一些小部件有size_hint
。这个font_size
没有给出期望的结果。
此外,设置Window.size
可以解决问题,但使用它自动化将很困难。现在,关闭解决方案是在 cm 中设置并获取font_size
,并在 cm 中使用#plot the data
ggplot(data=transfer_data, aes(x=DATE_OF_TRANSFER, y=NUMBER_OF_TRANSFERS, colour = region)) + geom_point() + geom_smooth() + scale_colour_manual(values=c("green", "blue", "red", "orange"))
。
提前致谢。
答案 0 :(得分:2)
这实际上是一个有趣的问题。
通常,您将文本,字体,字体大小和区域限制为将文本(kivy标签中的text_size
)限制为渲染器,并从中获取某种大小的纹理。你想要的是知道标签的纹理大小以获得字体大小。我想这在理论上是可行的,但你需要在Kivy中手动完成所有计算。
我们可以做一些解决方法吗?我们可以使用一些非常大的并且缩放最终纹理来匹配给定的大小,而不是尝试计算字体大小。例如,使用Kivy的Image
小部件可以轻松完成定量保持的缩放。概念验证(Python 3):
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.image import Image
from kivy.uix.label import Label
class MyLabel(Image):
text = StringProperty('')
def on_text(self, *_):
# Just get large texture:
l = Label(text=self.text)
l.font_size = '1000dp' # something that'll give texture bigger than phone's screen size
l.texture_update()
# Set it to image, it'll be scaled to image size automatically:
self.texture = l.texture
class RootWidget(BoxLayout):
pass
class TestApp(App):
def build(self):
return MyLabel(text='Test test test')
if __name__ == '__main__':
TestApp().run()
远非理想,但有工作。
结果:
答案 1 :(得分:1)
要在调整窗口大小时缩放按钮或标签的字体,我使用 font_size 在 kv 文件中,将 self.width 除以某个数字:
Label:
size_hint: 1, 0.1
text: "Some label text"
font_size: self.width/20
答案 2 :(得分:0)
这是另一个仅使用普通Button(也可以是Label)的选项。我正在使用它来减小字体大小以适合固定大小的小部件。花了一段时间才知道,但是标签文本使用当前的font_size绘制在纹理“对象”上,因此,设置标签文本后,texture_size将显示该文本的宽度。如果它比所讨论的小部件宽,请减小尺寸并重试。您可以做相反的操作来增加font_size来填充父对象。这是一些工作代码的片段,希望足以理解要点:
# for long names, reduce font size until it fits in its widget
m=self.defaultTextHeightMultiplier
self.keypad.ids.nameButton.font_size=self.keypad.ids.nameButton.height*m
self.keypad.ids.nameButton.texture_update()
while m>0.3 and self.keypad.ids.nameButton.texture_size[0]>self.keypad.ids.nameButton.width:
m=m-0.05
self.keypad.ids.nameButton.font_size=self.keypad.ids.nameButton.height*m
self.keypad.ids.nameButton.texture_update()
或使其成为一个单独的功能:
def setTextToFit(self,widget,text):
widget.text=text
# for long names, reduce font size until it fits in its widget
m=self.defaultTextHeightMultiplier
widget.font_size=widget.height*m
widget.texture_update()
while m>0.3 and widget.texture_size[0]>widget.width:
m=m-0.05
widget.font_size=widget.height*m
widget.texture_update()
可以通过模拟do-while循环来缩短该代码;可以这样称呼它:
self.setTextToFit(self.keypad.ids.nameButton,theText)
答案 3 :(得分:0)
此外,使用Window.size,您可以计算Window的对角线,将其乘以自选因子(应在0到1之间),然后使用它自动更新标签的字体大小(click here to see another stack overflow article on how to automatically update your label)。