代码之家  ›  专栏  ›  技术社区  ›  genchemmer1234

Tkinter pack未调整嵌入画布的框架大小

  •  0
  • genchemmer1234  · 技术社区  · 2 年前

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

    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()
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   acw1668    2 年前

    您的代码中几乎没有问题:

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