Уведомления

Группа в Telegram: @pythonsu

#1 Март 30, 2010 06:53:52

Cover Story
От:
Зарегистрирован: 2008-08-26
Сообщения: 192
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter: Как подружить Sqlite c Listbox

Всем доброго! Помогите разобраться с проблемой необходимо одновременно чтобы обрабатывались данные в 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, как это можно обойти?



Python 2.7.3
Pyside 1.1.2

Офлайн

#2 Март 30, 2010 08:12:08

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Tkinter: Как подружить Sqlite c Listbox

command=ins_item_end(cu, c)
Ну ну… у вас ins_item_end() возвращает функцию? Нет. А что принимает атрибут command?
В “Tkinter GUI reference for Python” это всё есть.



Офлайн

#3 Март 30, 2010 09:00:09

Cover Story
От:
Зарегистрирован: 2008-08-26
Сообщения: 192
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter: Как подружить Sqlite c Listbox

Griffon
Ну ну… у вас ins_item_end() возвращает функцию? Нет. А что принимает атрибут command?
Извините, не понял что Вы хотели этим сказать?



Python 2.7.3
Pyside 1.1.2

Офлайн

#4 Март 30, 2010 09:30:29

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Tkinter: Как подружить Sqlite c Listbox

Попробуйте так command=lambda cu, c: ins_item_end(cu, c).
Для того чтобы понять, надо попытаться ответить на вопросы.



Офлайн

#5 Март 30, 2010 12:20:05

Cover Story
От:
Зарегистрирован: 2008-08-26
Сообщения: 192
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter: Как подружить Sqlite c Listbox

При такой команде пишет:

TypeError: <lambda>() takes exactly 2 arguments (0 given)



Python 2.7.3
Pyside 1.1.2

Офлайн

#6 Март 30, 2010 12:42:06

Cover Story
От:
Зарегистрирован: 2008-08-26
Сообщения: 192
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter: Как подружить Sqlite c Listbox

Вот так вроде работает:

#-*- 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()
но код какой-то ужасный получается



Python 2.7.3
Pyside 1.1.2

Офлайн

#7 Март 30, 2010 12:43:40

Cover Story
От:
Зарегистрирован: 2008-08-26
Сообщения: 192
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter: Как подружить Sqlite c Listbox

Еще есть модуль functools, но в 2.5.4 он у меня не заработал.



Python 2.7.3
Pyside 1.1.2

Офлайн

#8 Март 30, 2010 12:56:18

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Tkinter: Как подружить Sqlite c Listbox

ой… lambda без аргументов надо. Вutton не шлёт аргументов.
command=lambda: ins_item_end(cu, c).
Пробуем. :)



Офлайн

#9 Март 30, 2010 13:20:03

Cover Story
От:
Зарегистрирован: 2008-08-26
Сообщения: 192
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter: Как подружить Sqlite c Listbox

Так я тоже пробовал, ошибка следующая

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.



Python 2.7.3
Pyside 1.1.2

Офлайн

#10 Март 30, 2010 13:31:39

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Tkinter: Как подружить Sqlite c Listbox

Тю… а что можно было ожидать, если перед запуском цикла окна вы закрываете БД?
Конечно же вы не сможете работать с закрытой базой.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version