Tkinter,让滚动条粘到画布而不是root?

时间:2015-12-14 13:57:25

标签: python tkinter

我有一个工作滚动条和画布。问题是我的画布高度甚至宽度与根的尺寸不同,但滚动条附加到根。这看起来很奇怪。如何让它贴在画布上?所以我也可以在将来添加一个带滚动条的额外画布。

        self.canvas = Canvas(root, borderwidth=0, background="#c0c0c0",height= 150, width=500)

        self.frameTwo = Frame(self.canvas, background="#ffffff")

        self.vsb = Scrollbar(root, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.vsb.set)

        self.vsb.pack(side="right", fill="y")
        self.canvas.pack(side="left")
        self.canvas.place(y=195)
        self.canvas.create_window((4,4), window=self.frameTwo, anchor="w",
                                  tags="self.frame")

        self.frameTwo.bind("<Configure>", self.onFrameConfigure)

1 个答案:

答案 0 :(得分:0)

最佳解决方案是将滚动条和画布专门用于此目的。

这是一个完整的工作示例:

import tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        # create a frame specifically for the canvas,
        # and scrollbars, and let it control the border
        self.canvas_frame = tk.Frame(self, borderwidth = 1, relief="sunken")
        self.canvas = tk.Canvas(self.canvas_frame, borderwidth=0, highlightthickness=0,
                                background="white")
        self.vsb = tk.Scrollbar(self.canvas_frame, orient="vertical",
                                command=self.canvas.yview)
        self.hsb = tk.Scrollbar(self.canvas_frame, orient="horizontal",
                                command=self.canvas.xview)
        self.canvas.configure(yscrollcommand=self.vsb.set, 
                              xscrollcommand=self.hsb.set)

        self.canvas.grid(row=0, column=0, sticky="nsew")
        self.vsb.grid(row=0, column=1, sticky="ns")
        self.hsb.grid(row=1, column=0, sticky="ew")
        self.canvas_frame.rowconfigure(0, weight=1)
        self.canvas_frame.columnconfigure(0, weight=1)

        # add the canvas+scrollbars to the window
        self.canvas_frame.pack(fill="both", expand=True)

if __name__== "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

顺便说一句,在您的代码中,您在画布上同时调用了packplace。调用两者是没有意义的 - 只有一个或另一个可以影响小部件的放置。在为同一小部件​​调用place后致电pack时,将完全忘记调用place的效果。