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