Форум сайта python.su
Подскажите. Хочу сделать таблицу, в которой, при нажатии на строку мышкой, появляется еще несколько строк внизу.
Пример создания одной строки:
Создаю виджет Frame, в него размещаю по горизонтали ячейки таблицы (экземпляры Label), затем виджет Frame'а размещаю с помощью метода Canvas.create_window в холсте.
Но столкнулся с тем, что привязывая метод к идентификатору окна внутри холста, метод просто не срабатывает.
Немного поэксперементировав, я пришёл к выводу, что метод срабатывает при нажатии на само окно, но его закрывают поля таблицы.
Подскажите, как можно это исправить или может быть есть более простое решение для “развёртывающейся” строки?
(новые развернутые строки не будут соответствовать названиям в шапке - это иная информация)
Код:
class PaymentCanvas(Frame): def __init__(self, parent=None, *arg, **kw): super(PaymentCanvas, self).__init__(parent, *arg, **kw) self.canvas = Canvas(self, width=600, height=100, bg='beige') self.testFr = Frame(self.canvas) for i, (text, width) in enumerate(zip(("0", "111", "222", "333", "444", "555"), (6, 16, 11, 13, 11, 14))): lb = Label(self.testFr, width=width, text=text, relief=GROOVE, justify=LEFT, bg='moccasin') lb.grid(row=0, column=i, padx=0, pady=0, sticky=EW) id_ = self.canvas.create_window(0, 0, anchor = NW, window = self.testFr, width = 593, height = 18) self.canvas.addtag_withtag('????-??-??', id_) self.canvas.pack() self.canvas.tag_bind(id_, '<Button-1>', self.test) def test(self, *ign): self.canvas.itemconfig('????-??-??' , height = 55) Label(self.testFr, text='6666', relief=GROOVE, justify=LEFT, bg='moccasin').grid(row=1, column=0, padx=0, pady=0, sticky=EW) Label(self.testFr, text='777', relief=GROOVE, justify=LEFT, bg='moccasin').grid(row=2, column=0, padx=0, pady=0, sticky=EW)
Отредактировано ve_i_uj (Июль 3, 2014 12:50:09)
Офлайн
Еще немного поэксперементировав, понял: оказывается id , которое возвращает метод Canvas.create_window - это id тоненькой рамочки вокруг окна, и только при нажатии именно на эту рамочку, срабатывает привязанный метод.
Офлайн
1. Вопрос еще актуален?
2. Если актуален, то напишите, что есть и что не работает и что хотите получить. Более подробно.
P.S. Будет супер, если еще с скринами
Отредактировано 4kpt_II (Июль 3, 2014 14:51:23)
Офлайн
я уже давно не tknter не кодил, но скиньте файл, я сделаю! вспомню молодость
Офлайн
4kpt_II
1. Вопрос еще актуален?2. Если актуален, то напишите, что есть и что не работает и что хотите получить. Более подробно.P.S. Будет супер, если еще с скринами
Отредактировано ve_i_uj (Июль 4, 2014 08:42:01)
Офлайн
Мне хотя бы просто узнать в каком направлении смотреть и какие для этого виджеты (или их комбинации существуют), а дальше я бы сам разобрался
Вчера смотрел документацию по ttk.Treeview, но это не совсем то, что мне нужно, т.к. шапка таблицы остаётся одна и таже и для потомков (хотя можно попробовать вместо первого потомка подсовывать новую шапку). Наверное, сегодня буду пробовать это. Еще хочу попробовать старую реализацию из Label'ов сделать на холсте Canvas и сдвиг строк реализовывать методами Canvas; может хотя бы поплавнее будет сдвигаться и не будет мельтешить (да и скрол можно будет привязать).
Офлайн
ve_i_uj
Я думаю Вам этого хватит
import Tkinter # # def many_button(event): next_ = int(event.widget["text"][-2:]) + 1 if not buttons[next_].winfo_manager(): buttons[next_].grid(row=next_, column=0) buttons[next_]["bg"] = "red" buttons[next_].master.update_idletasks() elif not int(event.widget["text"][-2:]) % 2: buttons[next_].grid_forget() new_height = buttons[next_].master.winfo_height() canv.config(scrollregion=(0, 0, 200, new_height)) # root = Tkinter.Tk() root.geometry("400x400+100+100") # canv = Tkinter.Canvas(root, width=194, height=400) canv.pack(side="left") # frame = Tkinter.Frame(canv) frame.pack() buttons = [] for i in xrange(20): but = Tkinter.Button(frame, text=u"Кнопка %02d" % i, width=21) if not i % 2: but.grid(row=i, column=0) but.bind("<Button-1>", many_button) buttons.append(but) # scr = Tkinter.Scrollbar(root, orient="vertical", takefocus=False) scr.pack(side="left", fill="y") scr["command"] = canv.yview # canv.create_window((0, 0), window=frame, anchor="nw") canv.config(yscrollcommand=scr.set, scrollregion=(0, 0, 200, 400)) # root.mainloop()
Офлайн
4kpt_II,
Ваш пример оказался для меня очень полезным и позволил съэкономить много времени.
Огромное спасибо.
Офлайн
Да не за что.
Будут вопросы - пишите …
Офлайн