下面的代码没有把第二个按钮的内容放在里面,内容放在第一个按钮的位置,你能解释一下为什么吗?结果应该是弹出窗口中的两个按钮,每个按钮都有自己的内容,不是吗?我做错了什么?
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()
发布于 2018-12-12 04:18:50
下面是对原始代码的修改,使AvionToBuy
扩展了ButtonBehavior
和BoxLayout
。这允许您将任何小部件作为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()
发布于 2018-12-11 06:40:12
如果只是将文本放入AvionToBuy
小部件,只需使用Button
的text
属性即可。您可以在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)
https://stackoverflow.com/questions/53711523
复制相似问题