python - 窗口扩展或最大化时如何调整可滚动框架的大小?
问题描述
当窗口扩大或最大化时,框架只是不变的。大小是恒定的。我希望整个框架在我展开或最大化窗口时移动。如何才能做到这一点?
from tkinter import *
def data():
for i in range(1000):
if (i % 2) == 0:
l4 = Label(frame, text="Size of rectangle:")
l4.grid(row=i, column=0)
en = Entry(frame)
en.grid(row=i, column=1)
b3 = Button(frame, text="Save")
b3.grid(row=1001, column=0)
b4 = Button(frame, text="Back")
b4.grid(row=1001, column=1)
def myfunction(event):
canvas.configure(scrollregion=canvas.bbox("all"),width=250,height=700)
def _on_mousewheel(event):
canvas.yview_scroll(-1*(event.delta/120), "units")
root=Tk()
sizex = 272
sizey = 707
posx = 100
posy = 100
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
myframe=Frame(root)
myframe.place(x=0,y=0)
canvas=Canvas(myframe)
frame=Frame(canvas)
myscrollbar=Scrollbar(myframe,orient="vertical",command=canvas.yview)
canvas.configure(yscrollcommand=myscrollbar.set)
canvas.bind_all('<MouseWheel>', lambda event: canvas.yview_scroll(int(-1*(event.delta/120)), "units"))
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.bind("<MouseWheel>", myfunction)
root.mainloop()
解决方案
画布在调整大小时会生成一个<Configure>
事件。发生这种情况时,您可以绑定到此事件并重置内部框架的大小以匹配画布的宽度。
但是,在您的特定情况下,您有一系列堆叠的小部件,当您调整窗口大小时,它们都不会增长。因此,即使您调整窗口大小,画布也不会增长。因为画布没有增长,所以事件不会触发。
您需要使用适当的选项到几何经理,以确保Windows的整个层次结构适当地增长和收缩,然后添加绑定以设置内部窗口的大小。
这是一个非常基本的例子。它首先创建一个画布并将其打包以填充根窗口。然后它在画布内添加一个框架,并在调整画布大小时安排框架的宽度。
import tkinter as tk
def handle_canvas_resize(event):
canvas.itemconfigure(window_id, width=event.width)
def handle_frame_resize(event):
canvas.configure(scrollregion=canvas.bbox("all"))
root = tk.Tk()
canvas = tk.Canvas(root, width=200, height=200)
scrollbar = tk.Scrollbar(root, command=canvas.yview)
canvas.configure(yscrollcommand=scrollbar.set)
scrollbar.pack(side="right", fill="y")
canvas.pack(fill="both", expand=True)
inner_frame = tk.Frame(canvas, background="bisque")
window_id = canvas.create_window(2,2, window=inner_frame)
for i in range(1, 101):
label = tk.Label(inner_frame, text="label #{}".format(i))
label.pack(side="top", fill="x", padx=1, pady=1)
inner_frame.bind("<Configure>", handle_frame_resize)
canvas.bind("<Configure>", handle_canvas_resize)
root.after_idle(canvas.yview_moveto, 0)
root.mainloop()
推荐阅读
- java - java 8之前接口中方法签名相同的情况下如何实现多重继承
- react-native - React Native 缺少脚本 Android
- java - 如何使用 Java Resthighlevel 客户端生成相同的弹性搜索查询?
- html - 复制时两个弹性项目之间的空白
- java - 如何使用 Spring JndiObjectFactoryBean 为 tomcat7 设置 jndiname 属性值?我这里的属性值是一个文件
- node.js - 如何在没有copyFile的情况下复制文件
- asp.net - ASP.NET MVC 应用程序 cookie 未在 Internet Explorer 的请求中发布
- amazon-web-services - Terraform,无法使用多值路径模式规则创建 ALB 规则
- mysql - 如何在mysql中使用count
- sql - 从 Oracle 中的“start with”和“connect by”到 Postgres