【问题标题】:How to attach a Scrollbar just to a Canvas?如何将滚动条附加到画布上?
【发布时间】:2015-06-25 16:59:23
【问题描述】:

我正在尝试构建仪表板。

我想只为画布区域保留滚动条,但相反,它只是粘在其他框架上。

我写的代码是这样的

# python dashboard
import tkinter as tk
from tkinter import *


class AutoScrollbar(Scrollbar):
    def set(self, lo, hi):
        if float(lo) <= 0.0 and float(hi) >= 1.0:
            self.tk.call("grid", "remove", self)
        else:
            self.grid()
        Scrollbar.set(self, lo, hi)
    def pack(self, **kw):
        raise TclError("cannot use pack with this widget")
    def place(self, **kw):
        raise TclError("cannot use place with this widget")


class Dashboard():
    def __init__(self, root):
        self.root=root
        root.title("Dashboard View")

        vsb = AutoScrollbar(root)
        vsb.grid(row=0, column=1, sticky=N+S)
        hsb = AutoScrollbar(root, orient=HORIZONTAL)
        hsb.grid(row=1, column=0, sticky=E+W)

        self.canvas=tk.Canvas(root,yscrollcommand=vsb.set,
            xscrollcommand=hsb.set,background='blue')

        vsb.config(command=self.canvas.yview)
        hsb.config(command=self.canvas.xview)

        root.grid_rowconfigure(0, weight=1)
        root.grid_columnconfigure(0, weight=1)

        self.canvas.grid(row=0,column=3)
        frame = Frame(self.root, bd=2, relief=SUNKEN)
        frame.grid(row=0,column=0, sticky="nw")
        Button1=Button(frame,text="Status").grid(row = 0,column = 0, sticky = "we")
        Button2=Button(frame,text="Processes").grid(row = 0,column = 1, sticky = "we")
        Button3=Button(frame,text="Links").grid(row = 1,column = 0, sticky = "we")
        Button4=Button(frame,text="Traffic").grid(row = 1,column = 1, sticky = "we")
        Button5=Button(frame,text="App Version").grid(row = 2,column = 0, sticky = "we")
        Button5=Button(frame,text="Archive/Purge").grid(row = 2,column = 1, sticky = "we")

        fhandle = open("dashboard_content.txt")
        lines = fhandle.read()
        fhandle.close()
        text1=self.canvas.create_text(400, 400, fill="white")
        self.canvas.itemconfig(text1, text=lines)

        frame.update_idletasks()

        self.canvas.config(scrollregion=self.canvas.bbox("all"))

if __name__== '__main__':
    root=tk.Tk()
    board=Dashboard(root)
    root.mainloop()

如何让 Canvas 窗口的滚动条“到蓝色背景”?

【问题讨论】:

标签: python tkinter scrollbar


【解决方案1】:

我猜你的意思是你想留下画布周围的所有空白空间,但你希望滚动条“粘”在画布的一侧。

实现这一点的最简单方法是将画布和滚动条放在一个框架中,以便它们作为一个单独的单元。

例如:

class Dashboard():
    def __init__(self, root):
        ....
        canvasContainer = tk.Frame(root)
        self.canvas = tk.Canvas(canvasContainer, ...)
        vsb = AutoScrollbar(canvasContainer, ...)
        hsb = AutoScrollbar(canvasContainer, ...)
        vsb.grid(row=0, column=0, sticky="ns")
        hsb.grid(row=1, column=1, sticky="ew")
        self.canvas.grid(row=0, column=1, sticky="nsew")
        canvasContainer.grid_rowconfigure(0, weight=1)
        canvasContainer.grid_columnconfigure(1, weight=0)
        ...
        canvasContainer.grid(row=0, column=3)
        ...

【讨论】:

    【解决方案2】:

    @Bryan,好吧,我只想将滚动条粘贴到画布区域,并在左侧有一个带有按钮的侧边栏。通过对您的建议进行一些修改,我可以设法实现。这就是我所做的。

        # python dashboard
    
    import tkinter as tk
    from tkinter import *
    
    class AutoScrollbar(Scrollbar):
        def set(self, lo, hi):
            if float(lo) <= 0.0 and float(hi) >= 1.0:
                self.tk.call("grid", "remove", self)
            else:
                self.grid()
            Scrollbar.set(self, lo, hi)
        def pack(self, **kw):
            raise TclError("cannot use pack with this widget")
        def place(self, **kw):
            raise TclError("cannot use place with this widget")
    
    class Dashboard():
        def __init__(self, root):
            self.root=root
            root.title("Dashboard View")
    
            canvasContainer = tk.Frame(root)
            self.canvas=tk.Canvas(canvasContainer,background='blue')
    
            fhandle = open("dashboard_content.txt")
            lines = fhandle.read()
            fhandle.close()
    
            text1=self.canvas.create_text(400, 400, fill="white")
            self.canvas.itemconfig(text1, text=lines)
    
            vsb = AutoScrollbar(canvasContainer,orient=VERTICAL)
            hsb = AutoScrollbar(canvasContainer, orient=HORIZONTAL)
            vsb.grid(row=0, column=2, sticky="ns")
            hsb.grid(row=1, column=1, sticky="ew")
            self.canvas.grid(row=0,column=1,sticky="news")
            self.canvas.config(yscrollcommand=vsb.set, xscrollcommand=hsb.set, scrollregion=self.canvas.bbox("all"))
    
    
            vsb.config(command=self.canvas.yview)
            hsb.config(command=self.canvas.xview)
    
            canvasContainer.grid_rowconfigure(0, weight=1)
            canvasContainer.grid_columnconfigure(0, weight=1)
    
            canvasContainer.grid(row=0,column=3)
            frame = Frame(self.root, bd=2, relief=SUNKEN)
            frame.grid(row=0,column=0, sticky="nw")
            Button1=Button(frame,text="Status").grid(row = 0,column = 0, sticky = "we")
            Button2=Button(frame,text="Processes").grid(row = 0,column = 1, sticky = "we")
            Button3=Button(frame,text="Links").grid(row = 1,column = 0, sticky = "we")
            Button4=Button(frame,text="Traffic").grid(row = 1,column = 1, sticky = "we")
            Button5=Button(frame,text="App Version").grid(row = 2,column = 0, sticky = "we")
            Button5=Button(frame,text="Archive/Purge").grid(row = 2,column = 1, sticky = "we")
    
            self.canvas.update_idletasks()
    #        Grid.columnconfigure(self.root,1,weight=1, minsize=100)
    
    if __name__== '__main__':
        root=tk.Tk()
        board=Dashboard(root)
        root.mainloop()
    

    任何想法,我怎样才能使整个窗口可展开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      相关资源
      最近更新 更多