Найти - Пользователи
Полная версия: Select from sqlite to tkinter text widget row by row
Начало » Python для новичков » Select from sqlite to tkinter text widget row by row
1
quantum_85
Доброго времени. Без длинных предисловий, я полный нюб не судите строго.

Вопрос в следующем, есть таблица в 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, который заккоментирован, то все красиво, каждая запись в новой строке…

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

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])
quantum_85
Ругнулось на несоотв. типов данных:
    t.insert(END, "\n".join(rows))
TypeError: sequence item 0: expected string, tuple found
4kpt_III
Пропринтуйте rows и все будет понятно
quantum_85
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? Или можно как то поизяшней, в общем, может кто вектор укажет? Не обязательно дебажить именно мой недокод).
Спасибо!
4kpt_III
quantum_85
Помогу. Когда увижу результат команды

print(rows)
quantum_85
4kpt_III
quantum_85Помогу. Когда увижу результат команды
это кортеж в юникоде:
(u'print column', u'awk {print $1}', u'awk')
4kpt_III
А обманывать не хорошо
Если бы в 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)))
quantum_85
Уважаемый 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

Еще раз спасибо!
Всем добра!
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