Рамка на холсте не будет расширяться, чтобы соответствовать холсту - PullRequest
0 голосов
/ 20 февраля 2019

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

Я боролся с этим часами, и я чувствую, чтоэто что-то очевидное.

Я ожидаю, что метка внутри NoteFrame развернется, чтобы заполнить фрейм, и расширение NoteFrame, чтобы заполнить холст.

Вот минимальный код для воспроизведениякод поведения:

import tkinter as tk


class NoteFrame(tk.Frame):
    def __init__(self, container):
        super().__init__(container)
        self.config(background='white')
        for i in range(20):
            tk.Label(self, text='test').grid(row=i, column=0, sticky='nsew')


class GCMain(tk.Tk):
    def __init__(self):
        super().__init__()
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)

        self.main_canvas = tk.Canvas(self, background="bisque")
        self.main_canvas.columnconfigure(0, weight=1)
        self.main_canvas.rowconfigure(0, weight=1)
        self.frame_n_canvas = tk.Frame(self.main_canvas)
        self.frame_n_canvas.grid(row=0, column=0, sticky='nsew') # tried with and without this
        self.frame_n_canvas.columnconfigure(0, weight=1)
        self.main_canvas.config(scrollregion=self.main_canvas.bbox("all"), highlightthickness=0)
        scrollbar = tk.Scrollbar(self, orient='vertical')
        scrollbar.grid(row=0, column=1, sticky='nsw')
        scrollbar.config(command=self.main_canvas.yview)
        self.main_canvas.config(yscrollcommand=scrollbar.set)
        self.main_canvas.grid(row=0, column=0, sticky='nsew')
        self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw')
        self.main_canvas.bind("<Configure>", self.update_scrollregion)

        nf = NoteFrame(self.frame_n_canvas)
        nf.grid(row=0, column=0, sticky='nsew') # tried with and without this

    def on_resize(self, event):
        w, h = event.width, event.height
        self.main_canvas.configure(width=w, height=h)
        self.frame_n_canvas(width=w, height=h) # tried with and without this

    def update_scrollregion(self, event):
        self.main_canvas.configure(scrollregion=self.main_canvas.bbox("all"))


if __name__ == '__main__':
    GCMain().mainloop()

1 Ответ

0 голосов
/ 21 февраля 2019

Комментарий : динамическое решение

  1. Позвольте вашему Label быть sticky='ew' использовать .grid_columnconfigure(0, weight=1).

    class NoteFrame(tk.Frame):
        def __init__(self, container):
            super().__init__(container)
            self.grid_columnconfigure(0, weight=1)
    
  2. Вам необходим элемент iid объекта Canvas(..., window=.
    Нет Требуется параметр width=200, height=200!

    self.main_canvas.fram_n_canvas_iid =\
            self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw')
    
  3. Привязка к "<Configure> как известно.

    self.main_canvas.bind("<Configure>", self.canvas_configure)
    
  4. Изменение размера .frame_n_canvas ширина синхронно с .main_canvas ширина .

    def canvas_configure(self, event):
        canvas = event.widget
        canvas.itemconfigure(canvas.fram_n_canvas_iid, width=canvas.winfo_width())
    

enter image description here enter image description here


Вопрос : Рамка на холсте не будет расширяться, чтобы соответствовать холсту

Виджет, здесь ваш Рамка self.frame_n_canvas, теряет способность expand, если помещен с .create_window(...в Canvas.

Это, .grid(..., бесполезно, так как вы позже помещаете те же Frame с .create_window(...:

self.frame_n_canvas.grid(row=0, column=0, sticky='nsew') # tried with and without this
...
self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw')

, чтобы дать NoteFrameместо для расширения, используйте параметр width=200, height=200.

self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw',
                               width=200, height=200)

Чтобы ваш Label был sticky='ew', вам нужно сделать .grid_columnconfigure(...:

class NoteFrame(tk.Frame):
    def __init__(self, container):
        super().__init__(container)
        self.grid_columnconfigure(0, weight=1)

Результат :
enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...