Уведомления

Группа в Telegram: @pythonsu

#1 Март 20, 2019 18:58:12

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

О прокрутке 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)

Офлайн

#2 Март 22, 2019 10:48:48

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

Смотрите такой вариант (это только образец, без обработки данных):

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

Офлайн

#3 Март 22, 2019 19:35:31

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

[tkinter] Как развернуть tk.Canvas до размеров tk.Frame?

rami
Ух ты! Спасибо, буду изучать.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version