当窗口扩展或最大化时,如何调整可滚动框架的大小? - 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>事件。您可以绑定到此事件,并在发生这种情况时重置内部框架的大小以匹配画布的宽度。

但是,在您的特定情况下,您有一系列堆叠的小部件,当您调整窗口大小时,这些小部件都不会增长。因此,即使您调整窗口大小,画布也不会增长。由于画布没有增长,因此该事件不会触发。

您需要对几何图形管理器使用适当的选项,以确保整个窗口层次结构适当地增长和缩小,然后添加绑定以设置内部窗口的大小。

这是一个非常基本的例子。首先创建一个画布并将其打包,以使其填充根窗口。然后,它在画布内添加一个框架,并在调整画布大小时安排更改框架的宽度。

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()

Tkinter OptionManu标题在第二个GUI窗口中消失 - python

我想用OptionMenu功能打开2个GUI。 GUI window正常工作。但是,GUI window1无法在选择栏中显示“演示”,此外,所选项目也不会放在选择栏中。我做错了什么?import tkinter as tk window = tk.Tk() window1 = tk.Tk() v = tk.StringVar() v.set("de…

Python-crontab模块 - python

我正在尝试在Linux OS(CentOS 7)上使用Python-crontab模块我的配置文件如下:{ "ossConfigurationData": { "work1": [ { "cronInterval": "0 0 0 1 1 ?", "attribute&…

Python:检查是否存在维基百科文章 - python

我试图弄清楚如何检查Wikipedia文章是否存在。例如,https://en.wikipedia.org/wiki/Food 存在,但是https://en.wikipedia.org/wiki/Fod 不会,页面只是说:“维基百科没有此名称的文章。”谢谢! 参考方案 >>> import urllib >>> prin…

Python Pandas导出数据 - python

我正在使用python pandas处理一些数据。我已使用以下代码将数据导出到excel文件。writer = pd.ExcelWriter('Data.xlsx'); wrong_data.to_excel(writer,"Names which are wrong", index = False); writer.…

Python:在不更改段落顺序的情况下在文件的每个段落中反向单词? - python

我想通过反转text_in.txt文件中的单词来生成text_out.txt文件,如下所示:text_in.txt具有两段,如下所示:Hello world, I am Here. I am eighteen years old. text_out.txt应该是这样的:Here. am I world, Hello old. years eighteen a…