Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » tkinter Canvas create_window не могу привязать метод к окну [RSS Feed]

#1 Июль 3, 2014 12:49:17

ve_i_uj
Зарегистрирован: 2013-06-02
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter Canvas create_window не могу привязать метод к окну

Подскажите. Хочу сделать таблицу, в которой, при нажатии на строку мышкой, появляется еще несколько строк внизу.

Пример создания одной строки:
Создаю виджет 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)

Офлайн

#2 Июль 3, 2014 13:09:34

ve_i_uj
Зарегистрирован: 2013-06-02
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter Canvas create_window не могу привязать метод к окну

Еще немного поэксперементировав, понял: оказывается id , которое возвращает метод Canvas.create_window - это id тоненькой рамочки вокруг окна, и только при нажатии именно на эту рамочку, срабатывает привязанный метод.

Офлайн

#3 Июль 3, 2014 14:51:15

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

tkinter Canvas create_window не могу привязать метод к окну

1. Вопрос еще актуален?
2. Если актуален, то напишите, что есть и что не работает и что хотите получить. Более подробно.

P.S. Будет супер, если еще с скринами

Отредактировано 4kpt_II (Июль 3, 2014 14:51:23)

Офлайн

#4 Июль 3, 2014 17:09:26

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

tkinter Canvas create_window не могу привязать метод к окну

я уже давно не tknter не кодил, но скиньте файл, я сделаю! вспомню молодость



————————————————
-*- Simple is better than complex -*-

Офлайн

#5 Июль 4, 2014 08:17:53

ve_i_uj
Зарегистрирован: 2013-06-02
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter Canvas create_window не могу привязать метод к окну

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 (Июль 4, 2014 08:42:01)

Офлайн

#6 Июль 4, 2014 08:39:48

ve_i_uj
Зарегистрирован: 2013-06-02
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter Canvas create_window не могу привязать метод к окну

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

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

Офлайн

#7 Июль 4, 2014 13:35:47

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

tkinter Canvas create_window не могу привязать метод к окну

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. Будут вопросы - пишите

Офлайн

#8 Июль 6, 2014 15:17:55

ve_i_uj
Зарегистрирован: 2013-06-02
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter Canvas create_window не могу привязать метод к окну

4kpt_II,

Ваш пример оказался для меня очень полезным и позволил съэкономить много времени.
Огромное спасибо.

Офлайн

#9 Июль 6, 2014 18:24:31

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

tkinter Canvas create_window не могу привязать метод к окну

Да не за что.
Будут вопросы - пишите …

Офлайн

  • Начало
  • » GUI
  • » tkinter Canvas create_window не могу привязать метод к окну[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version