【问题标题】:TKinter Scrollbar - Problem with too many scrollbarsTKinter 滚动条 - 滚动条过多的问题
【发布时间】:2021-01-03 22:40:50
【问题描述】:

我正在使用 Tkinter 构建一个简单的 UI,但在添加滚动条时遇到了问题。我的 UI 布局(如下所示)由 5 个框架组成,其中一个框架有 3 个子框架。我正在尝试为每个框架和子框架添加滚动条,但是当我将最后一个滚动条添加到子框架时,所有框架都变得小于它们的指定大小。这仅在添加最终滚动条时发生。

代码:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.geometry("900x600")

notebook = ttk.Notebook(root)

frame1 = tk.Frame(root, width = 900, height = 600)
frame2 = tk.Frame(root, width = 900, height = 600)
frame3 = tk.Frame(root, width = 900, height = 600)
frame4 = tk.Frame(root, width = 900, height = 600)
frame5 = tk.Frame(root, width = 900, height = 600)

notebook.add(frame1, text = 'Frame 1')
notebook.add(frame2, text = 'Frame 2')
notebook.add(frame3, text = 'Frame 3')
notebook.add(frame4, text = 'Frame 4')
notebook.add(frame5, text = 'Frame 5')


canvas2 = tk.Canvas(frame2, width = 900, height = 600, scrollregion = (0, 0, 900, 600))
canvas3 = tk.Canvas(frame3, width = 900, height = 600, scrollregion = (0, 0, 900, 600))
canvas4 = tk.Canvas(frame4, width = 900, height = 600, scrollregion = (0, 0, 900, 600))
canvas5 = tk.Canvas(frame5, width = 900, height = 600, scrollregion = (0, 0, 900, 600))

canvas2.pack(side = tk.LEFT, fill = tk.BOTH, expand = 1)
canvas3.pack(side = tk.LEFT, fill = tk.BOTH, expand = 1)
canvas4.pack(side = tk.LEFT, fill = tk.BOTH, expand = 1)
canvas5.pack(side = tk.LEFT, fill = tk.BOTH, expand = 1)

et_vbar2 =tk.Scrollbar(canvas2, orient = tk.VERTICAL)
et_vbar2.pack(side = tk.RIGHT, fill = tk.Y)
et_vbar2.config(command=canvas2.yview)
canvas2.config(yscrollcommand = et_vbar2.set)
et_hbar2 =tk.Scrollbar(canvas2, orient = tk.HORIZONTAL)
et_hbar2.pack(side = tk.BOTTOM, fill = tk.X)
et_hbar2.config(command=canvas2.xview)
canvas2.config(xscrollcommand = et_hbar2.set)

et_vbar3 =tk.Scrollbar(canvas3, orient = tk.VERTICAL)
et_vbar3.pack(side = tk.RIGHT, fill = tk.Y)
et_vbar3.config(command=canvas3.yview)
canvas3.config(yscrollcommand = et_vbar3.set)
et_hbar3 =tk.Scrollbar(canvas3, orient = tk.HORIZONTAL)
et_hbar3.pack(side = tk.BOTTOM, fill = tk.X)
et_hbar3.config(command=canvas3.xview)
canvas3.config(xscrollcommand = et_hbar3.set)

et_vbar4 =tk.Scrollbar(canvas4, orient = tk.VERTICAL)
et_vbar4.pack(side = tk.RIGHT, fill = tk.Y)
et_vbar4.config(command=canvas4.yview)
canvas4.config(yscrollcommand = et_vbar4.set)
et_hbar4 =tk.Scrollbar(canvas4, orient = tk.HORIZONTAL)
et_hbar4.pack(side = tk.BOTTOM, fill = tk.X)
et_hbar4.config(command=canvas4.xview)
canvas4.config(xscrollcommand = et_hbar4.set)

et_vbar5 =tk.Scrollbar(canvas5, orient = tk.VERTICAL)
et_vbar5.pack(side = tk.RIGHT, fill = tk.Y)
et_vbar5.config(command=canvas5.yview)
canvas5.config(yscrollcommand = et_vbar5.set)
et_hbar5 =tk.Scrollbar(canvas5, orient = tk.HORIZONTAL)
et_hbar5.pack(side = tk.BOTTOM, fill = tk.X)
et_hbar5.config(command=canvas5.xview)
canvas5.config(xscrollcommand = et_hbar5.set)

notebook.pack()

notebook2 = ttk.Notebook(frame1)

tab1 = tk.Frame(frame1, width = 900, height = 600)
tab2 = tk.Frame(frame1, width = 900, height = 600)
tab3 = tk.Frame(frame1, width = 900, height = 600)

notebook2.add(tab1, text= 'Tab 1')
notebook2.add(tab2, text = 'Tab 2')
notebook2.add(tab3, text = 'Tab 3')

subcanvas1 = tk.Canvas(tab1, width = 900, height = 600, scrollregion = (0, 0, 900, 600))
subcanvas2 = tk.Canvas(tab2, width = 900, height = 600, scrollregion = (0, 0, 900, 600))
subcanvas3 = tk.Canvas(tab3, width = 900, height = 600, scrollregion = (0, 0, 900, 600))

subcanvas1.pack(side = tk.LEFT, fill = tk.BOTH, expand = 1)
subcanvas2.pack(side = tk.LEFT, fill = tk.BOTH, expand = 1)
subcanvas3.pack(side = tk.LEFT, fill = tk.BOTH, expand = 1)

subet_vbar1 =tk.Scrollbar(subcanvas1, orient = tk.VERTICAL)
subet_vbar1.pack(side = tk.RIGHT, fill = tk.Y)
subet_vbar1.config(command=subcanvas1.yview)
subcanvas1.config(yscrollcommand = subet_vbar1.set)
subet_hbar1 =tk.Scrollbar(subcanvas1, orient = tk.HORIZONTAL)
subet_hbar1.pack(side = tk.BOTTOM, fill = tk.X)
subet_hbar1.config(command=subcanvas1.xview)
subcanvas1.config(xscrollcommand = subet_hbar1.set)

subet_vbar2 =tk.Scrollbar(subcanvas2, orient = tk.VERTICAL)
subet_vbar2.pack(side = tk.RIGHT, fill = tk.Y)
subet_vbar2.config(command=subcanvas2.yview)
subcanvas2.config(yscrollcommand = subet_vbar2.set)
subet_hbar2 =tk.Scrollbar(subcanvas2, orient = tk.HORIZONTAL)
subet_hbar2.pack(side = tk.BOTTOM, fill = tk.X)
subet_hbar2.config(command=subcanvas2.xview)
subcanvas2.config(xscrollcommand = subet_hbar2.set)


subet_vbar3 =tk.Scrollbar(subcanvas3, orient = tk.VERTICAL)
subet_vbar3.pack(side = tk.RIGHT, fill = tk.Y)
subet_vbar3.config(command=subcanvas3.yview)
subcanvas3.config(yscrollcommand = subet_vbar3.set)
subet_hbar3 =tk.Scrollbar(subcanvas3, orient = tk.HORIZONTAL)
subet_hbar3.pack(side = tk.BOTTOM, fill = tk.X)
subet_hbar3.config(command=subcanvas3.xview)
subcanvas3.config(xscrollcommand = subet_hbar3.set)

notebook2.pack()

root.mainloop()

有没有办法防止添加滚动条后每一帧都变小?

【问题讨论】:

  • 一半的高度和宽度指定被忽略。您是否试图将所有内容都扩大到窗口的大小?

标签: python-3.x tkinter scrollbar


【解决方案1】:

您的代码中存在许多问题。与其尝试修复它们,我认为您应该作弊并使用抽象此代码的人的代码。有很多人以某种形式制作了滚动框架,包括我。要使用我的,请下载 DoubleScrolledFrame.py 文件from here,然后:

import tkinter as tk
from tkinter import ttk
from DoubleScrolledFrame import DoubleScrolledFrame

def add_scrolled_frame(notebook, text):
    """do this in a function so that you can easily change parameters"""
    frame = DoubleScrolledFrame(notebook, width = 900, height = 600)
    notebook.add(frame, text = text)
    return frame

root = tk.Tk()

notebook = ttk.Notebook(root)
frame1 = tk.Frame(root)
notebook.add(frame1, text = 'Frame 1')
frame2 = add_scrolled_frame(notebook, text = 'Frame 2')
frame3 = add_scrolled_frame(notebook, text = 'Frame 3')
frame4 = add_scrolled_frame(notebook, text = 'Frame 4')
frame5 = add_scrolled_frame(notebook, text = 'Frame 5')
notebook.pack()

notebook2 = ttk.Notebook(frame1)
tab1 = add_scrolled_frame(notebook2, text = 'Tab 1')
tab2 = add_scrolled_frame(notebook2, text = 'Tab 2')
tab3 = add_scrolled_frame(notebook2, text = 'Tab 3')
notebook2.pack()

# assuming you want widgets in these frames:
for i in range(30):
    lbl = tk.Label(tab1, text=f'This is label number {i}')
    lbl.pack()

root.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-03
    • 2016-07-07
    • 2018-04-25
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多