Нужно установить колесико мыши в тетрадь ttk с полосой прокрутки - PullRequest
0 голосов
/ 28 июня 2018

Мне нужно колесо мыши, чтобы функционировать на всех вкладках. Прямо сейчас это работает только на вкладке пятницы. Контроллер колесика мыши находится вокруг линии 18. У меня есть два возможных подхода к управлению колесом мыши, один из которых закомментирован. Второй работает, если я заменю «bind_all» на «bind», но тогда только те области, которые не покрываются виджетами, прокручиваются с помощью колесика мыши. Во всяком случае, тот факт, что колесо мыши работает на последней вкладке, говорит мне, что колесо мыши может работать на всех вкладках, я просто не могу понять это.

Редактировать: я преждевременно опубликовал решение этой проблемы. Мне пришлось взять это обратно, так как я обнаружил, что области холста, покрытые виджетами, не могут прокручиваться колесиком мыши. Когда весь холст покрыт, колесо мыши было бесполезно.

from tkinter import *
from tkinter import ttk
out_root = Tk()
out_root.title("KLUSTERBOX - Output")
# list the names of the tabs
tab = ["saturday", "sunday", "monday", "tuesday", "wednesday", "thursday", "friday"]
C = ["C0","C1","C2","C3","C4","C5","C6"]
#   create a notebook
tabControl = ttk.Notebook(out_root)  # Create Tab Control
tabControl.pack()
for i in range(7): #   loop to fill notebook pages.
    tabs = Frame(tabControl)  #     put frame in notebook
    tabs.pack()
    tabControl.add(tabs, text="{}".format(tab[i]))  # Add the tab
    C[i] = Canvas(tabs)    #   put canvas inside notebook frame
    S = Scrollbar(tabs, command=C[i].yview)    #   define and bind the scrollbar with the canvas
    C[i].config(yscrollcommand=S.set, scrollregion=(0, 0, 10000, 10000))  #   bind the canvas with the scrollbar
    #   Enable mousewheel option 1
    C[i].bind_all('<MouseWheel>', lambda event: C[i].yview_scroll(int(-1 * (event.delta / 120)), "units"))
    #   Enable mousewheel option 2
    # if i==0: C[0].bind_all('<MouseWheel>', lambda event: C[0].yview_scroll(int(-1 * (event.delta / 120)), "units"))
    # if i==1: C[1].bind_all('<MouseWheel>', lambda event: C[1].yview_scroll(int(-1 * (event.delta / 120)), "units"))
    # if i==2: C[2].bind_all('<MouseWheel>', lambda event: C[2].yview_scroll(int(-1 * (event.delta / 120)), "units"))
    # if i==3: C[3].bind_all('<MouseWheel>', lambda event: C[3].yview_scroll(int(-1 * (event.delta / 120)), "units"))
    # if i==4: C[4].bind_all('<MouseWheel>', lambda event: C[4].yview_scroll(int(-1 * (event.delta / 120)), "units"))
    # if i==5: C[5].bind_all('<MouseWheel>', lambda event: C[5].yview_scroll(int(-1 * (event.delta / 120)), "units"))
    # if i==6: C[6].bind_all('<MouseWheel>', lambda event: C[6].yview_scroll(int(-1 * (event.delta / 120)), "units"))
    S.pack(side=RIGHT, fill=BOTH)
    C[i].pack(side=LEFT, fill=BOTH, expand=True)
    F = Frame(C[i]) #      put a frame in the canvas
    F.pack()
    C[i].create_window((0, 0), window=F, anchor=NW)    #   create window with frame
    ttk.Label(F, text="hello tab {}".format(tab[i])).grid(row=0) #    label for first line
    for ii in range(100):
        #   fill in text for body of document.
        Label(F, text="This label spans the entire lenght of the window. Line number: {}".format(ii)).grid(row=ii+1)
out_root.mainloop()

1 Ответ

0 голосов
/ 29 июня 2018

Решение состоит в том, чтобы ваша функция колесика мыши выяснила, какой холст является видимым холстом, а затем прокрутите его. Один простой способ - создать привязку, которая обновляет глобальную переменную с выбранным в данный момент холстом (или номером холста).

Начните с определения функции, вызываемой при выборе вкладки:

def tab_selected(i):
    global current_tab
    current_tab = i

Далее, вызовите эту функцию, когда видимость холста изменится:

for i in range(7):
    ...
    C[i].bind("<Map>", lambda event, i=i: tab_selected(i))
    ...

Это должно дать вам глобальную переменную с именем current_tab, которая всегда будет установлена ​​в зависимости от того, какая вкладка видна.

Затем создайте функцию для прокрутки текущей вкладки:

def scroll_tab(event):
    global current_tab
    C[current_tab].yview_scroll(int(-1 * (event.delta / 120)), "units")

Наконец, создайте глобальную привязку вне вашего цикла для вызова этой функции всякий раз, когда используется колесико мыши:

out_root.bind_all("<MouseWheel>", scroll_tab)
...