2015-05-23 2 views
0

Я пытаюсь создать небольшую программу, которая сохраняет данные в базе данных sqlite. Дело в том, что я не могу вставить какие-либо данные, кроме пустых вставок. Я не знаю, что я делаю неправильно.Продолжайте получать пустые вставки в Python

Заранее благодарен! Вот мой код.

class Vista(Frame): 
    def __init__(self, master): 
     Frame.__init__(self,master) 
     self.grid() 
     self.pack() 
     self.create_widgets() 

    def insertar(self, n, v): 
     try: 
      cursor.execute('''INSERT INTO passwords (name, value) VALUES (?,?)''', (n.get(), v.get())) 
      con.commit() 
     except Exception as e: 
      # Roll back any change if something goes wrong 
      con.rollback() 
      print "Error %s;" %e.args[0] 
      sys.exit(1) 

     finally: 
      if con: 
       con.close() 

    def create_widgets(self): 
     self.title_nombre = Label(self, text="Nombre:") 
     self.title_nombre.grid(row = 1, column = 1, sticky = W, pady=(10, 0)) 
     nom = StringVar() 
     pas = StringVar() 
     self.nombre = Entry(self, textvariable=nom) 
     self.nombre.grid(row = 1, column = 2, sticky = W, pady=(10, 0)) 
     self.title_passwd = Label(self,text="Password:") 
     self.title_passwd.grid(row = 2, column = 1, sticky = W) 
     self.passwd = Entry(self, textvariable= pas) 
     self.passwd.grid(row = 2, column = 2, sticky = W) 
     self.boton = Button(text="Añadir", command=self.insertar(nom, pas)) 
     self.boton.grid(columnspan=1, row=3, sticky = W, pady=(10,0), padx=(5,0)) 

root = Tk() 
root.title("Contraseña") 
root.geometry("250x150") 

root.eval('tk::PlaceWindow %s center' % root.winfo_pathname(root.winfo_id())) 
app = Vista(root) 
app.grid(column=0, row=0) 
app.columnconfigure(0, weight=1) 
app.rowconfigure(0, weight=1) 

app.mainloop() 

ответ

4

Проблема с этой линии:

self.boton = Button(text="Añadir", command=self.insertar(nom, pas)) 

command=self.insertar(nom, pas) первые вызовы self.insertar(nom, pas), а затем передает command в результате этого вызова функции. Вы хотите передать функцию command:

def insert_command(): 
    return self.insertar(nom, pas) 

self.boton = Button(text="Añadir", command=insert_command) 

Или сделать это в одной строке:

self.boton = Button(text="Añadir", command=lambda: self.insertar(nom, pas)) 
+0

Спасибо, я не знал, как применить первый, но второй один работал просто отлично. Я не понимаю, почему это работает. – ffuentes

+0

@Francisco: Оба они должны работать нормально. Вторая - более короткая версия первой. – Blender

Смежные вопросы