Форум сайта python.su
Знаю, что ужасно нубский вопрос, но как бы покрасивее сделать вывод из мускула? В смысле, каким виджетом? Хотелось бы что-нибудь в духе пусть и некошерного DBGrid из делфей… И да, я привык к glade, пора отучаться.
Офлайн
Напиши класс/функцию, который пихает данные в таблицу или еще куда (например можно совместить с панелью см напр. http://img27.imageshack.us/img27/3010/kaawin.jpg). Скорми нужную таблицу классу или функции.
Не пользоваться дизайнером, кстати, решение вполне корректное, когда ты генерируешь гуи, как на рисунке выше. Во многих случаях дизайнер предпочтительней.
Офлайн
balu
А как создать виджет таблицы-то? Через pyCairo?
Офлайн
EnchantnerМожно TreeView/ListStore использовать, вот так например:
balu
А как создать виджет таблицы-то? Через pyCairo?
#!/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()
Офлайн
gmorgunov
Огромное спасибо! Супер! :)
Офлайн
baluА можно хоть одним глазком глянуть на исходники того что на скрине ?
Напиши класс/функцию, который пихает данные в таблицу или еще куда (например можно совместить с панелью см напр. http://img27.imageshack.us/img27/3010/kaawin.jpg). Скорми нужную таблицу классу или функции.
Не пользоваться дизайнером, кстати, решение вполне корректное, когда ты генерируешь гуи, как на рисунке выше. Во многих случаях дизайнер предпочтительней.
Отредактировано (Май 15, 2009 07:58:47)
Офлайн
diam123Низзя.
А можно хоть одним глазком глянуть на исходники того что на скрине
Отредактировано (Май 15, 2009 17:29:16)
Офлайн
baluПокажите, плиз. Интересен ваш синтаксис. Как раз сейчас пытаюсь сочинить нечто подобное, ищу любые идеи. Как то XUL и описания вьюшек из OpenERP не вдохновляют.
Хотя там сам движок не особо ценен - намного интересней сам “DSL” для гуйни. Показать?
Офлайн
Код для того, что ихображено на вкладке:
{"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)
Офлайн
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'}),},
В общих чертах - где-то так.
Офлайн