在python端动态调整kivy标签(和按钮)的大小 [英] Dynamically resizing a kivy label (and button) on the python side

查看:249
本文介绍了在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:

在Scrollview中动态调整标签的大小?

我在部分代码中反映了该示例.

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')

...等等,仅使程序认为(在逻辑上如此)自我"是指包含按钮的类.

...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/Button的大小设置为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

这篇关于在python端动态调整kivy标签(和按钮)的大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆