英文:
How to fix scrollbars in Tkinter for each frame?
问题
I would like to obtain the following layout:
With my implementation, I am able to achieve the above design. However, scrollbars are not working neither for left frame nor for right frame. How can I fix it?
Here is my implementation:
import tkinter as tk
from tkinter import ttk
import pandas as pd
import random
# Sample DataFrame
df = pd.DataFrame({
'ID': [1, 2, 3, 4, 5],
'Data': [10, 15, 7, 12, 9]
})
def create_radial_chart(frame):
# Function to create a random radial chart
# Replace this with your own radial chart creation code
# For demonstration purposes, we'll just create a random number of labels
num_labels = random.randint(1, 80)
labels = [f'Label {i}' for i in range(1, 1500)]
radial_chart = ttk.Label(frame, text='\n'.join(labels))
radial_chart.pack()
# Create the main window
root = tk.Tk()
root.title('Tkinter Layout Example')
# Create the dropdown menu
dropdown_var = tk.StringVar(root)
dropdown = ttk.Combobox(root, textvariable=dropdown_var)
dropdown['values'] = df['ID'].unique()
dropdown.pack()
# Create the main frames
main_frame = ttk.Frame(root)
main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# Create the left frame with a scrollbar
left_frame = ttk.Frame(main_frame)
left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
left_scrollbar = ttk.Scrollbar(left_frame, orient=tk.VERTICAL)
left_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
left_canvas = tk.Canvas(left_frame, yscrollcommand=left_scrollbar.set)
left_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
left_scrollbar.config(command=left_canvas.yview)
# Create the right frame with a scrollbar
right_frame = ttk.Frame(main_frame)
right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
right_scrollbar = ttk.Scrollbar(right_frame, orient=tk.VERTICAL)
right_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
right_canvas = tk.Canvas(right_frame, yscrollcommand=right_scrollbar.set)
right_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
right_scrollbar.config(command=right_canvas.yview)
# Create the radial charts in the left frame
for _ in range(5):
create_radial_chart(left_canvas)
# Create the middle frames
middle_frame = ttk.Frame(main_frame)
middle_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=10)
upper_middle_frame = ttk.Frame(middle_frame)
upper_middle_frame.pack(fill=tk.BOTH, expand=True)
lower_middle_frame = ttk.Frame(middle_frame)
lower_middle_frame.pack(fill=tk.BOTH, expand=True)
# Create the line plot in the upper middle frame
# Replace this with your own line plot creation code
line_plot = ttk.Label(upper_middle_frame, text='Line Plot')
line_plot.pack()
# Create the data table in the lower middle frame
# Replace this with your own data table creation code
data_table = ttk.Label(lower_middle_frame, text='Data Table')
data_table.pack()
# Create the radial charts in the right frame
for _ in range(5):
create_radial_chart(right_canvas)
root.mainloop()
The issue in my output is that scrollbars do not work. I expect to have scrollable left and right frames.
英文:
I would like to obtain the following layout:
With my implementation, I am able to achieve the above design. However, scrollbars are not working neither for left frame nor for right frame. How can I fix it?
Here is my implementation:
import tkinter as tk
from tkinter import ttk
import pandas as pd
import random
# Sample DataFrame
df = pd.DataFrame({
'ID': [1, 2, 3, 4, 5],
'Data': [10, 15, 7, 12, 9]
})
def create_radial_chart(frame):
# Function to create a random radial chart
# Replace this with your own radial chart creation code
# For demonstration purposes, we'll just create a random number of labels
num_labels = random.randint(1, 80)
labels = [f'Label {i}' for i in range(1, 1500)]
radial_chart = ttk.Label(frame, text='\n'.join(labels))
radial_chart.pack()
# Create the main window
root = tk.Tk()
root.title('Tkinter Layout Example')
# Create the dropdown menu
dropdown_var = tk.StringVar(root)
dropdown = ttk.Combobox(root, textvariable=dropdown_var)
dropdown['values'] = df['ID'].unique()
dropdown.pack()
# Create the main frames
main_frame = ttk.Frame(root)
main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# Create the left frame with a scrollbar
left_frame = ttk.Frame(main_frame)
left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
left_scrollbar = ttk.Scrollbar(left_frame, orient=tk.VERTICAL)
left_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
left_canvas = tk.Canvas(left_frame, yscrollcommand=left_scrollbar.set)
left_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
left_scrollbar.config(command=left_canvas.yview)
# Create the right frame with a scrollbar
right_frame = ttk.Frame(main_frame)
right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
right_scrollbar = ttk.Scrollbar(right_frame, orient=tk.VERTICAL)
right_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
right_canvas = tk.Canvas(right_frame, yscrollcommand=right_scrollbar.set)
right_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
right_scrollbar.config(command=right_canvas.yview)
# Create the radial charts in the left frame
for _ in range(5):
create_radial_chart(left_canvas)
# Create the middle frames
middle_frame = ttk.Frame(main_frame)
middle_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=10)
upper_middle_frame = ttk.Frame(middle_frame)
upper_middle_frame.pack(fill=tk.BOTH, expand=True)
lower_middle_frame = ttk.Frame(middle_frame)
lower_middle_frame.pack(fill=tk.BOTH, expand=True)
# Create the line plot in the upper middle frame
# Replace this with your own line plot creation code
line_plot = ttk.Label(upper_middle_frame, text='Line Plot')
line_plot.pack()
# Create the data table in the lower middle frame
# Replace this with your own data table creation code
data_table = ttk.Label(lower_middle_frame, text='Data Table')
data_table.pack()
# Create the radial charts in the right frame
for _ in range(5):
create_radial_chart(right_canvas)
root.mainloop()
The issue in my output is that scrollbars do not work. I expect to have scrollable left and right frames.
答案1
得分: 1
使用.pack()
、.grid()
或.place()
将小部件添加到画布中不会激活关联的滚动条。您需要创建一个帧,并使用.create_window()
将其添加到画布中,然后您可以将小部件添加到内部帧中,如果帧的大小大于画布的scrollregion,则会激活滚动条。
# 在左侧画布中添加一个帧
left_internal = ttk.Frame(left_canvas)
left_canvas.create_window(0, 0, window=left_internal, anchor="nw")
# 在右侧画布中添加一个帧
right_internal = ttk.Frame(right_canvas)
right_canvas.create_window(0, 0, window=right_internal, anchor="nw")
# 在左侧和右侧帧中创建径向图表
for _ in range(5):
create_radial_chart(left_internal)
create_radial_chart(right_internal)
# 当这些内部帧调整大小时,更新画布的scrollregion
left_internal.bind("<Configure>", lambda e: left_canvas.config(scrollregion=left_canvas.bbox("all")))
right_internal.bind("<Configure>", lambda e: right_canvas.config(scrollregion=right_canvas.bbox("all")))
英文:
Adding widgets into canvas using .pack()
or .grid()
or .place()
will not activate the linked scrollbar. You need to create a frame and add it into the canvas using .create_window()
, then you can add widgets to the internal frame which will activate the scrollbar if the size of the frame is larger than the scrollregion of the canavs.
# add a frame into left canvas
left_internal = ttk.Frame(left_canvas)
left_canvas.create_window(0, 0, window=left_internal, anchor="nw")
# add a frame into right canvas
right_internal = ttk.Frame(right_canvas)
right_canvas.create_window(0, 0, window=right_internal, anchor="nw")
# Create the radial charts in the left and right frame
for _ in range(5):
create_radial_chart(left_internal)
create_radial_chart(right_internal)
# update scrollregion of the canvases when those internal frames are resized
left_internal.bind("<Configure>", lambda e: left_canvas.config(scrollregion=left_canvas.bbox("all")))
right_internal.bind("<Configure>", lambda e: right_canvas.config(scrollregion=right_canvas.bbox("all")))
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论