Проблема выравнивания текста кнопки Киви

Я пытаюсь разработать приложение электронной почты в Kivy, в основном так же, как упражнение, чтобы узнать, в и из рамки... Я пытаюсь создать начальное окно и достигнут немного камнем преткновения! Идея состоит в том, что он просто отобразит список писем во входящей почте, как и любое основное приложение электронной почты на мобильном устройстве.

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, как получить текст каждого элемента списка (который является просто кнопкой), чтобы правильно выровнять. Использование "halign =" left "в моей кнопке приведет к выравниванию текста влево, но только по отношению к каждой кнопке; он по-прежнему сосредоточен в каждой кнопке.

Мое фактическое приложение немного больше, чем сообщение, так что это быстрый и грязный пример, который я сделал из примера Kivy. (Я понимаю, что этот код не идеален... как я сказал, быстро и грязно для примера... это действительно работает!) Итак, как вы можете видеть, две строки текста на каждой кнопке выравниваются с каждым другие, но они не все выравниваются в целом. Может ли кто-нибудь предложить, что бы я сделал, чтобы текст выравнивался, скажем, на 10 пикселей слева от каждой кнопки? Я нашел один относительный элемент звучания в StackOverflow, но на самом деле он не ответил на вопрос, это, казалось, больше касалось использования изображений на кнопках. Я новичок в Kivy, но я прочитал учебники и документацию, а также тщательно просмотрел Google - так что любая помощь будет принята с благодарностью!

import kivy
kivy.require('1.0.8')

from kivy.app import App
from kivy.core.window import Window
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView
from kivy.uix.gridlayout import GridLayout

import random


class ScrollViewApp(App):

    def build(self):
        # create a default grid layout with custom width/height
        layout = GridLayout(cols=1, spacing=10, size_hint=(None, None),
                            width=Window.width)

        # when we add children to the grid layout, its size doesn't change at
        # all. we need to ensure that the height will be the minimum required to
        # contain all the childs. (otherwise, we'll child outside the bounding
        # box of the childs)
        layout.bind(minimum_height=layout.setter('height'))

        # add button into that grid
        for i in range(30):
            btn = Button(text=str(i * random.random()) + '\n' + str(i * random.random()),
                         size=(300, 40),
                         size_hint=(None, None),
                         halign='left')
            layout.add_widget(btn)

        # create a scroll view, with a size < size of the grid
        root = ScrollView(size_hint=(None, None))
        root.size = (Window.width, Window.height)
        root.center = Window.center
        root.add_widget(layout)

        return root

if __name__ == '__main__':

    ScrollViewApp().run()

Ответ 1

Документация Button начинается с "A Button - это метка". Даже для Виджеты, которые явно не упоминают их родство, вы должны принять во внимание вторую строку в API doc рассматриваемого виджета. В этом случае "Основы: kivy.uix.label.Label".

Это устанавливает, что кнопка наследуется от метки. (Я прямо упоминаю об этом, потому что эта часть взгляда на базовые классы, унаследованные свойства иногда не интуитивна для всех).

Если вы посмотрите на Docs для метки, в частности свойство halign, оно попросит вас использовать text_size для достижения правильного выравнивания текста. Это означает, что текст выровнен внутри ограничивающего прямоугольника, который устанавливается text_size. Это свойство может быть установлено как:

a) Размер виджета.

b) Меньше, чем размер размера виджета (что вы ищете)

c) Без ограничений на одной из сторон

d) или оба

e) или ограничено другим виджетами

Вот пример всех вышеперечисленных возможностей.

Сделано с использованием каталога Kivy Демо в примерах http://wstaw.org/m/2013/03/11/plasma-desktopsL1945.png

Причиной использования text_size является предоставление пользователю большего контроля. Вы также можете посмотреть текстовый пример

Ответ 2

Вам нужно установить свойство text_size, например:

btn.text_size = (290, 40)

Ответ 3

Если вы хотите избежать чисел в text.size, попробуйте это:

text_size: self.size