Уведомления

Группа в Telegram: @pythonsu

#1 Май 11, 2009 17:42:35

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK - красивый вывод из БД

Знаю, что ужасно нубский вопрос, но как бы покрасивее сделать вывод из мускула? В смысле, каким виджетом? Хотелось бы что-нибудь в духе пусть и некошерного DBGrid из делфей… И да, я привык к glade, пора отучаться.



Офлайн

#2 Май 12, 2009 11:09:01

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK - красивый вывод из БД

Напиши класс/функцию, который пихает данные в таблицу или еще куда (например можно совместить с панелью см напр. http://img27.imageshack.us/img27/3010/kaawin.jpg). Скорми нужную таблицу классу или функции.
Не пользоваться дизайнером, кстати, решение вполне корректное, когда ты генерируешь гуи, как на рисунке выше. Во многих случаях дизайнер предпочтительней.



Офлайн

#3 Май 12, 2009 14:15:35

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK - красивый вывод из БД

balu
А как создать виджет таблицы-то? Через pyCairo?



Офлайн

#4 Май 12, 2009 18:50:42

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK - красивый вывод из БД

Enchantner
balu
А как создать виджет таблицы-то? Через pyCairo?
Можно TreeView/ListStore использовать, вот так например:
#!/usr/bin/env python
# coding: utf-8
import pygtk
pygtk.require('2.0')
import gtk

class MyTable:
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_title(u"Моя таблица")
self.window.connect("destroy", lambda w: gtk.main_quit())

# хранит данные в виде списка.
self.list_store = gtk.ListStore(str, str, int)
self.list_store.append([u'код1', u'имя1', 11])
self.list_store.append([u'код2', u'имя2', 22])
self.list_store.append([u'код3', u'имя3', 33])

# отображает данные, хранящиеся в list_store
self.tree_view = gtk.TreeView(model=self.list_store)

# добавляем колонки в tree_view
self.add_column(self.tree_view, u'Код', 0)
self.add_column(self.tree_view, u'Наименование', 1)
self.add_column(self.tree_view, u'Количество' , 2)

self.window.add(self.tree_view)
self.window.show_all()

def add_column(self, treeview, title, columnId, sortable=True):
column = gtk.TreeViewColumn(title, gtk.CellRendererText(), text=columnId )
column.set_resizable(True)
column.set_sort_column_id(columnId)
treeview.append_column(column)

if __name__ == "__main__":
mytable = MyTable()
gtk.main()



Офлайн

#5 Май 12, 2009 20:05:06

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK - красивый вывод из БД

gmorgunov
Огромное спасибо! Супер! :)



Офлайн

#6 Май 15, 2009 07:58:19

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK - красивый вывод из БД

balu
Напиши класс/функцию, который пихает данные в таблицу или еще куда (например можно совместить с панелью см напр. http://img27.imageshack.us/img27/3010/kaawin.jpg). Скорми нужную таблицу классу или функции.
Не пользоваться дизайнером, кстати, решение вполне корректное, когда ты генерируешь гуи, как на рисунке выше. Во многих случаях дизайнер предпочтительней.
А можно хоть одним глазком глянуть на исходники того что на скрине ?



Отредактировано (Май 15, 2009 07:58:47)

Офлайн

#7 Май 15, 2009 14:28:35

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK - красивый вывод из БД

diam123
А можно хоть одним глазком глянуть на исходники того что на скрине
Низзя.
1) написано дохрена, хотя сам движок небольшой. Но на момент, когда он начинал писаться нормально работающего ГУИ для винды, кроме Tkinter и wxPython не было. Последний мне не понравился гораздо больше первого. Несмотря на то, что пришлось делать врапперы для тиклевских виджетов и прочая. А кросплатформенного нет и сейчас, кроме Tkinter.
2) Тот код мне не нравится: я только перешел с Делфи на Питон и лечение от делфийских привычек тогда даже не начиналолсь. У меня тогда родился ребенок и я спал максимум 4 часа в сутки примерно пол-года. А хорошего кода, когда я сонный, не напишу.
3) Сейчас ГУИ переписывается на Java. Впрочем, решения на питон останутся за счет жесткого отделения гуя и реализации.
Впрочем, если тебе надо врапперы для таблицы я без проблем их дам.
Хотя там сам движок не особо ценен - намного интересней сам “DSL” для гуйни. Показать? Он тоже, если и будет меняться, то уже какой-то тулзовиной.



Отредактировано (Май 15, 2009 17:29:16)

Офлайн

#8 Май 18, 2009 06:04:40

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

GTK - красивый вывод из БД

balu
Хотя там сам движок не особо ценен - намного интересней сам “DSL” для гуйни. Показать?
Покажите, плиз. Интересен ваш синтаксис. Как раз сейчас пытаюсь сочинить нечто подобное, ищу любые идеи. Как то XUL и описания вьюшек из OpenERP не вдохновляют.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#9 Май 18, 2009 12:27:23

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK - красивый вывод из БД

Код для того, что ихображено на вкладке:

    {"tblTMPDEPPRECEIPT": { # Имя шаблона
'ResTitle': 'Расход на склад ГП', #То, что пишется на вкладке
'Table' : 'TMPDEPPRECEIPT', #Наименование таблицы из СУБД
'Fields': {'NDoc': ('N док-та', 3, 'inG', 'inP', 'SK'), #Описание полей из запроса. Формат ниже:
'Stamp': ('Дата', 11, 'inG', 'inP', 'SK'), #'Поле': ('Наименование поля', длина, 'Показывать в таблице', 'И на панели', 'Сортировать или нет'),
'SSum': ('Сумма', 7, 'inG', 'inP', 'SK'),
'Quantity': ('Кол-во', 5, 'inG', 'inP', 'nS'),
'LastName': ('OTK', 8, 'inG', 'inP', 'SK'),
'Sdal': ('Сдал', 8, 'inG', 'inP', 'SK'),
'Memo': ('Примечание', 15, 'noG', 'inP', 'SK'),
'TMPSTOREHOUSE': ('Пр.Скл.', 2, 'inG', 'inP', 'SK'),
'Pname': ('Изделие', 16, 'inG', 'inP', 'nS'),
'CtCode': ('ШВИ', 4, 'inG', 'inP', 'nS'),},
'FieldPosition':('NDoc', 'Stamp', 'SSum', 'Quantity', 'Sdal', 'LastName', 'Pname', 'CtCode', 'Memo', 'TMPSTOREHOUSE'), #Порядок полей. Используется потому, что словари не держат порядка ввода, однако оказался очень полезен для контроля видимости их в рантайме
'Query':'''select pr.* from v_deppreceipt pr
join tmpdeppreceipt d on d.id=pr.id
order by pr.stamp desc, pr.ndoc desc''', Собственно запрос
'FilterForm':'fltDepPreceipt', Форма для фильтра
'ChildLink': ('resDBDepPreceipt', 'IDTMPDEPPRECEIPT',) #Описание шаблона для связанной конструкции (реализация Master-Detail), которая ниже по вложенности. Текущая конструкция вызывается подобным образом.
}},
{'Tasks': ('tskMoveDepPreceipt', 'tskPrintTmpStorehouse', 'tskSeveralInvoices',)} #Перечень задач. Задачи это все то, что невписывается в забивку данных, для которых предназначена таблица.
]
#Описание диалога редактирования и фильтрации.:
'tblTMPDEPPRECEIPT':
{'NDoc' : ('edit', 'N док-та'), #поле ввода. Вводимые данные контролируются типом поля
'Stamp' : ('date', 'Дата'), #поле ввода даты (календарик)
'OTK' : ('combo', 'tblMWorkers1', 'ОТК'), #Поле для ввода данных из списка, видно на рисунке. 'tblMWorkers1' - таблица, с фамилиями, которую видно на рисунке. Ее описание, похоже на шаблон выше
'ENTEREDBY' : ('combo', 'tblMWorkers', 'Сдал'),
'TMPSTOREHOUSE' : ('checkbutton', 'Промежуточный склад'), #Есть еще радиобуттон и группа чекбоксов
'Memo' : ('edit', 'Примечание'),
'FieldPosition':('OTK', 'NDoc','Stamp', 'ENTEREDBY', 'TMPSTOREHOUSE', 'Memo'),
'$Actions$':({'Распечатать накладную':'cmPintInvoiceFP'}, #Выполнение неких действий, кроме релактирования прямо на форме редактирования, реализуется командами типа 'cmCondirmRec'.
{'Подтвердить поступление на склад':'cmCondirmRec'}),},
Такие вот примитивные шаблончики. Очень удобно держать в базе, обновляя код не выходя из программы. Если надо “простор для творчества” то прописывается в задачах и, по желанию, помещается на вкладку. Описание задач тоже похоже на описание диалогов.
В общих чертах - где-то так.



Отредактировано (Май 18, 2009 12:29:47)

Офлайн

#10 Май 18, 2009 12:38:32

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK - красивый вывод из БД

balu
Код для того, что ихображено на вкладке:
    {"tblTMPDEPPRECEIPT": { # Имя шаблона
'ResTitle': 'Расход на склад ГП', #То, что пишется на вкладке
'Table' : 'TMPDEPPRECEIPT', #Наименование таблицы из СУБД
'Fields': {'NDoc': ('N док-та', 3, 'inG', 'inP', 'SK'), #Описание полей из запроса. Формат ниже:
'Stamp': ('Дата', 11, 'inG', 'inP', 'SK'), #'Поле': ('Наименование поля', длина, 'Показывать в таблице', 'И на панели', 'Сортировать или нет'),
'SSum': ('Сумма', 7, 'inG', 'inP', 'SK'),
'Quantity': ('Кол-во', 5, 'inG', 'inP', 'nS'),
'LastName': ('OTK', 8, 'inG', 'inP', 'SK'),
'Sdal': ('Сдал', 8, 'inG', 'inP', 'SK'),
'Memo': ('Примечание', 15, 'noG', 'inP', 'SK'),
'TMPSTOREHOUSE': ('Пр.Скл.', 2, 'inG', 'inP', 'SK'),
'Pname': ('Изделие', 16, 'inG', 'inP', 'nS'),
'CtCode': ('ШВИ', 4, 'inG', 'inP', 'nS'),},
'FieldPosition':('NDoc', 'Stamp', 'SSum', 'Quantity', 'Sdal', 'LastName', 'Pname', 'CtCode', 'Memo', 'TMPSTOREHOUSE'), #Порядок полей. Используется потому, что словари не держат порядка ввода, однако оказался очень полезен для контроля видимости их в рантайме
'Query':'''select pr.* from v_deppreceipt pr
join tmpdeppreceipt d on d.id=pr.id
order by pr.stamp desc, pr.ndoc desc''', Собственно запрос
'FilterForm':'fltDepPreceipt', Форма для фильтра
'ChildLink': ('resDBDepPreceipt', 'IDTMPDEPPRECEIPT',) #Описание шаблона для связанной конструкции (реализация Master-Detail), которая ниже по вложенности. Текущая конструкция вызывается подобным образом.
}},
{'Tasks': ('tskMoveDepPreceipt', 'tskPrintTmpStorehouse', 'tskSeveralInvoices',)} #Перечень задач. Задачи это все то, что невписывается в забивку данных, для которых предназначена таблица.
]
#Описание диалога редактирования и фильтрации.:
'tblTMPDEPPRECEIPT':
{'NDoc' : ('edit', 'N док-та'), #поле ввода. Вводимые данные контролируются типом поля
'Stamp' : ('date', 'Дата'), #поле ввода даты (календарик)
'OTK' : ('combo', 'tblMWorkers1', 'ОТК'), #Поле для ввода данных из списка, видно на рисунке. 'tblMWorkers1' - таблица, с фамилиями, которую видно на рисунке. Ее описание, похоже на шаблон выше
'ENTEREDBY' : ('combo', 'tblMWorkers', 'Сдал'),
'TMPSTOREHOUSE' : ('checkbutton', 'Промежуточный склад'), #Есть еще радиобуттон и группа чекбоксов
'Memo' : ('edit', 'Примечание'),
'FieldPosition':('OTK', 'NDoc','Stamp', 'ENTEREDBY', 'TMPSTOREHOUSE', 'Memo'),
'$Actions$':({'Распечатать накладную':'cmPintInvoiceFP'}, #Выполнение неких действий, кроме релактирования прямо на форме редактирования, реализуется командами типа 'cmCondirmRec'.
{'Подтвердить поступление на склад':'cmCondirmRec'}),},
Такие вот примитивные шаблончики. Очень удобно держать в базе, обновляя код не выходя из программы. Если надо “простор для творчества” то прописывается в задачах и, по желанию, помещается на вкладку. Описание задач тоже похоже на описание диалогов.
В общих чертах - где-то так.
Спасибо огромное, мну до такого наверное еще рано пока что :(



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version