简体   繁体   中英

Why tkinter scrollbar on tkinter frame(with canvas) of tkinter notebook tab, scroll only if mouse cursor over scroll slider?

This is the short note book code which scroll only when mouse cursor over the scroll slider. Can't find any info about my problem. The examples which i found in internet etc work good sometimes , but in my case, not. Python3.4 win7 64.

# -*- coding: utf-8 -*-
import tkinter
from tkinter import ttk
import sys,pickle,webbrowser


def cocoa_click(event):
    webbrowser.open("http://stts.pythonanywhere.com/")

mainframe = tkinter.Tk()

mainframe_width = (mainframe.winfo_screenwidth() / 2 - 200)
mainframe_heigth = (mainframe.winfo_screenheight() / 2 - 250)
mainframe.geometry("%dx%d+%d+%d" % (1000, 600, mainframe_width, mainframe_heigth))
mainframe.title('DAS progress 132')
mainframe.resizable(False,True)
n_book = ttk.Notebook(mainframe)
n_book.pack(fill='both', expand='yes')
n_book.pressed_index = None

x_name=["tabnote1","tabnote2","tabnote3","tabnote4"]
x_container=[]; x_canvas=[]; x_scroll=[]; x_frame=[]
cvsw,cvsh=960,400;
sreg=(0,0,1000,1320)

for i in range(4):
    x_container.append(tkinter.Frame(n_book))
    x_container[i].pack(fill=tkinter.BOTH, expand=True)
    n_book.add(x_container[i], text=x_name[i]) # add container to note book
    x_canvas.append(tkinter.Canvas(x_container[i], width=cvsw, height=cvsh)) # add canvas to container
    x_scroll.append(tkinter.Scrollbar(x_container[i], command=x_canvas[i].yview)) # add scroll to container
    x_canvas[i].config(yscrollcommand=x_scroll[i].set, scrollregion=sreg)
    x_canvas[i].pack(side=tkinter.LEFT, fill=tkinter.BOTH, expand=True)
    x_scroll[i].config(width=240)
    x_scroll[i].pack(side=tkinter.RIGHT, fill=tkinter.Y, expand=True)


cocoa = ttk.Button(mainframe,text="(: cocoa") # add button to mainframe - worked
cocoa.place(height=40,width=600,relx=0.4,rely=0)
cocoa.bind("<Button-1>",cocoa_click)
mainframe.mainloop()

i found the dirty solution for my case but it not crossplatform(linux have difference behavior)

# -*- coding: utf-8 -*-
import tkinter
from tkinter import ttk
import sys,pickle,webbrowser

def on_mousewheel(event):
    try:
        print("e ",event)
        shift = (event.state & 0x1) != 0
        canvas=event.widget
        scroll = -1 if event.delta > 0 else 1
        if shift:
            canvas.xview_scroll(scroll, "units")
        else:
            canvas.yview_scroll(scroll, "units")
    except:pass

def cocoa_click(event):
    webbrowser.open("http://stts.pythonanywhere.com/")

mainframe = tkinter.Tk()
mainframe_width = (mainframe.winfo_screenwidth() / 2 - 200)
mainframe_heigth = (mainframe.winfo_screenheight() / 2 - 250)
mainframe.geometry("%dx%d+%d+%d" % (1000, 600, mainframe_width, mainframe_heigth))
mainframe.title('DAS progress 132')
mainframe.resizable(False,True)
n_book = ttk.Notebook(mainframe)
n_book.pack(fill='both', expand='yes')
n_book.pressed_index = None

x_name=["tabnote1","tabnote2","tabnote3","tabnote4"]
x_container=[]; x_canvas=[]; x_scroll=[]; x_frame=[]
cvsw,cvsh=960,400;
sreg=(0,0,1000,1320)

for i in range(4):
    x_container.append(tkinter.Frame(n_book))
    x_container[i].pack(fill=tkinter.BOTH, expand=True)
    n_book.add(x_container[i], text=x_name[i]) # add container to note book
    x_canvas.append(tkinter.Canvas(x_container[i], width=cvsw, height=cvsh)) # add canvas to container
    x_scroll.append(tkinter.Scrollbar(x_container[i], command=x_canvas[i].yview)) # add scroll to container
    x_canvas[i].config(yscrollcommand=x_scroll[i].set, scrollregion=sreg)
    x_canvas[i].pack(side=tkinter.LEFT, fill=tkinter.BOTH, expand=True)
    x_scroll[i].config(width=240)
    x_scroll[i].pack(side=tkinter.RIGHT, fill=tkinter.Y, expand=True)
    x_canvas[i].bind_all("<MouseWheel>", on_mousewheel) # index always 3


cocoa = ttk.Button(mainframe,text="(: cocoa") # add button to mainframe - worked
cocoa.place(height=40,width=600,relx=0.4,rely=0)
cocoa.bind("<Button-1>",cocoa_click)
mainframe.mainloop()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM