Python Tkinter:滚动条框架的区域Window 调整主 window 大小时垂直扩展
Python Tkinter : Area of Scrollbar Frame Window Expand Vertically when main window is resized
我正在使用此代码来开发仅从该网站获取的项目。但是当调整 main window 大小时,我无法使 frame window 垂直延伸。我已经尝试了我的选择,但没有运气。帧 window 大小是固定的。我希望它在调整 main window 大小时动态更改。提前致谢。
from Tkinter import *
def data():
for i in range(50):
Label(frame,text=i).grid(row=i,column=0)
Label(frame,text="my text"+str(i)).grid(row=i,column=1)
Label(frame,text="..........").grid(row=i,column=2)
def myfunction(event):
canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200)
root=Tk()
sizex = 800
sizey = 600
posx = 100
posy = 100
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
myframe=Frame(root,relief=GROOVE,width=50,height=100,bd=1)
myframe.place(x=10,y=10)
canvas=Canvas(myframe)
frame=Frame(canvas)
myscrollbar=Scrollbar(myframe,orient="vertical",command=canvas.yview)
canvas.configure(yscrollcommand=myscrollbar.set)
myscrollbar.pack(side="right",fill="y")
canvas.pack(side="left")
canvas.create_window((0,0),window=frame,anchor='nw')
frame.bind("<Configure>",myfunction)
data()
root.mainloop()
我并不完全理解 "frame window" 的意思——这些术语是相互排斥的。框架是 window 中的小部件。我将假设您希望展开充满小部件的框架。
你有几个问题对你不利。第一个是您将 canvas 放在一个框架中,但您还没有将框架配置为展开。如果框架不展开,canvas 也不能。
您正在使用 place
,但在我看来,这是一个糟糕的选择,尤其是当框架是根目录中唯一的小部件时。更好的选择是 pack
。由于您将其放置在 10,10,我认为这意味着您需要在边缘周围留出 10 像素的边距。
myframe.pack(side="top", fill="both", expand=True, padx=10, pady=10)
如果您想改用place
,选项会稍微复杂一些。您可以使用相对宽度和高度使其与主 window 保持同步。如果将相对宽度和固定宽度组合在一起,则它们是相加的。因此,相对宽度 1.0 (100%) 和宽度 -20 表示它是 window 减去 20 像素的整个宽度。 (每边 10 个像素,因为您将其放置在 10,10)
myframe.place(x=10,y=10, relwidth=1.0, relheight=1.0, width=-20, height=-20)
一旦这样做,就会暴露下一个问题:canvas 不会扩展以适合框架。您正在使用 pack
这是一个不错的选择,但是您没有告诉 canvas 填写给它的 space。
更改代码以将其添加到框架中,如下所示:
canvas.pack(side="left", fill="both", expand=True)
我正在使用此代码来开发仅从该网站获取的项目。但是当调整 main window 大小时,我无法使 frame window 垂直延伸。我已经尝试了我的选择,但没有运气。帧 window 大小是固定的。我希望它在调整 main window 大小时动态更改。提前致谢。
from Tkinter import *
def data():
for i in range(50):
Label(frame,text=i).grid(row=i,column=0)
Label(frame,text="my text"+str(i)).grid(row=i,column=1)
Label(frame,text="..........").grid(row=i,column=2)
def myfunction(event):
canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200)
root=Tk()
sizex = 800
sizey = 600
posx = 100
posy = 100
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
myframe=Frame(root,relief=GROOVE,width=50,height=100,bd=1)
myframe.place(x=10,y=10)
canvas=Canvas(myframe)
frame=Frame(canvas)
myscrollbar=Scrollbar(myframe,orient="vertical",command=canvas.yview)
canvas.configure(yscrollcommand=myscrollbar.set)
myscrollbar.pack(side="right",fill="y")
canvas.pack(side="left")
canvas.create_window((0,0),window=frame,anchor='nw')
frame.bind("<Configure>",myfunction)
data()
root.mainloop()
我并不完全理解 "frame window" 的意思——这些术语是相互排斥的。框架是 window 中的小部件。我将假设您希望展开充满小部件的框架。
你有几个问题对你不利。第一个是您将 canvas 放在一个框架中,但您还没有将框架配置为展开。如果框架不展开,canvas 也不能。
您正在使用 place
,但在我看来,这是一个糟糕的选择,尤其是当框架是根目录中唯一的小部件时。更好的选择是 pack
。由于您将其放置在 10,10,我认为这意味着您需要在边缘周围留出 10 像素的边距。
myframe.pack(side="top", fill="both", expand=True, padx=10, pady=10)
如果您想改用place
,选项会稍微复杂一些。您可以使用相对宽度和高度使其与主 window 保持同步。如果将相对宽度和固定宽度组合在一起,则它们是相加的。因此,相对宽度 1.0 (100%) 和宽度 -20 表示它是 window 减去 20 像素的整个宽度。 (每边 10 个像素,因为您将其放置在 10,10)
myframe.place(x=10,y=10, relwidth=1.0, relheight=1.0, width=-20, height=-20)
一旦这样做,就会暴露下一个问题:canvas 不会扩展以适合框架。您正在使用 pack
这是一个不错的选择,但是您没有告诉 canvas 填写给它的 space。
更改代码以将其添加到框架中,如下所示:
canvas.pack(side="left", fill="both", expand=True)