TKINTER - 我有一個簡單的 GUI,它使用了一些 tabControl 選項卡。我想讓選項卡(多個小部件)的內容可滾動。正如許多 SO 用戶和其他網站所建議的那樣,我已經想出了如何使用畫布內的一個視窗來制作一個帶有多個小部件的整個視窗。但是,如果我使用 tabControl 選項卡的內容嘗試這種技術,它就不起作用。
代表:
from tkinter import *
from tkinter import ttk
import tkinter as tk
# main window
window = tk.Tk()
window.geometry('400x400')
tabControl = ttk.Notebook(window)
# create tabs
tab_A = ttk.Frame(tabControl)
tab_B = ttk.Frame(tabControl)
tab_C = ttk.Frame(tabControl)
tabControl.add(tab_A, text='A')
tabControl.add(tab_B, text='B')
tabControl.add(tab_C, text='C')
tabControl.grid()
# tab A
for i in range(5):
dir_frame = LabelFrame(tab_A, text=f'LabelFrame {i}', pady=3, padx=5, relief='solid', highlightthickness=5, font=100, fg='darkblue')
dir_frame.grid(column=0, row=i, columnspan=2, sticky='ew')
Label(master=dir_frame, text="Text text \t\t\t").grid(row=0, column=0, sticky='w', pady=15)
Button(master=dir_frame, text="Button").grid(row=0, column=1, sticky='e', padx=5)
# tab B
for i in range(7):
Label(master=tab_B, text=f"Text {i}\t\t\t\t").grid(row=i, column=0, sticky='w', pady=18)
chb2 = Checkbutton(tab_B).grid(row=i, column=1, sticky='e', padx=15)
# tab C
scroll = Scrollbar(tab_C)
scroll.grid(column=1, sticky='ns')
text = Text(tab_C, width=45, wrap=WORD, yscrollcommand=scroll.set)
for i in range(5):
text.insert(END, f'\n{i}.\n')
text.insert(END, f'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.')
text.insert(END, f'\n\n\n\n')
text.grid(column=0, row=0, sticky="nesw")
text.configure(state=DISABLED)
scroll.config(command=text.yview)
# run
window.mainloop()
因此,如果我創建一個帶有滾動條的主框架和畫布,配置此畫布,在畫布內創建另一個框架并將該新框架添加到畫布中的一個視窗(這似乎是這樣做的方法),它是可滾動的,但顯示在我的標簽下方。此外,選項卡功能不再顯示/隱藏內容。

這是我的代碼:
from tkinter import *
from tkinter import ttk
import tkinter as tk
# main window
window = tk.Tk()
window.geometry('400x400')
tabControl = ttk.Notebook(window)
# create tabs
tab_A = ttk.Frame(tabControl)
tab_B = ttk.Frame(tabControl)
tab_C = ttk.Frame(tabControl)
tabControl.add(tab_A, text='A')
tabControl.add(tab_B, text='B')
tabControl.add(tab_C, text='C')
tabControl.grid()
# create a main frame
main_frame = Frame(window)
main_frame.columnconfigure(0, weight=1)
main_frame.grid(column=0, row=1, sticky='nsew')
# create a canvas
my_canvas = Canvas(main_frame)
my_canvas.grid(column=0, row=1, sticky='nsew')
# add a scrollbar to the canvas
my_scrollbar = ttk.Scrollbar(main_frame, orient=VERTICAL, command=my_canvas.yview)
my_scrollbar.grid(column=0, row=1, sticky='ens')
# configure the canvas
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind('<Configure>', lambda e: my_canvas.configure(scrollregion=my_canvas.bbox("all")))
# create another frame inside the canvas
second_frame = Frame(my_canvas)
# add that new frame to a window in the canvas
my_canvas.create_window((0,0), window=second_frame, anchor="nw")
# tab A
for i in range(5):
dir_frame = LabelFrame(second_frame, text=f'LabelFrame {i}', pady=3, padx=5, relief='solid', highlightthickness=5, font=100, fg='darkblue')
dir_frame.grid(column=0, row=i, columnspan=2, sticky='ew')
Label(master=dir_frame, text="Text text \t\t\t").grid(row=0, column=0, sticky='w', pady=15)
Button(master=dir_frame, text="Button").grid(row=0, column=1, sticky='e', padx=5)
# tab B
for i in range(7):
Label(master=tab_B, text=f"Text {i}\t\t\t\t").grid(row=i, column=0, sticky='w', pady=18)
chb2 = Checkbutton(tab_B).grid(row=i, column=1, sticky='e', padx=15)
# tab C
scroll = Scrollbar(tab_C)
scroll.grid(column=1, sticky='ns')
text = Text(tab_C, width=45, wrap=WORD, yscrollcommand=scroll.set)
for i in range(5):
text.insert(END, f'\n{i}.\n')
text.insert(END, f'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.')
text.insert(END, f'\n\n\n\n')
text.grid(column=0, row=0, sticky="nesw")
text.configure(state=DISABLED)
scroll.config(command=text.yview)
# run
window.mainloop()
Tab C 僅包含一個文本小部件,其功能類似于我也想擁有 A 和 B。它是可滾動的,并且選項卡的功能類似于選項卡。
有什么建議?
uj5u.com熱心網友回復:
您已將畫布放在主框架中而不是選項卡中。如果您希望它位于選項卡中,則它必須是選項卡框架的子項。
main_frame = Frame(tab_A)
# ^^^^^
與所提出的問題無關,我建議使用pack而不是grid用于作為唯一孩子的小部件,或者包含小部件中僅有的幾個孩子之一。它需要更少的代碼并且更簡單,因為您不必擔心向唯一的行和列添加權重。
例如,只需要一行代碼就可以讓筆記本填滿視窗,并在調整大小時擴大和縮小:
tabControl.pack(fill="both", expand=True)
也是如此,main_frame因為它是選項卡框架中唯一的小部件。
main_frame.pack(fill="both", expand=True)
最后,pack也使得布局一個小部件和它的滾動條非常容易:
my_scrollbar.pack(side="right", fill="y")
my_canvas.pack(side="left", fill="both", expand=True)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/416044.html
標籤:
