Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 6, 2016 13:16:34

quantum_85
Зарегистрирован: 2016-01-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Select from sqlite to tkinter text widget row by row

Доброго времени. Без длинных предисловий, я полный нюб не судите строго.

Вопрос в следующем, есть таблица в sqlite3, пытаюсь получить из неё выборку в Tkinter Text widget. Выборку получаю, но в одну строку, вместо:
ROW1
ROW2
ROW3
получаю ROW1ROW2ROW3
вот код:

#!/usr/bin/env python
from Tkinter import *
import sqlite3
conn = sqlite3.connect('test.db')
cs = conn.cursor()
rows = cs.execute('SELECT COMMENT,COMMAND,TAG FROM history')
root = Tk()
t = Text(root)
t.pack()
for row in rows:
     t.insert(END, row[0])
     t.insert(END, row[1])
     t.insert(END, row[2])
    #print row[0]
    #print row[1]
    #print row[2]
root.mainloop()
Причем, если использовать, в качестве теста, print, который заккоментирован, то все красиво, каждая запись в новой строке…

Подскажите, пожалуйста, что я делаю не так?
Буду очень спасибо!

Офлайн

#2 Янв. 6, 2016 13:47:52

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Select from sqlite to tkinter text widget row by row

А если попробовать так?

t.insert(END, "\n".join(rows))

Вместо

for row in rows:
     t.insert(END, row[0])
     t.insert(END, row[1])
     t.insert(END, row[2])

Отредактировано 4kpt_III (Янв. 6, 2016 14:00:56)

Офлайн

#3 Янв. 6, 2016 14:15:30

quantum_85
Зарегистрирован: 2016-01-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Select from sqlite to tkinter text widget row by row

Ругнулось на несоотв. типов данных:

    t.insert(END, "\n".join(rows))
TypeError: sequence item 0: expected string, tuple found

Офлайн

#4 Янв. 6, 2016 18:50:02

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Select from sqlite to tkinter text widget row by row

Пропринтуйте rows и все будет понятно

Офлайн

#5 Янв. 7, 2016 12:46:37

quantum_85
Зарегистрирован: 2016-01-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Select from sqlite to tkinter text widget row by row

4kpt_III
Пропринтуйте rows и все будет понятно
С Рождеством господа!
4kpt_III, благодарю, пробую так:
while True:
        rows = cur.fetchone()
        if rows == None:
            break
        t.insert(END, rows[0])
        t.insert(END, rows[1])
        t.insert(END, rows[2])
Опять все в одну строку в виджете, НО если принтить, все красиво… не пойму как его победить…
Возможно, я изначально пошел не тем путем, может нужно считать количество записей в табице и перебирать все в цикле фор от 0 до n? Или можно как то поизяшней, в общем, может кто вектор укажет? Не обязательно дебажить именно мой недокод).
Спасибо!

Отредактировано quantum_85 (Янв. 7, 2016 12:49:57)

Офлайн

#6 Янв. 7, 2016 14:10:22

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Select from sqlite to tkinter text widget row by row

quantum_85
Помогу. Когда увижу результат команды

print(rows)

Офлайн

#7 Янв. 8, 2016 00:11:00

quantum_85
Зарегистрирован: 2016-01-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Select from sqlite to tkinter text widget row by row

4kpt_III
quantum_85Помогу. Когда увижу результат команды
это кортеж в юникоде:
(u'print column', u'awk {print $1}', u'awk')

Офлайн

#8 Янв. 8, 2016 00:50:16

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Select from sqlite to tkinter text widget row by row

А обманывать не хорошо
Если бы в rows были бы только строки, то строка

t.insert(END, "\n".join(rows))

Не вызвала бы ошибку.

Смотрите пример

rows = (u'print column', u'awk {print $1}', u'awk')
print(u"\n".join(rows))

Результат

print column
awk {print $1}
awk

А вот при вложенных наборах

rows = ((u'print column', u'awk {print $1}', u'awk'),)
print(u"\n".join(rows))

Имеем ожидаемый результат

Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: sequence item 0: expected str instance, tuple found

P.S. Я просил показать rows, а не row

P.P.S.

Попробуйте:

t.insert(END, u"\n".join(u" ".join(rows)))

Отредактировано 4kpt_III (Янв. 8, 2016 00:51:19)

Офлайн

#9 Янв. 8, 2016 09:53:38

quantum_85
Зарегистрирован: 2016-01-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Select from sqlite to tkinter text widget row by row

Уважаемый 4kpt_III, Спасибо что потратили свое время!
Я все же не вижу где у меня тут вложенность, вот полный вывод принт, в тестовой таблице только пара строк

cs.execute('SELECT COMMENT,COMMAND,TAG FROM history')
rows = cs.fetchall()
print(rows)
[(u'replace value', u'sed s|old|new|g', u'sed'), (u'print column', u'awk {print $1}', u'awk')]

Нагуглил на stackoverflow подобную ситуацию, с примером, вот что человек ответил:
To get the result you posted, you'll need to join each element in each tuple, and then join each tuple together:

Я попробовал воспользовался его советом:
cs.execute('SELECT COMMENT,COMMAND,TAG FROM history')
rows = cs.fetchall()
conv_to_string = ('\n'.join(''.join(elems) for elems in rows))
t.insert(END, conv_to_string)

И все вставилось как положенно! Теперь все красиво! ))

Но учитывая мою малограмотность , это получился брутфорс кода , т.к. до меня так и не дошло , почему print и widget.insert() работают по разному и я не смог комфортно работать с кортежем.

P.S. к слову , Ваш пример выдает ошибку:
    t.insert(END, u"\n".join(u" ".join(rows)))
TypeError: sequence item 0: expected string or Unicode, tuple found

Еще раз спасибо!
Всем добра!

Отредактировано quantum_85 (Янв. 8, 2016 09:57:41)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version