Реализация полосы прокрутки внутри холста Ошибка атрибута - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь реализовать полосу прокрутки внутри более крупной программы. Я столкнулся с некоторыми проблемами AtrributeError. Итак, чтобы исправить это, я сделал более простой код, который показан ниже.

-Полоса прокрутки должна прокручивать холст горизонтально, а не текстовый виджет.

-Эта более простая программа имеет только 2 виджета tk.Text (склеенных с помощью 'side="left"')

-Большая программа имеет 18 тк.Текст, поэтому мне очень нужна горизонтальная полоса прокрутки

-Мне тоже возникают некоторые проблемы с холстом, так как текстовые виджеты не находятся внутри холста.

Я пробовал некоторые решения, которые уже существуют, но есть некоторые программы разногласий, которые я не могу прочитать очень хорошо (так как я не профессионал в tkinter). Может кто-нибудь, пожалуйста, помогите мне, чего не хватает в моем коде, чтобы этот AtrributeError исчез?

Мне нужны tk.Texts внутри холста, а сам холст прокручивается

EDIT1: Теперь программаэто так, но полоса прокрутки не прокручивается

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

1 Ответ

0 голосов
/ 09 октября 2019

Во-первых, вы никогда не должны pack, grid из place любого виджета 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 itseld, а не для его функции set, как указано ниже:

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

Наконец, установите scrollregion для холста следующим образом:

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