弹出窗口中的Kivy按钮在调用方法时无法传递变量

2024-09-28 22:03:19 发布

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

这是一个弹出窗口:

class TestScreen (Screen)
    def openpopup(self)
        popup = Popup()
        button = Button(on_press=self.method("1"))
        popup.add_widget(button)
        popup.open()

     def method(self, number)
        self.label.text = number

当弹出窗口被调用时(通过一个按钮),它给我一个错误:" AssertionError: None is not callable ",并且它只在我从self.method中删除{}时才起作用。但是我想从弹出窗口传递一个变量,那我该怎么做呢?在


Tags: selfaddnumberondefbuttonscreenmethod
2条回答

尝试以下解决方案:

class TestScreen (Screen)
    def openpopup(self)
        popup = Popup()
        self.button = Button(on_press=self.method, text='1')
        popup.add_widget(button)
        popup.open()

    def method(self)
        self.label.text = self.button.text

建议使用以下方法之一。详情请参考示例。在

片段

Lambda函数

button = Button(text="Update Label's text", on_press=lambda number: self.method(number=1))

或者

偏函数

^{pr2}$

示例-使用Lambda函数

在主.py在

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty


class ScreenManagement(ScreenManager):
    pass


class TestScreen(Screen):
    label = ObjectProperty(None)

    def openpopup(self):
        content = BoxLayout(orientation="vertical")
        self.popup = Popup(title="Popup", size_hint=(None, None),
                           size=(400, 400), auto_dismiss=False, content=content)
        button = Button(text="Update Label's text", on_press=lambda x: self.method(x=1))
        close_btn = Button(text="Close", on_press=self.popup.dismiss)
        content.add_widget(button)
        content.add_widget(close_btn)
        self.popup.open()

    def method(self, number):
        self.label.text = str(number)


class TestApp(App):
    title = "Kivy Passing Arguments to Method - Using Lambda"

    def build(self):
        return ScreenManagement()


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

在试验电压在

#:kivy 1.10.0

<ScreenManagement>:
    TestScreen:
        name: "testscreen"

<TestScreen>:
    label: label
    BoxLayout:
        orientation: "vertical"
        Button:
            size_hint: 1, 0.2
            text: "Show Popup"
            on_release: root.openpopup()
        Label:
            id: label
            text: "Test Screen"

输出-使用Lambda函数

enter image description hereenter image description hereenter image description here

示例-使用部分函数

在主.py在

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from functools import partial


class ScreenManagement(ScreenManager):
    pass


class TestScreen (Screen):
    label = ObjectProperty(None)

    def openpopup(self):
        content = BoxLayout(orientation="vertical")
        self.popup = Popup(title="Popup", size_hint=(None, None),
                           size=(400, 400), auto_dismiss=False, content=content)
        button = Button(text="Update Label's text", on_press=partial(self.method, number=1))
        close_btn = Button(text="Close", on_press=self.popup.dismiss)
        content.add_widget(button)
        content.add_widget(close_btn)
        self.popup.open()

    def method(self, *args, number):
        self.label.text = str(number)


class TestApp(App):
    title = "Kivy Passing Arguments to Method - Using Partial"

    def build(self):
        return ScreenManagement()


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

输出-使用部分函数

enter image description hereenter image description hereenter image description here

相关问题 更多 >