【问题标题】:Python: Scrollbar in Tkinter with canvasPython:带有画布的 Tkinter 中的滚动条
【发布时间】:2020-09-17 18:24:56
【问题描述】:

我使用 Canvas 为我的 tkinter 应用程序使用了滚动条。我正在使用 Pack 来设置滚动条。但我有一个问题。水平滚动条工作正常,但垂直滚动条不行。位置配置错误。

我的代码:

    self.scroll_x = tk.Scrollbar(self, orient=tk.HORIZONTAL)
    self.scroll_y = tk.Scrollbar(self, orient=tk.VERTICAL)
    self.canvas = tk.Canvas(self, width=600, height=100,
    xscrollcommand=self.scroll_x.set,
    yscrollcommand=self.scroll_y.set)
    self.scroll_x.config(command=self.canvas.xview)
    self.scroll_y.config(command=self.canvas.yview)
    self.frame = tk.Frame(self.canvas)

     self.canvas.create_window((0, 0), window=self.frame,anchor=tk.NW)
     self.canvas.bind_all("<MouseWheel>", self.on_mousewheel)
     self.canvas.config(scrollregion=self.canvas.bbox(tk.ALL))
     self.canvas.pack(side=tk.LEFT,expand=True,fill=tk.BOTH)
     self.scroll_x.pack(side=tk.BOTTOM,fill=tk.X)
     self.scroll_y.pack(side=tk.RIGHT,fill=tk.Y)
     self.bind("<Configure>", self.resize)
            
     self.update_idletasks()

def on_mousewheel(self, event):
    shift = (event.state & 0x1) != 0
    scroll = -1 if event.delta > 0 else 1
    if shift:
        self.canvas.xview_scroll(scroll, "units")
    else:
        self.canvas.yview_scroll(scroll, "units")

def resize(self, event):
    region = self.canvas.bbox(tk.ALL)
    self.canvas.configure(scrollregion=region)

【问题讨论】:

  • 您能否指定“位置配置错误。”给我们?
  • 另外,您能否与我们分享一下您在滚动区域中拥有的至少一个小部件?
  • 水平滚动条配置错误。 self.scrollbox = tk.Scrollbar (self, orient = tk.HORIZONTAL) self.scroll_x.pack (side = tk.BOTTOM, fill = tk.X)
  • 您是否也在滚动条上尝试expand=True

标签: python tkinter


【解决方案1】:

我建议在这种情况下使用网格。 See more

import tkinter as tk

class MyFigure(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        
        self.scroll_x = tk.Scrollbar(self, orient=tk.HORIZONTAL)
        self.scroll_y = tk.Scrollbar(self, orient=tk.VERTICAL)
        self.canvas = tk.Canvas(self, width=600, height=100, bg='red',
                                xscrollcommand=self.scroll_x.set,
                                yscrollcommand=self.scroll_y.set)
        self.scroll_x.config(command=self.canvas.xview)
        self.scroll_y.config(command=self.canvas.yview)
        self.frame = tk.Frame(self.canvas)
        self.canvas.create_window((0, 0), window=self.frame,anchor=tk.NW)
        self.canvas.bind_all("<MouseWheel>", self.on_mousewheel)
        self.canvas.config(scrollregion=self.canvas.bbox(tk.ALL))
        
        self.canvas.grid(column=0,row=0)
        self.scroll_x.grid(column=0,row=1,sticky='ew')
        self.scroll_y.grid(column=1,row=0,sticky='ns')
        self.bind("<Configure>", self.resize)

    def on_mousewheel(self, event):
        shift = (event.state & 0x1) != 0
        scroll = -1 if event.delta > 0 else 1
        if shift:
            self.canvas.xview_scroll(scroll, "units")
        else:
            self.canvas.yview_scroll(scroll, "units")

    def resize(self, event):
        region = self.canvas.bbox(tk.ALL)
        self.canvas.configure(scrollregion=region)

root = tk.Tk()
mf = MyFigure(root)
mf.pack()
root.mainloop()

如果您真的需要使用 pack,请注意,以复杂的方式使用它,打包小部件的顺序很重要。我认为使用网格订购框架的其余部分更容易,而不是尝试将它们打包在一起。

不管怎样,替换上面代码中的这些行就可以了:

self.scroll_x.pack(side=tk.BOTTOM,fill=tk.X)
self.canvas.pack(side=tk.LEFT,expand=True,fill=tk.BOTH)
self.scroll_y.pack(side=tk.LEFT,fill=tk.Y)

【讨论】:

  • 感谢您的回复。我不能使用网格,因为我在使用包的类的其他地方使用包。
  • @Jena:你可以创建一个只有画布和滚动条的框架,并在其中使用网格,同时仍然使用包将框架添加到 UI 的其余部分
  • 是的。在每个主(窗口/框架)中,您可以选择要使用的管理器。让我知道它是否适合您。
猜你喜欢
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 2017-07-03
  • 2014-06-04
  • 2015-02-08
  • 1970-01-01
相关资源
最近更新 更多