python-3.x 两个tkinter滚动条冲突:第一个滚动正确,第二个不正确

bn31dyow  于 2023-03-13  发布在  Python
关注(0)|答案(1)|浏览(105)

我有一个选项卡控件,其中标签2.1和标签2.2的滚动条冲突。
Tab 2.2滚动条可以正确地垂直滚动。但是,Tab 2.1的滚动条不能滚动。
我怎样才能解决这个问题呢?

from tkinter import ttk
import tkinter as tk

window = tk.Tk() 
window.attributes('-zoomed', True)

style = ttk.Style(window)

tabControl = ttk.Notebook(window, style='Custom.TNotebook', width=700, height=320)
tabControl.place(x=1, y=1)

#TAB 1
main = ttk.Notebook(tabControl)
tabControl.add(main, text ='Tab 1')

#TAB 2
tab2 = ttk.Notebook(main)
main.add(tab2, text="Tab 2")

##TAB 2.1
a = ttk.Frame(tab2)
tab2.add(a, text="Tab 2.1")

canvas = tk.Canvas(a)

scrollbar = ttk.Scrollbar(a, orient="vertical", command=canvas.yview)
scrollable_frame = ttk.Frame(canvas, width = 800, height = 800)

scrollable_frame.bind(
    "<Configure>",
    lambda e: canvas.configure(
        scrollregion=canvas.bbox("all")
    )
)

canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
canvas.configure(yscrollcommand=scrollbar.set)

combo1=ttk.Combobox(scrollable_frame, width = 18)
combo1.place(x=20, y=20)
combo1['value'] = ["text1", "text2"]

canvas.pack(side="left", fill="both", expand=True)
scrollbar.pack(side="right", fill="y")

##TAB 2.2
b = ttk.Frame(tab2)
tab2.add(b, text="Tab 2.2")

canvas = tk.Canvas(b)

scrollbar = ttk.Scrollbar(b, orient="vertical", command=canvas.yview)
scrollable_frame = ttk.Frame(canvas, width = 800, height = 800)

scrollable_frame.bind(
    "<Configure>",
    lambda e: canvas.configure(
        scrollregion=canvas.bbox("all")
    )
)

canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
canvas.configure(yscrollcommand=scrollbar.set)

combo1=ttk.Combobox(scrollable_frame, width = 18)
combo1.place(x=20, y=20)
combo1['value'] = ["text1", "text2"]

canvas.pack(side="left", fill="both", expand=True)
scrollbar.pack(side="right", fill="y")

window.mainloop()
carvr3hs

carvr3hs1#

由于您为两个画布使用了相同的变量canvas,因此两个绑定回调中的canvas将引用最后一个(选项卡2.2中)。
您可以使用e.widget.master在两个绑定回调中引用正确的 canvas

scrollable_frame.bind(
    "<Configure>",
    lambda e: e.widget.master.configure(
        scrollregion=e.widget.master.bbox("all")
    )
)

请注意,e.widget指的是 scrollable_frame 触发事件,因此e.widget.master指的是 scrollable_frame 的父节点,即画布。
或者只是对两个画布使用不同的变量名。

相关问题