Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Tkinter, ttk: treeview_multicolumn: добавление/удаление строк [RSS Feed]

#1 Апрель 25, 2012 13:57:45

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Tkinter, ttk: treeview_multicolumn: добавление/удаление строк

Доброго всем времени суток!
есть следущий класс, сделанный по аналогии с treeview_multicolumn.py:

def sortby(tree, col, descending):
"""Sort tree contents when a column is clicked on."""
# grab values to sort
data = [(tree.set(child, col), child) for child in tree.get_children('')]

# reorder data
data.sort(reverse=descending)
for indx, item in enumerate(data):
tree.move(item[1], '', indx)

# switch the heading so that it will sort in the opposite direction
tree.heading(col,
command=lambda col=col: sortby(tree, col, int(not descending)))



class MyMulticolumn(Frame):
def __init__(self, master=None, mdata=(), height=10):
Frame.__init__(self, master)
self.pack({'padx':5, 'pady':5})
self.tree_columns=mdata[0]
self.tree_data=mdata[1]
self.createWidgets(height)
self._build_tree(self.tree_columns,self.tree_data)

def createWidgets(self, height):
# XXX Sounds like a good support class would be one for constructing
# a treeview with scrollbars.
self.tree = ttk.Treeview(self, columns=self.tree_columns, show="headings")
vsb = ttk.Scrollbar(self, orient="vertical", command=self.tree.yview)
hsb = ttk.Scrollbar(self, orient="horizontal", command=self.tree.xview)
self.tree.configure(height=height)
self.tree.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set)
self.tree.grid(column=0, row=0, sticky='nsew')
vsb.grid(column=1, row=0, sticky='ns')
hsb.grid(column=0, row=1, sticky='ew')

def _build_tree(self, tree_columns, tree_data):
for i in self.tree.get_children(): self.tree.delete(i)
for col in self.tree_columns:
self.tree.heading(col, text=col.title(),
command=lambda c=col: sortby(self.tree, c, 0))
# XXX tkFont.Font().measure expected args are incorrect according
# to the Tk docs
self.tree.column(col, width=(tkFont.Font().measure(col.title())))

for item in self.tree_data:
self.tree.insert('', 'end', values=item)

# adjust columns lenghts if necessary
for indx, val in enumerate(item):
ilen = int(tkFont.Font().measure(val)*0.8)
if self.tree.column(self.tree_columns[indx], width=None) < ilen:
self.tree.column(self.tree_columns[indx], width=ilen)

def _get_selected(self):
'''returns selected items'''
a=[]
for i in self.tree.selection(): a.append((self.tree.item(i)['values']))
return a

Проблема в том, что когда меняю данные в списке (добавляю/удаляю/корректирую) при вызове метода MyMulticolumn._build_tree(тежеСтолбцы, новыеДанные) перерисовка содержимого не происходит.
С чем это может быть связано?



Отредактировано Dr.Livsi (Апрель 25, 2012 13:58:38)

Офлайн

#2 Апрель 26, 2012 09:58:38

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Tkinter, ttk: treeview_multicolumn: добавление/удаление строк

Dr.Livsi
Доброго всем времени суток!
есть следущий класс, сделанный по аналогии с treeview_multicolumn.py:

def sortby(tree, col, descending):
"""Sort tree contents when a column is clicked on."""
# grab values to sort
data = [(tree.set(child, col), child) for child in tree.get_children('')]

# reorder data
data.sort(reverse=descending)
for indx, item in enumerate(data):
tree.move(item[1], '', indx)

# switch the heading so that it will sort in the opposite direction
tree.heading(col,
command=lambda col=col: sortby(tree, col, int(not descending)))



class MyMulticolumn(Frame):
def __init__(self, master=None, mdata=(), height=10):
Frame.__init__(self, master)
self.pack({'padx':5, 'pady':5})
self.tree_columns=mdata[0]
self.tree_data=mdata[1]
self.createWidgets(height)
self._build_tree(self.tree_columns,self.tree_data)

def createWidgets(self, height):
# XXX Sounds like a good support class would be one for constructing
# a treeview with scrollbars.
self.tree = ttk.Treeview(self, columns=self.tree_columns, show="headings")
vsb = ttk.Scrollbar(self, orient="vertical", command=self.tree.yview)
hsb = ttk.Scrollbar(self, orient="horizontal", command=self.tree.xview)
self.tree.configure(height=height)
self.tree.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set)
self.tree.grid(column=0, row=0, sticky='nsew')
vsb.grid(column=1, row=0, sticky='ns')
hsb.grid(column=0, row=1, sticky='ew')

def _build_tree(self, tree_columns, tree_data):
for i in self.tree.get_children(): self.tree.delete(i)
for col in self.tree_columns:
self.tree.heading(col, text=col.title(),
command=lambda c=col: sortby(self.tree, c, 0))
# XXX tkFont.Font().measure expected args are incorrect according
# to the Tk docs
self.tree.column(col, width=(tkFont.Font().measure(col.title())))

for item in self.tree_data:
self.tree.insert('', 'end', values=item)

# adjust columns lenghts if necessary
for indx, val in enumerate(item):
ilen = int(tkFont.Font().measure(val)*0.8)
if self.tree.column(self.tree_columns[indx], width=None) < ilen:
self.tree.column(self.tree_columns[indx], width=ilen)

def _get_selected(self):
'''returns selected items'''
a=[]
for i in self.tree.selection(): a.append((self.tree.item(i)['values']))
return a

Проблема в том, что когда меняю данные в списке (добавляю/удаляю/корректирую) при вызове метода MyMulticolumn._build_tree(тежеСтолбцы, новыеДанные) перерисовка содержимого не происходит.
С чем это может быть связано?

Проблема решена: в методе _build_tree не заменил self.tree_column и self.tree_data на tree_column и tree_data



Офлайн

  • Начало
  • » GUI
  • » Tkinter, ttk: treeview_multicolumn: добавление/удаление строк[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version