14

私はKivyでメールアプリケーションを開発しようとしています。基本的には、フレームワークのインとアウトを学ぶための演習と同じです...最初のウィンドウを作成しようとしていますが、少しつまずきました。アイデアは、モバイルデバイス上の基本的なメールアプリと同じように、受信トレイにメールのリストを表示するだけであるということです。

私が抱えている問題は、各リスト項目のテキスト(単なるボタン)を正しく整列させる方法がわからないことです。ボタンで「halign='left'」を使用すると、テキストは左揃えになりますが、各ボタンに対してのみ相対的です。それでも各ボタンの中央に配置されます。

私の実際のアプリは投稿するのに少し大きいので、これは私がストックのKivyの例から作成した簡単で汚い例です。(このコードは完璧ではないことに気づきました...例のためにすばやく汚いと言ったように...それでも機能します!)ご覧のとおり、各ボタンの2行のテキストは互いに整列していますがそれらはすべて全体的に整列しているわけではありません。すべてのテキストを各ボタンの左から10pxに揃えるために、私が何をするかを誰かが提案できますか?StackOverflowで相対的なサウンドのアイテムを1つ見つけましたが、実際には質問に答えられませんでした。たとえば、ボタンの画像を使用する方が扱いやすいようでした。私は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()
4

4 に答える 4

27

Buttonのドキュメントは、「ボタンはラベルです」で始まります。系統を明示的に言及していないウィジェットの場合でも、問題のウィジェットのAPIドキュメントの2行目に注意する必要があります。この場合、「ベース:kivy.uix.label.Label」。

これにより、ボタンがラベルから継承されることが確立されます。(基本クラスの継承されたプロパティを確認するこの部分は、すべての人にとって直感的ではない場合があるため、これについて明示的に言及しています)。

ラベルのドキュメント、特にhalignプロパティを見ると、text_size適切なテキストの配置を実現するために利用するように求められます。text_sizeこれが意味するのは、テキストがプロパティによって設定されたバウンディングボックス内に配置されるということです。このプロパティは次のように設定できます。

a)ウィジェットのサイズ。text_size: self.size

b)ウィジェットのサイズ(探しているもの)のサイズよりも小さいtext_size: self.width - dp(10), self.height - dp(10)

c)片側に制約がないtext_size: self.width, None

d)または両方text_size: None, None

e)または別のウィジェットに制約text_size: other_button.size

を使用する理由はtext_size、ユーザーにより多くの制御を与えるためです。textalignの例も確認する必要があります

于 2013-03-11T14:21:08.140 に答える
7

text_size次のようなプロパティを設定する必要があります。

btn.text_size = (290, 40)
于 2013-03-11T08:54:07.820 に答える
3

の数字を避けたい場合はtext.size、次のことを試してください。

text_size: self.size

于 2017-07-04T21:03:43.410 に答える
3

qua-nonで説明されているように、ボタンはラベルであるため、それを実現する方法についてラベルのプロパティを確認できます。私はこれについてあまり見ていなかったので、他のプログラマーを助けることができる小さなコードを追加したいと思います。
ラベル付きのボタンを作成し、内部のテキストを調整する方法を紹介します。

#disable multi-touch emulation
from kivy.config import Config
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.image import Image   
#--------------------------------------------------------------------
Builder.load_string("""
<RootWidget>:
  BoxLayout:
    orientation: 'vertical'
    padding: "10dp"

    BoxLayout:
      size_hint_y: 3
      Widget: # to fill the line from left

      Button:
        text: "Button"
        font_size: 40
        text_size: self.size     
        halign: 'center'
        valign: 'bottom'
        padding_y: 10

        #Adding Image you can comment this part    
        Image:
          source: 'img/calender1.png'
          center_x: self.parent.center_x
          center_y: self.parent.center_y +10

      Widget:# to fill the line from right

    BoxLayout:
      size_hint_y: 10    

""")
#-----------------------------------------------------------------------
class RootWidget(BoxLayout):
  pass

#-----------------------------------------------------------------------    
class MyApp(App):
    def build(self):
      return RootWidget()


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

主要部分はボタンに入ります。フォント、配置、パディングを試して、希望する結果を得ることができます。

Button:
    text: "Button"
    font_size: 40
    text_size: self.size     
    halign: 'center'
    valign: 'bottom'
    padding_y: 10
于 2018-05-22T06:38:26.747 に答える