Найти - Пользователи
Полная версия: tkinter Canvas create_window не могу привязать метод к окну
Начало » GUI » tkinter Canvas create_window не могу привязать метод к окну
1
ve_i_uj
Подскажите. Хочу сделать таблицу, в которой, при нажатии на строку мышкой, появляется еще несколько строк внизу.

Пример создания одной строки:
Создаю виджет 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
Еще немного поэксперементировав, понял: оказывается id , которое возвращает метод Canvas.create_window - это id тоненькой рамочки вокруг окна, и только при нажатии именно на эту рамочку, срабатывает привязанный метод.
4kpt_II
1. Вопрос еще актуален?
2. Если актуален, то напишите, что есть и что не работает и что хотите получить. Более подробно.

P.S. Будет супер, если еще с скринами
terabayt
я уже давно не tknter не кодил, но скиньте файл, я сделаю! вспомню молодость
ve_i_uj
4kpt_II
1. Вопрос еще актуален?2. Если актуален, то напишите, что есть и что не работает и что хотите получить. Более подробно.P.S. Будет супер, если еще с скринами

Спасибо всем кто откликнулись. Вчера не было возможности отписаться.

4kpt_II,
1. Да вопрос отчасти актуален.
2. Вот скриншот, того, что примерно хочу получить (т.е. есть таблица, у которой можно развернуть одну из строк):

https://www.dropbox.com/s/vbt7tihdrxsw5h5/%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0.jpg

Здесь таблица сделана из экземпляров Label, а строки разварачивается с помощью Checkbutton'ов. Выглядит это так себе (хуже, чем могло бы быть), да и код реализации крайне запутанный. Но самое главное: таблица мелькает при сворачивании и разворацивании пунктов и от этого даже глаза начинают болеть. Ну и скрол к этому тоже не приделать.

terabayt,
1. В реализации конкретно данной таблицы есть пока не больше, чем я написал в вопросе. А остального кода довольно много, да и к делу он отношения не имеет.


По сути я хочу сделать класс, экземпляр которого будет принимать информацию и представлять её в таблице, строки же у таблицы должны при желании разворачиваться, сдвигая строки под ней вниз.
ve_i_uj
Мне хотя бы просто узнать в каком направлении смотреть и какие для этого виджеты (или их комбинации существуют), а дальше я бы сам разобрался

Вчера смотрел документацию по ttk.Treeview, но это не совсем то, что мне нужно, т.к. шапка таблицы остаётся одна и таже и для потомков (хотя можно попробовать вместо первого потомка подсовывать новую шапку). Наверное, сегодня буду пробовать это. Еще хочу попробовать старую реализацию из Label'ов сделать на холсте Canvas и сдвиг строк реализовывать методами Canvas; может хотя бы поплавнее будет сдвигаться и не будет мельтешить (да и скрол можно будет привязать).
4kpt_II
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()

P.S. Будут вопросы - пишите
ve_i_uj
4kpt_II,

Ваш пример оказался для меня очень полезным и позволил съэкономить много времени.
Огромное спасибо.
4kpt_II
Да не за что.
Будут вопросы - пишите …
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