Как изменить размер прокручиваемого фрейма, когда окно развернуто или развернуто? - PullRequest
1 голос
/ 11 марта 2019

Когда окно развернуто или развернуто, кадр просто постоянен. Размер постоянен. Я хочу, чтобы весь кадр перемещался, когда я расширяю или увеличиваю окно. Как это можно сделать?

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

1 Ответ

0 голосов
/ 11 марта 2019

Холст сгенерирует событие <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()
...