Найти - Пользователи
Полная версия: Tkinter: Как подружить Sqlite c Listbox
Начало » GUI » Tkinter: Как подружить Sqlite c Listbox
1 2
Cover Story
Всем доброго! Помогите разобраться с проблемой необходимо одновременно чтобы обрабатывались данные в Sqlite и Listbox. Хотел начать со ввода данных но пока что-то не получается. В общем делаю так:
#-*- coding: utf-8 -*-
from Tkinter import *
import sqlite3
def ins_item_end(cu, c):
list_fuel.insert(END, ent_fuel.get())
print ent_fuel.get()
cu.execute("select count(*) from fuel")
for k in cu.fetchall():
for kk in k:
count_fuel = kk
if count_fuel <> 0:
cu.execute("select max(id) from fuel")
for m in cu.fetchall():
for mm in m:
max_fuel = mm
id_fuel = max_fuel + 1
else:
id_fuel = 0
fuel = ent_fuel.get()
cu.execute("insert into fuel VALUES(?, ?)", (id_fuel, fuel.decode("utf-8")))
print ent_fuel.get()
c.commit()

c = sqlite3.connect(database=r"gasnew.s3db")
cu = c.cursor()

root = Tk()
fuel_fr = Frame(root)
fuel_fr.pack()
lab_fuel = Label(fuel_fr, text=u"База данных по топливу")
lab_fuel.grid(row=0, column=0, columnspan=2)
list_fuel = Listbox(fuel_fr, width=20, height=6)
list_fuel.grid(row=1, column=0, columnspan=2)
ent_fuel = Entry(fuel_fr, width=20, bg="yellow")
ent_fuel.grid(row=2, column=0, columnspan=2)
ins_but_fuel = Button(fuel_fr, text=u"Вставить запись", command=ins_item_end(cu, c))
ins_but_fuel.grid(row=3, column=0)

c.close()
mainloop()
Как мне кажется проблема в аргументах ins_item_end(cu, c), когда их ставлю не работает Listbox, когда убираю не работает Sqlite, как это можно обойти?
Griffon
command=ins_item_end(cu, c)
Ну ну… у вас ins_item_end() возвращает функцию? Нет. А что принимает атрибут command?
В “Tkinter GUI reference for Python” это всё есть.
Cover Story
Griffon
Ну ну… у вас ins_item_end() возвращает функцию? Нет. А что принимает атрибут command?
Извините, не понял что Вы хотели этим сказать?
Griffon
Попробуйте так command=lambda cu, c: ins_item_end(cu, c).
Для того чтобы понять, надо попытаться ответить на вопросы.
Cover Story
При такой команде пишет:
TypeError: <lambda>() takes exactly 2 arguments (0 given)
Cover Story
Вот так вроде работает:
#-*- coding:utf-8 -*-
from Tkinter import *
from functools import partial
import sqlite3
def ins_item_end():
c = sqlite3.connect(database=r"gasnew.s3db")
cu = c.cursor()
list_fuel.insert(END, ent_fuel.get())
print ent_fuel.get()
cu.execute("select count(*) from fuel")
for k in cu.fetchall():
for kk in k:
count_fuel = kk
if count_fuel <> 0:
cu.execute("select max(id) from fuel")
for m in cu.fetchall():
for mm in m:
max_fuel = mm
id_fuel = max_fuel + 1
else:
id_fuel = 0
fuel = ent_fuel.get()
cu.execute("insert into fuel VALUES(?, ?)", (id_fuel, fuel))
c.commit()
c.close()

root = Tk()
fuel_fr = Frame(root)
fuel_fr.pack()
lab_fuel = Label(fuel_fr, text=u"База данных по топливу")
lab_fuel.grid(row=0, column=0, columnspan=2)
list_fuel = Listbox(fuel_fr, width=20, height=6)
list_fuel.grid(row=1, column=0, columnspan=2)
ent_fuel = Entry(fuel_fr, width=20, bg="yellow")
ent_fuel.grid(row=2, column=0, columnspan=2)
ins_but_fuel = Button(fuel_fr, text=u"Вставить запись", command = ins_item_end)
ins_but_fuel.grid(row=3, column=0)
c = sqlite3.connect(database=r"gasnew.s3db")
cu = c.cursor()

cu.execute('SELECT fuel FROM fuel')

for item in cu.fetchall():
list_fuel.insert(END, item[0])
c.close()

mainloop()
но код какой-то ужасный получается
Cover Story
Еще есть модуль functools, но в 2.5.4 он у меня не заработал.
Griffon
ой… lambda без аргументов надо. Вutton не шлёт аргументов.
command=lambda: ins_item_end(cu, c).
Пробуем. :)
Cover Story
Так я тоже пробовал, ошибка следующая
ins_but_fuel = Button(fuel_fr, text=u"Вставить запись", command=lambda: ins_item_end(cu, c))
File "C:/pyBOS/mapgas/newprog/forforum3.py", line 7, in ins_item_end
cu.execute("select count(*) from fuel")
ProgrammingError: Cannot operate on a closed database.
Griffon
Тю… а что можно было ожидать, если перед запуском цикла окна вы закрываете БД?
Конечно же вы не сможете работать с закрытой базой.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB