tkinter: использование полос прокрутки на canvasе

Я пытаюсь сделать canvas прокручиваемым. Однако, как только я пытаюсь настроить полосы прокрутки для работы с canvasом, tkinter, кажется, полностью игнорирует размеры, которые я первоначально установил для своего canvasа. Я попытался упаковать их все в рамку, установив canvas, чтобы заполнить фрейм, а затем установить размер кадра, но это представляет ту же проблему, если я не установил кадр для заполнения windows, а это не то, что я хочу , В принципе, я хочу canvas с фиксированным размером с полосами прокрутки на нем. Мой текущий код выглядит так (в python 3.1):

from tkinter import * root=Tk() frame=Frame(root,width=300,height=300) frame.grid(row=0,column=0) canvas=Canvas(frame,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500)) hbar=Scrollbar(canvas,orient=HORIZONTAL) hbar.pack(side=BOTTOM,fill=X) hbar.config(command=canvas.xview) vbar=Scrollbar(canvas,orient=VERTICAL) vbar.pack(side=RIGHT,fill=Y) vbar.config(command=canvas.yview) canvas.config(width=300,height=300) canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) canvas.pack(side=LEFT,expand=True,fill=BOTH) root.mainloop() 

Ваши полосы прокрутки должны иметь Frame как родительский, а не Canvas:

 from tkinter import * root=Tk() frame=Frame(root,width=300,height=300) frame.grid(row=0,column=0) canvas=Canvas(frame,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500)) hbar=Scrollbar(frame,orient=HORIZONTAL) hbar.pack(side=BOTTOM,fill=X) hbar.config(command=canvas.xview) vbar=Scrollbar(frame,orient=VERTICAL) vbar.pack(side=RIGHT,fill=Y) vbar.config(command=canvas.yview) canvas.config(width=300,height=300) canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) canvas.pack(side=LEFT,expand=True,fill=BOTH) root.mainloop() 

Причина, по которой это работает, объясняется тем, как работает pack . По умолчанию он попытается сжать (или увеличить) контейнер, чтобы он точно соответствовал его детям. Поскольку полосы прокрутки являются дочерними элементами canvasа в исходном примере, canvas сжимается, чтобы соответствовать.

Если вы хотите, чтобы полосы прокрутки появлялись внутри canvasа, трюк заключается в использовании дополнительного фрейма. Поместите canvas и полосы прокрутки в этот внутренний фрейм, поверните границы с canvasа и включите для frameworks. Установите фон кадра так же, как и canvas, и появится, что полосы прокрутки находятся внутри canvasа.

  • Как связать ключ ввода с функцией в tkinter?
  • Как скомпилировать приложение Python 3 в .exe?
  • tkinter создает кнопки для аргументов команды прохождения цикла
  • Давайте будем гением компьютера.