在 python 端动态调整 kivy 标签(和按钮)的大小
问题描述
如何在运行时根据文本量动态调整标签或按钮的大小,尤其是 text_size 和 height?
How do I dynamically resize the a label or button, in particular, the text_size and height, depending on the amount of text, at run-time?
我知道这个问题已经以一种方式回答了这个问题:
I am aware that this question has already been answered in one way with this question:
动态调整滚动视图中标签的大小?
我在部分代码中反映了该示例.
And I reflect that example in part of my code.
问题是在运行时动态调整标签和按钮的大小.使用,例如:
The problem is dynamically resizing the labels and buttons at run-time. Using, for example:
btn = Button(text_size=(self.width, self.height), text='blah blah')
...等等,只会让程序认为(并且在逻辑上如此)self"指的是包含按钮的类.
...and so on, only makes the program think (and logically so) that the "self" is referring to the class which is containing the button.
那么,我如何在python语言中动态调整这些属性的大小,而不是kivy?
So, how do I dynamically resize these attributes in the python language, not kivy?
我的示例代码:
import kivy
kivy.require('1.7.2') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
i = range(20)
long_text = 'sometimes the search result could be rather long
sometimes the search result could be rather long
sometimes the search result could be rather long '
class ButtonILike(Button):
def get_text(self):
return long_text
class HomeScreen(Screen):
scroll_view = ObjectProperty(None)
def __init__(self, *args, **kwargs):
super(HomeScreen, self).__init__(*args, **kwargs)
layout1 = GridLayout(cols=1, spacing=0, size_hint=(1, None),
row_force_default=False, row_default_height=40)
layout1.bind(minimum_height=layout1.setter('height'),
minimum_width=layout1.setter('width'))
layout1.add_widget(ButtonILike())
for result in i:
btn1 = Button(font_name="data/fonts/DejaVuSans.ttf",
size_hint=(1, None), valign='middle',)#,
#height=self.texture_size[1], text_size=(self.width-10, None))
btn1.height = btn1.texture_size[1]
btn1.text_size = (btn1.width-20, layout1.row_default_height)
btn1.text = long_text
btn2 = Button(font_name="data/fonts/DejaVuSans.ttf",
size_hint=(1, None), valign='middle')
btn2.bind(text_size=(btn2.width-20, None))
btn2.text = 'or short'
layout1.add_widget(btn1)
layout1.add_widget(btn2)
scrollview1 = self.scroll_view
scrollview1.clear_widgets()
scrollview1.add_widget(layout1)
class mybuttonsApp(App):
def build(self):
return HomeScreen()
if __name__ == '__main__':
mybuttonsApp().run()
还有kv文件:
#:kivy 1.7.2
<ButtonILike>:
text_size: self.width-10, None
size_hint: (1, None)
height: self.texture_size[1]
text: root.get_text()
#on_release: root.RunSearchButton_pressed()
<HomeScreen>:
scroll_view: scrollviewID
AnchorLayout:
size_hint: 1, .1
pos_hint: {'x': 0, 'y': .9}
anchor_x: 'center'
anchor_y: 'center'
Label:
text: 'Button Tester'
ScrollView:
id: scrollviewID
orientation: 'vertical'
pos_hint: {'x': 0, 'y': 0}
size_hint: 1, .9
bar_width: '8dp'
您可以看到我从 kv 文件中添加了按钮,该按钮在列表顶部显示了我想要的所有行为.在运行时调整窗口大小,您可以看到它的神奇之处.当然,更改 text_size 也可以让我对齐文本.
You can see that I added the button from the kv file which displays all the behavior that I want at the top of the list. Resize your window while running it, and you can see the magic. And, of course, changing the text_size also makes it possible for me to align text.
我根本无法在 python 端实现相同的行为.我的应用程序要求在运行时创建按钮.我认为答案可能在于bind()",尽管不可否认,我不确定我在尝试中是否正确使用了它,或者我是否完全理解它.您可以看到我尝试使用btn2",我认为它会将文本扔到左侧(因为 halign 默认为左侧),但似乎没有做任何事情.
I simply have not been able to achieve the same behavior on the python side. My app requires that the buttons be created at run-time. I think the answer might lie with "bind()", though admittedly, I'm not sure I used it correctly in my attempts or that I understand it fully. You can see that I tried with "btn2", which I thought would've thrown the text to the left (since halign defaults to left), but didn't seem to do anything.
感谢您的帮助.
解决方案
我觉得最好的办法是把Label's/Button's size设置为texture_size
:
I think the best way is to set Label's/Button's size to texture_size
:
Label:
text: "test"
size_hint: None, None
size: self.texture_size
canvas.before: # for testing purposes
Color:
rgb: 0, 1, 0
Rectangle:
pos: self.pos
size: self.size
相关文章