在Kivy中用togglebutton绑定函数

2024-10-01 17:36:10 发布

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

我是Python和Kivy新手,所以可能我的问题很简单,但我找不到解决方案。。请帮忙。在

我试图在for循环中创建几个togglebutton,但是在将每个togglebutton与另一个类的函数绑定时遇到了问题(通常在我的代码中是:on_state: root.on_state(self.state, self.text)

我试过用lambda函数来做这个。我没有错误,但当按下togglebutton(state=“down”)时,什么都不会发生。在

如果有人能告诉我问题出在哪里,我将非常感激。 谢谢!在

class MainScreen(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Window.size = (1400, 800)
        self.ingredients_sites = []
        self.count = 0

    def display_text(self, count):
        # displaying result in TextInput from ingredient_sites
        result = zielone_koktajle.result(self.ingredients_sites, count)
        if result:
            self.display.text = ", ".join(result)
        else:
            self.display.text = ""
            self.display.hint_text = "brak wspolnych stron.."

    def on_state(self, state, ingredient_name):
        if state == "down":
            # dd sites to the list "ingredient_sites" by extracting value of the key from dictionary
            self.ingredients_sites.extend(zielone_koktajle.get_ing_from_csv().get(ingredient_name))
            self.count += 1
            self.display_text(self.count)

        if state == "normal":
            for i in (zielone_koktajle.get_ing_from_csv().get(ingredient_name)):
                if i in self.ingredients_sites:
                    self.ingredients_sites.remove(i)
            self.count -= 1
            self.display_text(self.count)


class ToggleButtons(StackLayout):
    lista = ["aloes", "blonnik", "herbata biala", "herbata czerwona", "herbata zielona", "mleko kokosowe", "mleko migdalowe", "mleko owsiane", "mleko ryzowe", "mleko sojowe", "woda kokosowa"]
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.add_togglebuttons()

    def add_togglebuttons(self):
        for i in ToggleButtons.lista:
            tgbtn = ToggleButton(id = "togglebtn",
                                 text = i,
                                 size_hint = (.1, .30)
                                 )

            tgbtn.bind(on_state = lambda x: MainScreen.on_state(self, tgbtn.state, i))

            self.add_widget(tgbtn)


class ZieloneKoktajleApp(App):
     def build(self):
        self.title = "Zielone koktajle - index"
        return MainScreen()

以及我的KV文件的简短示例:

^{pr2}$

Tags: textinselfinitondefcountdisplay
1条回答
网友
1楼 · 发布于 2024-10-01 17:36:10

您可以将其绑定到.kv。
试试这个:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.stacklayout import StackLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.togglebutton import ToggleButton


Builder.load_string('''

<ToggleButton>:
    on_state: app.root.on_state(self)

<MainScreen>:

    BoxLayout:

        ToggleButtons:



''')

class MainScreen(BoxLayout):

    def on_state(self, togglebutton):
        tb = togglebutton
        print(tb,tb.state,tb.text)


class ToggleButtons(StackLayout):
    lista = ["aloes", "blonnik", "herbata biala", "herbata czerwona", "herbata zielona", "mleko kokosowe", "mleko migdalowe", "mleko owsiane", "mleko ryzowe", "mleko sojowe", "woda kokosowa"]

    def __init__(self,**kwargs):
        super(ToggleButtons,self).__init__(**kwargs)
        for i in self.lista:
            tgbtn = ToggleButton(text = i,size_hint = (.1, .30))

            self.add_widget(tgbtn)


class MyApp(App):
     def build(self):
        return MainScreen()


MyApp().run()

相关问题 更多 >

    热门问题