为什么回调函数不起作用,尽管我已经写了它

时间:2021-07-16 08:41:23

标签: debugging kivy kivy-language

我是 kivy 的新手,每次我尝试 self .button。 bind(),我试过一些 on_press = self。回调,但它不起作用。我什至尝试通过阅读 kivy 的文档来放置 on_click 状态。我也试图寻找类似错误的堆栈溢出,但我找不到任何有效的方法。这让我很痛苦。 这是我的代码

    '''

    from kivy.app import App
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.textinput import TextInput
    from kivy.uix.label import Label
    from kivy.uix.button import Button
    from kivy.uix.image import Image
    from kivy.uix.popup import Popup
    
    class Kivy_ui(GridLayout):
        def __init__(self,**kwargs):
            super().__init__(**kwargs)
            self.rows= 2 #defining the rows
            self.cols = 3 #defininig the columns
            self.image = Image(
                source = 'background.jpg'
                )
            self.add_widget(self.image)
            self.label = Label(
                text = 'Enter your name'
                )
            self.add_widget(self.label)
            self.text_input = TextInput(
                text =''
                )
                self.add_widget(self.text_input)
                self.button = Button(
                text = 'submit'
                )
    
            self.button.bind(on_click=self.callback) #everytime if button is clicked it moved to call back
            self.add_widget(self.button)
#for poppup menu like display

            self.popup = Popup(
            title='Pop_UP display',
            size= (300,400)#size of window,
            content = Label(
                text='')
            )
            def callback(self, elem):# this function help to callback evertime, submitted button is pressed
    
                self.popup.content.text = self.text_input.text
                self.popup.open()
    class demoap(App): #demo app
        def build(self):
            return Kivy_ui()
    if __name__ == '__main__':
        demoap().run()
    '''

and the output comes as

    '''
     Traceback (most recent call last):
       File "G:\project\game\kivy\kivy_ui.py", line 46, in <module>
         demoap().run()
       File "C:\Users\DELL\AppData\Local\Programs\Python\Python37\lib\site-packages\kivy\app.py", line 949, in run
         self._run_prepare()
       File "C:\Users\DELL\AppData\Local\Programs\Python\Python37\lib\site-packages\kivy\app.py", line 919, in _run_prepare
         root = self.build()
       File "G:\project\game\kivy\kivy_ui.py", line 44, in build
         return Kivy_ui()
       File "G:\project\game\kivy\kivy_ui.py", line 30, in __init__
         self.button.bind(on_click=self.callback)
     AttributeError: 'Kivy_ui' object has no attribute 'callback'
    
    '''

2 个答案:

答案 0 :(得分:0)

这是一个使用时钟的例子。

希望对您有所帮助。

祝你有美好的一天..

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivymd.app import MDApp
from kivy.clock import Clock
KV = '''
BoxLayout:
    Button:
        text: "hello world"
'''
class uiApp(MDApp):
    def build(self):
        print('IM Building here')
        self.callback_limit = 5 
        self.nbr_callback_made = 0
        self.screen = Builder.load_string(KV)
        self.event = Clock.schedule_interval(self.my_callback, 2)# 2 sec interval before it callback the method
    def my_callback(self, dt):
        if self.nbr_callback_made == self.callback_limit:
            self.event.cancel()
            return
        print('Inside callback',nbr_callback_made)
        self.nbr_callback_made += 1
uiApp().run()``` 

答案 1 :(得分:0)

您收到错误消息 'Kivy_ui' object has no attribute 'callback',因为您对 callback 的定义在 __init__() 方法中,这意味着没有 self.callback。只需取消缩进 callback 的整个定义,使其不属于 __init__()