繁体   English   中英

Tkinter 包没有调整嵌入在画布中的框架的大小

[英]Tkinter pack not resizing frame embedded in canvas

我正在尝试在 Tkinter 中制作可滚动的框架,提示用户输入内容,然后在按 Enter 时添加短语和新行。 出于某种原因,画布中的框架在添加 4 行后似乎没有调整大小,即使我正在使用 pack 添加新行。 我尝试在行 Frames 中添加一个高度参数,但它似乎没有改变任何东西。 我如何配置滚动​​条有问题吗?

import tkinter as tk

class TermDisplayFrame(tk.Frame):
    def __init__(self, parent, width=100, height=50):
        super().__init__(parent)
        self.canvas = tk.Canvas(self)
        self.frame = tk.Frame(self.canvas)
        self.canvas.create_window((0,0), window = self.frame, anchor=tk.NW, tags='frame')

        self.canvas.pack(side='left')
        self.scroll = tk.Scrollbar(self,orient='vertical')  
        self.canvas.configure(xscrollcommand=self.scroll.set)
        self.scroll.pack(side='right',fill='y')
        self.scroll.config(command=self.canvas.yview)
        self.canvas.bind("<Configure>", lambda e: self.onCanvasConfigure(e, self.canvas))

        self.initialize_header()
        self.initialize_entry()

    def onCanvasConfigure(self,e, widget):
        self.canvas.itemconfig('frame', height=self.canvas.winfo_height(), width=self.canvas.winfo_width())
        print('Configure triggered')


    def reset_scroll_region(self,event=False):
        self.canvas.configure(scrollregion=self.canvas.bbox('all'))

    def initialize_header(self):
        row = tk.Frame(self.frame)
        tk.Label(row, width=5, text='Term', borderwidth='2', relief='groove').pack(side='left', fill='both', expand=True)
        tk.Label(row, width=5, text='Meaning', borderwidth='2', relief='groove').pack(side='left', fill='both', expand=True)
        tk.Label(row, width=5, text='Apply to\n\n', borderwidth='2', relief='groove').pack(side='left', fill='both', expand=True)
        tk.Label(row, width=5, text='Times', borderwidth='2', relief='groove').pack(side='left', fill='both', expand=True)
        row.pack(side='top', fill='x')

    def initialize_entry(self):
        self.recent_row = tk.Frame(self.frame)
        self.entry = tk.Entry(self.recent_row, width=5, borderwidth='2', relief='groove')
        self.entry.pack(side='left', fill='both', expand=True)
        tk.Label(self.recent_row, width=5, text='replaced by', borderwidth='2', relief='groove').pack(side='left', fill='both', expand=True)
        tk.Label(self.recent_row, width=5, text='Apply to\n\n', borderwidth='2', relief='groove').pack(side='left', fill='both', expand=True)
        tk.Label(self.recent_row, width=5, text='Times', borderwidth='2', relief='groove').pack(side='left', fill='both', expand=True)
        self.recent_row.pack(side='top', fill='x')
        self.entry.bind("<Return>", self.add_row)

    def add_row(self, event):
        text = self.entry.get()
        self.entry.forget()
        tk.Label(self.recent_row, width=5, text=text, borderwidth='2', relief='groove').pack(side='left', fill='both', expand=True)
        self.initialize_entry()
        self.reset_scroll_region()
        print(self.frame.winfo_children())
        print(self.frame.winfo_height())

if __name__ == "__main__":
    root=tk.Tk()
    TermDisplayFrame(root).pack()
    root.mainloop()

您的代码中有几个问题:

  • self.canvas.configure(xscrollcommand=self.scroll.set)应该是self.canvas.configure(yscrollcommand=self.scroll.set)

  • 您已重置onCanvasConfigure()内的帧高度。 self.canvas.itemconfig('frame', height=self.canvas.winfo_height(), width=self.canvas.winfo_width())更改为self.canvas.itemconfig('frame', width=self.canvas.winfo_width())代替

  • 你需要调用self.frame.update_idletasks()来更新框架,然后再调用self.canvas.configure(scrollregion=self.canvas.bbox('all'))reset_scroll_region()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM