Python 我正在尝试将kivy弹出窗口中的一个按钮绑定到弹出窗口。关闭函数并不断得到一个错误

Python 我正在尝试将kivy弹出窗口中的一个按钮绑定到弹出窗口。关闭函数并不断得到一个错误,python,kivy,kivy-language,Python,Kivy,Kivy Language,我正在尝试将popup.dismise()函数绑定到Kivy弹出窗口中BoxLayout内的按钮 我不断听到一个错误,说: “无类型”对象没有属性“绑定” 我已经找了两天的答案,似乎找不到我要找的。任何帮助都将不胜感激 另外,如果你对我的代码有任何提示,我将不胜感激,因为我是一个新手,我相信有很多错误 我没有添加.kv代码,因为我认为它不适用于我目前遇到的问题 代码段: import kivy kivy.require('1.9.1') from kivy.app import App fro

我正在尝试将
popup.dismise()
函数绑定到Kivy弹出窗口中
BoxLayout
内的按钮

我不断听到一个错误,说:

“无类型”对象没有属性“绑定”

我已经找了两天的答案,似乎找不到我要找的。任何帮助都将不胜感激

另外,如果你对我的代码有任何提示,我将不胜感激,因为我是一个新手,我相信有很多错误

我没有添加.kv代码,因为我认为它不适用于我目前遇到的问题

代码段:

import kivy
kivy.require('1.9.1')

from kivy.app import App
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from KivyCalendar import CalendarWidget
from KivyCalendar import DatePicker
from kivy.properties import ObjectProperty, OptionProperty
from kivy.uix.listview import ListItemButton
from kivy.uix.modalview import ModalView
from kivy.uix.popup import Popup
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput

import sqlite3
import datetime


class LogSheet(TabbedPanel):

    def __init__(self, **kwargs):
        super(LogSheet, self).__init__(**kwargs)
        #self.register_event_type('popup_1')
        sq = sqlite3
        wd = Widget
        md = ModalView
        lb = Label
        op = OptionProperty
        bt = Button


    def popup_1(self):
            box = BoxLayout(orientation = 'vertical', padding = (10))
            box.add_widget(Label(text = "Are you sure you want to save data? \n Once saved cannot re-edit!!!!"))
            btn1 = box.add_widget(Button(text = "YES TO SAVE"))
            btn2 = box.add_widget(Button(text = "NO TO GO BACK"))

            btn1.bind(on_press = popup.dismiss)
            btn2.bind(on_press = hypochlorinator_1)

            popup = Popup(title='Check if Correct', title_size= (30), 
                          title_align = 'center', content = box,
                          size_hint=(None, None), size=(400, 400), auto_dismiss = True)
            popup.open() 

    def hypochlorinator_1(self):

        dd1 = self.date_data.text
        vd1 = self.volt_data.text
        ad1 = self.amp_data.text
        ld1 = self.load_data.text

        conn = sqlite3.connect('logsheet.db')
        c = conn.cursor()

        def create_table():
            c.execute('''CREATE TABLE IF NOT EXISTS logSheets(id INTEGER 
PRIMARY KEY,
            date DATETIME, volts REAL, amps REAL, setpoint REAL)''')


        def data_entry():

            c.execute('''INSERT INTO logSheets (date, volts, amps, setpoint) 
            VALUES (?, ?, ?, ?)''', (dd1, vd1, ad1, ld1))

            conn.commit()

        create_table()
        data_entry()
        c.close()
        conn.close()


class LogSheetApp(App):

    def build(self):
        return LogSheet()

lsApp = LogSheetApp()
lsApp.run()
错误消息:

File "C:\Users\Kids\Documents\Visual Studio 2015\Projects\KivyTuts2\logsheet.kv", line 294, in <module>
  on_press: root.popup_1()
File "C:\Users\Kids\Documents\Visual Studio 2015\Projects\KivyTuts2\logsheet.py", line 87, in popup_1
  btn1.bind(popup.dismiss)
AttributeError: 'NoneType' object has no attribute 'bind'
文件“C:\Users\Kids\Documents\Visual Studio 2015\Projects\KivyTuts2\logsheet.kv”,第294行,在
在\u上按:root.popup\u 1()
文件“C:\Users\Kids\Documents\Visual Studio 2015\Projects\KivyTuts2\logsheet.py”,第87行,在弹出窗口\u 1中
btn1.bind(弹出式关闭)
AttributeError:“非类型”对象没有属性“绑定”
您有:

btn1 = box.add_widget(Button(text = "YES TO SAVE"))
btn2 = box.add_widget(Button(text = "NO TO GO BACK"))
btn1
btn2
add\u widget
方法的返回,也就是说,它们是
None
。必须先实例化按钮,然后使用add_小部件方法:

btn1 = Button(text = "YES TO SAVE")
btn2 = Button(text = "NO TO GO BACK")
box.add_widget(btn1)
box.add_widget(btn2)
现在,
btn1
btn2
是按钮的实例,它们有
bind
方法

您还可以将on_press参数传递给构造函数:

box.add_widget(Button(text = "YES TO SAVE",  on_press=popup.dismiss))
box.add_widget(Button(text = "NO TO GO BACK",  on_press=self.hypochlorinator_1))
你的职责应该是:

def popup_1(self):
    box = BoxLayout(orientation = 'vertical', padding = (10))
    box.add_widget(Label(text = "Are you sure you want to save data? \n Once saved cannot re-edit!!!!"))
    btn1 = Button(text = "YES TO SAVE")
    btn2 = Button(text = "NO TO GO BACK")
    box.add_widget(btn1)
    box.add_widget(btn2)

    popup = Popup(title='Check if Correct', title_size= (30), 
                  title_align = 'center', content = box,
                  size_hint=(None, None), size=(400, 400),
                  auto_dismiss = True)

    btn1.bind(on_press = popup.dismiss)
    btn2.bind(on_press = self.hypochlorinator_1)
    popup.open()
或:

输出:

编辑:
次氯酸盐发生器1
应接收额外参数:

def hypochlorinator_1(self, instance):

非常感谢。这正是我想要的。是的,需要添加实例。我仍在努力弄清楚这是怎么回事。此实例来自何处以及为什么需要它?@Aiden
bind
方法传递发出调用的对象。在这种情况下,它是
btn2
对象。如果您有一个由多个小部件使用的回调,这将非常有用。由于这一点,您可以确定是谁调用了该功能。谢谢你的解释。非常感谢。
def hypochlorinator_1(self, instance):