【问题标题】:Implementing scrollbar inside canvas Attribute error在画布内实现滚动条属性错误
【发布时间】:2019-10-09 13:30:59
【问题描述】:

我正在尝试在更大的程序中实现滚动条。我正面临一些 AttributeError 问题。所以,为了解决这个问题,我制作了一个更简单的代码,如下所示。

-滚动条必须水平滚动画布而不是文本小部件。

-这个更简单的程序只有 2 个 tk.Text 小部件(由 'side="left"' 粘合)

-更大的程序有 18 个 tk.Text 所以我真的需要水平滚动条

-我也面临一些画布问题,因为文本小部件不在画布内。

我尝试了一些已经存在的解决方案,但是在程序方面存在一些分歧,我不能很好地阅读(因为我不是 tkinter 的专业人士)。有人可以帮我吗,我的代码中缺少什么来使这个 AtrributeError 消失?

我需要画布内的 tk.Texts 并且画布本身是可滚动的

编辑1: 现在程序是这样的,但是滚动条不能滚动

import tkinter as tk
from tkinter import ttk

class Test(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.canvas = tk.Canvas(master)
        self.canvas.pack(side='top')
        self.frame = ttk.Frame(self.canvas)
        self.frame.pack(side='bottom', fill='x', expand=True)

        self.text = tk.Text(self.canvas, width= 5).pack(side='left')
        self.text2 = tk.Text(self.canvas, width=5).pack(side='left')
        self.text3 = tk.Text(self.canvas, width=5).pack(side='left')
        self.text4 = tk.Text(self.canvas, width=5).pack(side='left')
        self.text5 = tk.Text(self.canvas, width=5).pack(side='left')
        self.text6 = tk.Text(self.canvas, width=5).pack(side='left')
        self.text7 = tk.Text(self.canvas, width=5).pack(side='left')
        self.text8 = tk.Text(self.canvas, width=5).pack(side='left')

        self.scroll = ttk.Scrollbar(self.frame, orient='horizontal', command=self.canvas.xview)
        self.scroll.pack(side='bottom', fill='x')
        self.canvas['xscrollcommand'] = self.scroll
        self.canvas["scrollregion"] = self.canvas.bbox('all')

root = tk.Tk()
root.geometry('100x300')
test = Test(root)
root.mainloop()

【问题讨论】:

    标签: python tkinter scrollbar


    【解决方案1】:

    首先,你不应该在packgridplace 中使用如下任何 Tkinter 小部件:

    self.canvas = tk.Canvas(master).pack(side='top')
    

    这会将self.canvas 设置为None。而是执行以下操作:

    self.canvas = tk.Canvas(master)
    self.canvas.pack(side = 'top')
    

    其次,self.canvas['vscrollcommand'] 行中有错字。应该是yscrollcommand。此外,yscrollcommand 需要分配给 Scrollbar 其字段,而不是其 set 函数,如下所示:

    self.canvas.config(yscrollcommand = self.scroll)
    

    最后,为画布设置scrollregion,如下所示:

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

    【讨论】:

    • " 此外,yscrollcommand 需要分配给 Scrollbar 本身,而不是其 set 函数" - 这是一个错误的陈述。它需要指向滚动条的set方法,或者其他实现相同API的函数。
    • 使用这些条件,我的滚动条无法正常工作,要么显示“禁用”功能(它存在但不可选择)(使用 self.scroll.set),要么滚动条存在但不工作正确(它没有被禁用,它在那里但没有窗口可以在滚动条的栏中拖动)。如何实现正确的滚动方式
    猜你喜欢
    • 2021-05-19
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2012-05-09
    • 2017-07-03
    • 1970-01-01
    • 2019-01-24
    • 2016-03-11
    相关资源
    最近更新 更多