Форум сайта python.su
О прокрутке canvas неплохо описано у Лутца: “Программирование на питон. Том 1”, стр.715 и далее в четвёртом издании. Вот пример из исходников к книге:
"a simple vertically-scrollable canvas component and demo" from tkinter import * class ScrolledCanvas(Frame): def __init__(self, parent=None, color='brown'): Frame.__init__(self, parent) self.pack(expand=YES, fill=BOTH) # make me expandable canv = Canvas(self, bg=color, relief=SUNKEN) canv.config(width=300, height=200) # display area size canv.config(scrollregion=(0, 0, 300, 1000)) # canvas size corners canv.config(highlightthickness=0) # no pixels to border sbar = Scrollbar(self) sbar.config(command=canv.yview) # xlink sbar and canv canv.config(yscrollcommand=sbar.set) # move one moves other sbar.pack(side=RIGHT, fill=Y) # pack first=clip last canv.pack(side=LEFT, expand=YES, fill=BOTH) # canv clipped first self.fillContent(canv) canv.bind('<Double-1>', self.onDoubleClick) # set event handler self.canvas = canv def fillContent(self, canv): # override me below for i in range(10): canv.create_text(150, 50+(i*100), text='spam'+str(i), fill='beige') def onDoubleClick(self, event): # override me below print(event.x, event.y) print(self.canvas.canvasx(event.x), self.canvas.canvasy(event.y)) if __name__ == '__main__': ScrolledCanvas().mainloop()
Отредактировано Rafik (Март 20, 2019 18:59:00)
Офлайн
Смотрите такой вариант (это только образец, без обработки данных):
from tkinter import Tk, Scrollbar, Canvas, Frame, Label, Button, Checkbutton from tkinter.ttk import Panedwindow, Combobox class Myframe(Frame): """ Создаёт фрейм с полосой прокрутки справа. После добавления или удаления виджетов в прокручиваемый фрейм, вызывается метод update(), чтобы обновить прокручиваемую область. """ def __init__(self, frame, **kw): scrollbar = Scrollbar(frame) scrollbar.pack(side='right', fill='y', expand=False) self.canvas = Canvas(frame, yscrollcommand=scrollbar.set) self.canvas.pack(side='left', fill='both', expand=True) scrollbar.config(command=self.canvas.yview) Frame.__init__(self, frame, **kw) #инициализация базового класса self.windows_item = self.canvas.create_window(0,0, window=self, anchor='nw') self.canvas.config(**kw) def update(self): """Обновляет canvas и область прокрутки""" self.update_idletasks() self.canvas.config(scrollregion=self.canvas.bbox(self.windows_item)) def foo(): "Функция для примера" print('Вспомогательные словари...') root = Tk() root.title('Параметры Word') root.resizable(width=False, height=False) pw = Panedwindow(root) #боковое меню с кнопками pw.pack(side="left", fill="both", expand=True) pw.add(Label(text='Основные', anchor='w')) pw.add(Button(text='Экран', anchor='w')) pw.add(Label(text='Настройка', anchor='w')) pw.add(Button(text='Правописание', anchor='w')) pw.add(Button(text='Центр управления безопасностью', anchor='w')) pw.add(Frame()) header = Frame(root) header.pack() body = Frame(root) body.pack() footer = Frame(root) footer.pack() Label(header, text="Настройки правописания:").pack() Label(footer, text="Доступные действия:").pack(side='left', ipadx=20) Button(footer, text='Отменить').pack(side='left', ipadx=20) Button(footer, text='Закрыть').pack(side='left', ipadx=20) fr = Myframe(body, width=500, height=300) #наполняем фрейм виджетами Checkbutton(fr, text='Пропускать слова из прописных букв').grid(column=0, row=0, columnspan=3, sticky='w') Checkbutton(fr, text='Пропускать слова с цифрами').grid(column=0, row=1, columnspan=3, sticky='w') Checkbutton(fr, text='Пропускать адреса Интернета и имена файлов').grid(column=0, row=2, columnspan=3, sticky='w') Checkbutton(fr, text='Помечать повторяющиеся слова').grid(column=0, row=3, columnspan=3, sticky='w') Checkbutton(fr, text='Немецкий: применять новые правила').grid(column=0, row=4, columnspan=3, sticky='w') Checkbutton(fr, text='Предлагать только из основного словаря').grid(column=0, row=5, columnspan=3, sticky='w') Button(fr, text='Вспомогательные словари...', command=foo).grid(column=0, row=6, columnspan=2, sticky='w', pady=15) Label(fr, text='При исправлении правописания в Word', anchor='w').grid(column=0, row=7, columnspan=3, sticky='w') Label(fr, text='Набор правил: ').grid(column=0, row=8, pady=15) Combobox(fr, values=['Для деловой переписки', 'Пропускать слова']).grid(column=1, row=8) Button(fr, text='Настройка').grid(column=2, row=8) Button(fr, text='Повторная проверка').grid(column=0, row=9, pady=15) Label(fr, text='Исключения для файла: ').grid(column=0, row=10, pady=15) Combobox(fr, values=['Документ WordPad.doc', 'Пропускать слова.doc']).grid(column=1, row=10) Checkbutton(fr, text='Пропускать слова').grid(column=0, row=11, columnspan=3, sticky='w') Checkbutton(fr, text='Пропускать слова').grid(column=0, row=12, columnspan=3, sticky='w') Checkbutton(fr, text='Пропускать слова').grid(column=0, row=13, columnspan=3, sticky='w') Checkbutton(fr, text='Пропускать слова').grid(column=0, row=14, columnspan=3, sticky='w') Checkbutton(fr, text='Пропускать слова').grid(column=0, row=15, columnspan=3, sticky='w') Checkbutton(fr, text='Пропускать слова').grid(column=0, row=16, columnspan=3, sticky='w') Checkbutton(fr, text='Пропускать слова').grid(column=0, row=17, columnspan=3, sticky='w') Checkbutton(fr, text='Пропускать слова').grid(column=0, row=18, columnspan=3, sticky='w') fr.update() root.mainloop()
Офлайн
rami
Ух ты! Спасибо, буду изучать.
Офлайн