我已经在Stackoverflow上搜索了很多,还有很多博客,文档。。。而且我没有找到让“PanedWindow”可以滚动并扩展+填充的方法
检查这个例子
"""Test"""
# pylint: disable=unused-wildcard-import,wildcard-import
from tkinter import Canvas, Scrollbar, Tk, Wm
from tkinter.constants import BOTH, CENTER, HORIZONTAL, LEFT, NSEW, X
from tkinter.ttk import Button, Frame, Label, PanedWindow, Style
STYLE = {
"TButton": {
"configure": {
"background": "#333333",
"foreground": "white",
"padding": 8,
"relief": "flat",
"border": 2,
},
"map": {
"background": [("active", "#777777")],
"foreground": [("active", "white")],
},
},
}
class ScrollableFrame(Frame):
def __init__(self, parent, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
scrollbar = Scrollbar(self, orient="vertical")
scrollbar.pack(side="right", fill="y")
canvas = Canvas(self, borderwidth=2, background="red")
canvas.pack(side=LEFT, fill=BOTH, expand=True)
canvas.configure(yscrollcommand=scrollbar.set)
scrollbar.configure(command=canvas.yview)
frame = Frame(canvas, style="DEBUG.TFrame")
canvas.create_window((0, 0), window=frame, anchor=CENTER)
# COMMENT THIS, and the paned is scrollable, but frame does NOT expand
# frame.pack(expand=1, fill=BOTH)
frame.bind("<Configure>", self.on_configure)
self.scollbar = scrollbar
self.canvas = canvas
self.frame = frame
def on_configure(self, event):
self.canvas.configure(
scrollregion=self.canvas.bbox("all"),
)
def create_right_pane(master):
frame = Frame(master)
label = Label(frame, text="This is a cool text")
label.pack()
return frame
def create_left_pane(master):
frame = ScrollableFrame(master)
title = Label(frame.frame, text="Hello !!!")
title.pack(expand=True, fill=BOTH, anchor=CENTER)
for i in range(100):
Button(frame.frame, text=f"Channel {i} ❱").pack(expand=True, fill=BOTH)
return frame
app = Tk(className="MyApp")
style = Style()
style.theme_create("app", None, STYLE)
style.theme_use("app")
app.title("MyApp")
app.geometry("1120x550")
splitpane = PanedWindow(app, orient=HORIZONTAL)
splitpane.pack(expand=True, fill=BOTH)
leftframe = create_left_pane(splitpane)
rightframe = create_right_pane(splitpane)
splitpane.add(leftframe, weight=1)
splitpane.add(rightframe, weight=5)
app.mainloop()
ScrollableFrame类中有一条注释
我想做的只是让内容“填满空间”并“可滚动”
如果您发现了问题,并且能够解决(或提供解决方案)。。。谢谢
默认情况下,内部框架将展开或收缩到其内容的最佳大小。由于框架的内容没有画布宽,因此框架将没有画布宽
如果希望它填充画布,则需要在画布改变大小时显式地将宽度设置为与画布的宽度相同
首先,让我们确保我们可以通过给它一个标签来识别内部框架。您可以同样轻松地捕获
window_create
返回的标识符接下来,添加绑定以在画布配置更改时调用函数
最后,定义resize函数。在
<Configure>
事件中,event
对象将包含一个width
参数,该参数表示对象的宽度。我们可以用它来确定内部框架的宽度您可能需要调整宽度以适应画布边框
相关问题 更多 >
编程相关推荐