Найти - Пользователи
Полная версия: GTK - красивый вывод из БД
Начало » GUI » GTK - красивый вывод из БД
1 2
Enchantner
Знаю, что ужасно нубский вопрос, но как бы покрасивее сделать вывод из мускула? В смысле, каким виджетом? Хотелось бы что-нибудь в духе пусть и некошерного DBGrid из делфей… И да, я привык к glade, пора отучаться.
balu
Напиши класс/функцию, который пихает данные в таблицу или еще куда (например можно совместить с панелью см напр. http://img27.imageshack.us/img27/3010/kaawin.jpg). Скорми нужную таблицу классу или функции.
Не пользоваться дизайнером, кстати, решение вполне корректное, когда ты генерируешь гуи, как на рисунке выше. Во многих случаях дизайнер предпочтительней.
Enchantner
balu
А как создать виджет таблицы-то? Через pyCairo?
gmorgunov
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()
Enchantner
gmorgunov
Огромное спасибо! Супер! :)
diam123
balu
Напиши класс/функцию, который пихает данные в таблицу или еще куда (например можно совместить с панелью см напр. http://img27.imageshack.us/img27/3010/kaawin.jpg). Скорми нужную таблицу классу или функции.
Не пользоваться дизайнером, кстати, решение вполне корректное, когда ты генерируешь гуи, как на рисунке выше. Во многих случаях дизайнер предпочтительней.
А можно хоть одним глазком глянуть на исходники того что на скрине ?
balu
diam123
А можно хоть одним глазком глянуть на исходники того что на скрине
Низзя.
1) написано дохрена, хотя сам движок небольшой. Но на момент, когда он начинал писаться нормально работающего ГУИ для винды, кроме Tkinter и wxPython не было. Последний мне не понравился гораздо больше первого. Несмотря на то, что пришлось делать врапперы для тиклевских виджетов и прочая. А кросплатформенного нет и сейчас, кроме Tkinter.
2) Тот код мне не нравится: я только перешел с Делфи на Питон и лечение от делфийских привычек тогда даже не начиналолсь. У меня тогда родился ребенок и я спал максимум 4 часа в сутки примерно пол-года. А хорошего кода, когда я сонный, не напишу.
3) Сейчас ГУИ переписывается на Java. Впрочем, решения на питон останутся за счет жесткого отделения гуя и реализации.
Впрочем, если тебе надо врапперы для таблицы я без проблем их дам.
Хотя там сам движок не особо ценен - намного интересней сам “DSL” для гуйни. Показать? Он тоже, если и будет меняться, то уже какой-то тулзовиной.
PooH
balu
Хотя там сам движок не особо ценен - намного интересней сам “DSL” для гуйни. Показать?
Покажите, плиз. Интересен ваш синтаксис. Как раз сейчас пытаюсь сочинить нечто подобное, ищу любые идеи. Как то XUL и описания вьюшек из OpenERP не вдохновляют.
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'}),},
Такие вот примитивные шаблончики. Очень удобно держать в базе, обновляя код не выходя из программы. Если надо “простор для творчества” то прописывается в задачах и, по желанию, помещается на вкладку. Описание задач тоже похоже на описание диалогов.
В общих чертах - где-то так.
diam123
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'}),},
Такие вот примитивные шаблончики. Очень удобно держать в базе, обновляя код не выходя из программы. Если надо “простор для творчества” то прописывается в задачах и, по желанию, помещается на вкладку. Описание задач тоже похоже на описание диалогов.
В общих чертах - где-то так.
Спасибо огромное, мну до такого наверное еще рано пока что :(
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