繁体   English   中英

Kivy 动态创建按钮并访问它们

[英]Kivy Creating Buttons Dynamically and Accessing them

所以我一直在尝试编写一个 kivy 程序,它首先使用另一个 py 文件从文件中读取拉丁句子,然后为每个句子动态创建按钮,当单击其中一个按钮时,它应该会自行删除。 我成功地尝试动态创建按钮,但我无法让它们自行删除。 问题是如果我创建一个 Object 属性,在 kv 文件中声明它并将其与 id 绑定,我可以为 on_release 分配一个 function。 但我希望这自动发生,如果我有 15 句话,我不想在 kv 文件中声明 Objectproperty 15 次。 我尝试创建一个列表,然后在其中创建多个句子项目,并将这些项目设为对象属性。 但是在 kv 文件中声明它时出现错误。 这是我的代码:

 import kivy from Nils_Programm_verkürzt import lektionstextlesen from kivy.app import App from kivy.uix.label import Label, Widget from kivy.uix.button import Button from kivy.properties import ( NumericProperty, ReferenceListProperty, ObjectProperty, StringProperty, ListProperty ) from kivy.lang import Builder ################## #INPUT FILE: Inputfile = 'Lektionstext15.txt' ReturnTuple = [] ReturnTuple = lektionstextlesen(Inputfile) Satzliste = ReturnTuple[0] Worterliste = ReturnTuple[1] kv = """ #:import Button kivy.uix.button.Button <Testwidget>: canvas: Rectangle: pos: 0, self.center_y size: self.width, 10 Rectangle: pos: self.pos size: self.size source: 'background.png'""" add = """ Buttons: Buttons Button: id: Buttons[{index}] text: str(root.Satzliste[{index}]) center_x: root.width / 2 top: root.top - 100 - {num} font_size: 30 size: self.texture_size on_release: root.callback({index}) """ #addf = add.format(num=0) for i in range(len(Satzliste)): addf = add.format(index = i, num=(i*50)) kv = f"{kv}{addf}" #kv = f"{kv}{addf}" #print(kv) Builder.load_string(kv) class Testwidget(Widget): Satzliste = StringProperty() Worterliste = StringProperty() ReturnTuple = [] ReturnTuple = lektionstextlesen(Inputfile) Satzliste = ReturnTuple[0] Worterliste = ReturnTuple[1] Buttons = [] for i in range(len(Satzliste)): Buttons.append(ObjectProperty(None)) def callback(self, m): self.remove_widget(self.Buttons[m]) pass class GuiApp(App): def build(self): return Testwidget() if __name__ == '__main__': GuiApp().run()

我没有完全理解你想要做什么,但我不太喜欢你创建按钮的方式; 这也是可能的,但我最好为存储它们的 object 按钮和主 window 创建自定义 class。

像这样:

 from kivy.app import App from kivy.uix.gridlayout import GridLayout from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button from kivy.properties import ( NumericProperty, ReferenceListProperty, ObjectProperty, StringProperty, ListProperty ) from kivy.lang import Builder kv = """ #:import hex kivy.utils.get_color_from_hex <CustomButton>: size_hint_x: 0.8 size_hint_y: 0.2 text: root.name center_x: root.width / 2 font_size: 30 on_release: root.callback(self,self.parent) <Testwidget>: id: object_for_scroll size_hint_y: 2 cols: 1 <Main>: canvas: Color: rgba: hex('#777576') Rectangle: pos: self.pos size: self.size size_hint: 1,1 ScrollView: id: buttons_layout size_hint_x: 0.9 size_hint_y: 0.82 pos_hint: {'center_x': 0.5, 'center_y': 0.5} """ class Main(BoxLayout): def __init__(self, **kwargs): super().__init__(**kwargs) self.buttons_pool = Testwidget() #INPUT FILE: # here you can read information from a file and create buttons with specific names text = "name\n"*20 # you can go for taple or list its dosnt mater for index,but_text in enumerate(text.split("\n")): but = CustomButton() # create obj and set his parameters of text ( also you can set any parameter ) setattr(but, "name", but_text+str(index)) # index is name for example, you can put any one # add into the pool setattr(self.buttons_pool,"size_hint_y", index//5+1) self.buttons_pool.add_widget(but) self.ids.buttons_layout.add_widget(self.buttons_pool) class CustomButton(Button): name = StringProperty() def callback(self, widget,pool): pool.remove_widget(widget) class Testwidget(GridLayout): pass class GuiApp(App): def build(self): Builder.load_string(kv) return Main() if __name__ == '__main__': GuiApp().run()

我展示了一个示例,说明如何在创建 class 时删除按钮,大小、小部件的放置方式和位置以及它们的位置无关紧要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM