Кнопки Tkinter внутри текстового виджета и прокрутка - PullRequest
3 голосов
/ 17 января 2012

Используя код, найденный в этом сообщении о стеке , я немного изменил его, чтобы включить цвет фона для каждой другой кнопки и установил ширину, чтобы заполнить ширину виджета «Текст». Однако, когда это происходит, я не могу использовать колесо мыши для прокрутки. Я должен ухватиться за полосу прокрутки.

Есть ли лучший способ сделать это, который позволил бы нормальную прокрутку? Вот мой код:

import Tkinter as tk

root = tk.Tk()  
vsb = tk.Scrollbar(orient="vertical")
text = tk.Text(root, width=40, height=20, yscrollcommand=vsb.set)
vsb.config(command=text.yview)
vsb.pack(side="right",fill="y")
text.pack(side="top",fill="both",expand=True)
for i in range(1000):
    bg = 'grey'
    if i % 2 == 0:
        bg = 'white'
    cb = tk.Checkbutton(text="checkbutton #%s" % i, bg=bg, width=35, justify=tk.LEFT)
    text.window_create("end", window=cb)
    text.insert("end", "\n") # to force one checkbox per line

root.mainloop()

Ответы [ 2 ]

1 голос
/ 29 июня 2013

Проблема заключается в том, что при заполнении виджета «Текст» флажками, вы теперь взаимодействуете с привязками событий флажков, когда указатель мыши находится над окном (а не «скрытым» виджетом «Текст»). В то время как виджет «Текст» имеет привязки для прокрутки мышью (кнопки 4 и 5), кнопки проверки не поставляются с ним автоматически. И (AFAIK) родительские виджеты не могут быть автоматически настроены на получение каких-либо событий через своих дочерних элементов, поэтому вы должны сделать это вручную. Будет работать следующий код (вставить после создания cb):

cb.bind('<Button-4>', lambda event: text.yview_scroll(-1, tk.UNITS))
cb.bind('<Button-5>', lambda event: text.yview_scroll( 1, tk.UNITS))
0 голосов
/ 21 января 2012
.
.
text.focus() # <----------
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...