Kivy弹出按钮内容不会显示在按钮中

2024-05-19 21:38:15 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码没有把第二个按钮的内容放在里面,内容在第一个按钮的位置,你能解释一下为什么吗? 结果应该是弹出两个按钮,每个按钮都有自己的内容,不是吗? 我做错了什么?你知道吗

from kivy.lang import Builder
from kivy.app import App
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.properties import ObjectProperty, ListProperty

Builder.load_string('''
<ListAvions>:
    box: box
    BoxLayout:
        id: box
        orientation: 'vertical'

<AvionToBuy>:
    boxlabel: boxlabel
    size_hint_y: None
    height: 300
    background_color: [1, 0, 1, .5]
    on_release: print(root.avion)
    BoxLayout:
        orientation: 'horizontal'
        Label:
            text: root.avion[0]
            size_hint: None, None
            size: 300, 300
        BoxLayout:
            orientation: 'vertical'
            id: boxlabel
            Label:
                text: root.avion[1]
                size_hint: None, None
            size: 420, 150
        Label:
            text: str(root.avion[2]) + "$"
            size_hint: None, None
            size: 420, 150
''')

AVIONS = [["P51.png", "P51", 750], ["F22.png", "F22", 1500]]

class ListAvions(Popup):
    box = ObjectProperty(None)

def add(self):
    for avion in range(len(AVIONS)):
        aviontobuybut = AvionToBuy()
        aviontobuybut.avion = AVIONS[avion]
        self.box.add_widget(aviontobuybut)

class AvionToBuy(Button):
    avion = ListProperty(AVIONS[0])

class AvionApp(App):
    def build(self):
    z = ListAvions()
    z.add()
    return z

if __name__=="__main__":
    AvionApp().run()

Tags: fromimportboxnone内容sizeroot按钮
2条回答

如果您只是将文本放入AvionToBuy小部件,只需使用Buttontext属性即可。您可以将kv文件中AvionToBuy的规则更改为:

<AvionToBuy>:
    text: root.avion[0] + ' ' + root.avion[1] + ' ' + str(root.avion[2]) + '$'
    background_color: [1, 0, 1, .5]
    on_release: print(root.avion)

这里是对原始代码的修改,使AvionToBuy扩展ButtonBehaviorBoxLayout。这允许您将任何小部件作为AvionToBuy的子部件,子部件将水平放置。我已经包括了你原来的Labels,并添加了一个Image。现在AvionToBuy的行为就像Button。我还添加了默认的Button主题。你知道吗

from kivy.lang import Builder
from kivy.app import App
from kivy.uix.behaviors.button import ButtonBehavior
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.properties import ObjectProperty, ListProperty

Builder.load_string('''
<ListAvions>:
    box: box
    BoxLayout:
        id: box
        orientation: 'vertical'
<AvionToBuy>:
    orientation: 'horizontal'
    padding: (50, 0)
    border: [16, 16, 16, 16]
    on_release: print(root.avion)
    bg_normal: 'atlas://data/images/defaulttheme/button'
    bg_down: 'atlas://data/images/defaulttheme/button_pressed'
    state_image: self.bg_normal if self.state == 'normal' else self.bg_down
    canvas:
        Color:
            rgba: (1, 1, 1, 1)
        BorderImage:
            border: self.border
            pos: self.pos
            size: self.size
            source: self.state_image
    Label:
        text: root.avion[0]
    Label:
        text: root.avion[1]
    Label:
        text: str(root.avion[2]) + '$'
    Image:
        source: 'data/images/defaultshape.png'
''')

AVIONS = [["P51.png", "P51", 750], ["F22.png", "F22", 1500]]

class ListAvions(Popup):
    box = ObjectProperty(None)

    def add(self):
        for avion in range(len(AVIONS)):
            aviontobuybut = AvionToBuy()
            aviontobuybut.avion = AVIONS[avion]
            self.box.add_widget(aviontobuybut)

class AvionToBuy(ButtonBehavior, BoxLayout):
    avion = ListProperty(AVIONS[0])


class AvionApp(App):
    def build(self):
        z = ListAvions()
        z.add()
        return z

if __name__=="__main__":
    AvionApp().run()

相关问题 更多 >