Добавляем картинки и пишем тамагочи
На самом деле все просто, достаточно просто добавить Label и задать для него фоновое изображение. Картинку можно утащить отсюда. Вот так.
from tkinter import * window = Tk() # открываем картинку luntik.gif, она лежит в одной папке с программой и кладем в переменную luntik_image luntik_image = PhotoImage(file='luntik.gif') # создаем текстовое поле и указываем, что туда нужно поместить картинку из переменной luntik_image Label(window, image=luntik_image).pack() mainloop()
Но есть один нюанс: tkinter не умеет работать с большинством популярных форматов графики, из коробки доступен только gif. Однако эта проблема легко решается установкой стороннего модуля Pillow !
Установка сторонних модулей
Если нам не хватает операций языка Python, а также встроенных модулей (библиотек), наступает тот самый момент, когда пора воспользоваться сторонними модулями.
Для установки модулей необходимо использовать программу pip, которая устанавливается на ваш компьютер вместе в питоном. Единственный нюанс, pip работает только через командную строку. Для ее вызова необходимо нажать Win+R , а затем в окне «Выполнить» ввести cmd и нажать Enter.
Для Mac вызов командной строки устроен аналогично, только вместо Win+R нужно использоватьл комбинацию Command + пробел , а затем в поле Spotlight ввести terminal.
Чтобы вызвать установщик пакетов, достаточно написать в консоли pip (или pip3 , если не работает команда pip ) и нажать Enter . Вы увидите что то похоже на.
Если команда pip не найдена, скорее всего при установке python вы не активировали галочку «Add to PATH».
Есть два варианта решения проблемы: переустановить python или добавить путь к питону в PATH вручную.
Добавляя к команде pip различные параметры, мы можем выполнять различные операции. Для начала давайте попробуем вывести список модулей, установленных на вашем компьютере. Для этого в командной строке необходимо ввести pip list , а затем нажать клавишу Enter (клавиша Enter нажимается для любой операции в командной строке).
В ответ мы получим длинный список из двух колонок, как на картинке выше. Слева пишется имя модуля, а справа текущая версия этого модуля. Если хотим посмотреть, установлен ли у нас какой-то конкретный модуль, то нужно ввести pip show . Для примера посмотрим, есть ли у меня модуль pillow , который мы будем будем использовать для работы с графикой.
Как видишь, уже есть. Более того, в информации указана версия, автор и прочая информация. Если же модуль не установлен или при вводе названия допущена ошибка, то информация не будет выведена.
Наличие больших и маленьких букв в названии модуля роли не играет. Даже если ввести pip show PiLloW , pip все равно вывел бы информацию о нем. Если какой-то модуль нам больше не нужен или возникла какая-то неполадка в его работе, то мы можем его удалить, введя pip uninstall .
Ничего сложного! А если я хочу обратно его установить, то мне нужно ввести pip install .
Вот и все. После установки, можно спокойно импортировать модули так же, как это было показано в предыдущих параграфах.
Мы перечислили некоторые самые важные возможности pip , хотя это далеко не полный их перечень. Для более подробного знакомства обратитесь к документации pip.
Поиск подходящих вам модулей можно осуществлять не только на в поисковике (Google, Yandex и т.д.), в качестве базы для поиска можно использовать Pypi, LDF или GitHub. Pypi содержит в себе поисковик, который позволяет отыскать не только модули, но и любые их модификации. После их можно установить либо по называнию pip install , либо скачать файл *.whl , который содержит ваш модуль.
Установка из файла аналогичена установке по названию. Сначала вам нужно вам нужно переместится в папку, где хранится файл *.whl , используя команду cd , а затем применить команду pip install . На LDF хранятся модули в формате *.whl , некоторые из которых уже нельзя найти на Pypi.
Также необходимый модуль можно установить из исходников с помощью команды pip install https://github.com/// . Так например, мы можем поставить pillow вот такой командой: pip install https://github.com/python-pillow/Pillow/master.zip .
Используем картинки любых форматов и меняем их размер
Итак, удобнее всего открывать картинки с использованием библиотеки для работы с графикой Pillow.
Сперва библиотеку нужно установить. Для этого в консоли нужно выполнить команду:
pip3 install pillow
Если консоль попросит права администратора, можно установить библиотеку только для своего пользователя.
pip3 install --user pillow
После этого можно открывать файлы в любых форматах.
from tkinter import * # импортируем функционал для работы с картинками из pillow, которую мы только что установили from PIL import Image, ImageTk window = Tk() # открываем изображение любого формата и кладем его в переменную image_file image_file = Image.open("brothers.jpeg") # "готовим" изображение к размещению в окне и кладем в переменную vp_image vp_image = ImageTk.PhotoImage(image_file) # добавляем после и устанавливаем картинку в качестве фона Label(window, image=vp_image).pack() mainloop()
В качестве бонуса — изменить размер картинки теперь можно прямо в коде.
# открываем изображение любого формата и кладем его в переменную image_file image_file = Image.open("brothers.jpeg") # меняем размер картинки на 300 на 300 пикселей image_file = image_file.resize((300, 300), Image.LANCZOS) # "готовим" изображение к размещению в окне и кладем в переменную vp_image vp_image = ImageTk.PhotoImage(image_file)
Используем таймер, цвет и размер шрифта
Сейчас наше приложение умеет реагировать только на нажати кнопок, но часто приложениям требуется обновиться самостоятельно. Например, раз в несколько секунд.
Для этого можно попросить tkinter вызвать нашу функцию не после нажатия на кнопку, а просто через несколько миллисекунд или секунд. Делается это с помощью метода after() . В примере ниже попробуем обновлять случайное число раз в секунду.
import random from tkinter import * # функция, которая будет обновлять число на экране def update_number(): # генерируем и записываем число в текстовое поле label.config(text=random.randint(1, 100)) # просим window вызвать функцию update_number еще раз через секунду (1000 мс) window.after(1000, update_number) window = Tk() # создаем текстовое поле # дополнительно указываем шрифт (семейство - Comic Sans MS, 25 - размер) и цвет (fg - foreground color) # padx и pady (padding x, padding y) в параметрах pack - это отступы от справа/слева и сверху/снизу label = Label(window, font=("Comic Sans MS", 25), fg="green") label.pack(padx=50, pady=50) # просим window вызвать функцию update_number через секунду (1000 мс) window.after(1000, update_number) mainloop()
Программа выше будет раз в секунду менять число на экране.
Анимация
А что если совместить вывод изображений и таймер? Получится анимация!
Единственное, что нам потребуется для этого — научится изменять уже заданную картинку с помощью .configure() .
Делается это так:
img1 = ImageTk.PhotoImage(Image.open("face1.jpg")) img2 = ImageTk.PhotoImage(Image.open("face2.jpg")) image_label = Label(window, image=img1) image_label.pack() # когда хотим поменять картинку - вызываем configure image_label.configure(image=img2)
Ниже пример простой анимации — лицо меняется каждые 800 мс.
from tkinter import * from PIL import Image, ImageTk import psutil # функция, которая будет двигать картинки def next_img(): global pic_number # если номер был 0 - он станет 1, а если был 1 - станет 0 pic_number = (pic_number + 1) % 2 # в зависимости от номера, выбираем нужную картинку if pic_number == 0: # и устанавливаем ее в image_label image_label.configure(image=img1) if pic_number == 1: image_label.configure(image=img2) # через долю секунды - вызываем смену картинки снова window.after(800, next_img) window = Tk() window.title("FaceIt") # открываем две картинки и изменяем их размер до 300 пикселей img1 = ImageTk.PhotoImage(Image.open("face1.jpg").resize((300, 300), Image.ANTIALIAS)) img2 = ImageTk.PhotoImage(Image.open("face2.jpg").resize((300, 300), Image.ANTIALIAS)) # тут будем хранить номер картинки, которую показываем сейчас pic_number = 0 # чтобы иметь возможность менять картинку, сохраняем поле в переменную image_label image_label = Label(window, image=img1) image_label.pack() # спустя долю секунды просим поменять картинку - запустить функцию next_img window.after(800, next_img) mainloop()
Бонус! Как заставить тамагочи жить, даже если программа закрыта?
Можно вычислять состояние питомца исходя из времени прошлого кормления / игры / купания, а это время сохранять в файл. Для простоты давайте использовать отдельные файлы для каждого действия — кормежки / игры и тд. Ниже пример с едой, для остальных — по аналогии.
Как сохранить время действия в файл?
import time # предположим, мы только что покормили питомца, фиксируем сколько сейчас времени last_feed_time = time.time() # открываем файл для записи with open('last_feed_time.txt', 'w') as file: # превращаем время в строку и записываем в файл file.write(str(last_feed_time))
Как достать время последнего из файла?
import time # если файл существует try: # открываем файл для чтения with open('last_feed_time.txt', 'r') as file: # и считываем время прошлой кормежки last_feed_time = int(file.read()) # а если файла нет except: # считаем, что только покормили last_feed_time = time.time()
Как вычислить сколько сейчас «жизни» исходя из прошедшего времени?
import time # это значение нужно взфть из файла, для примера просто возьмем текущее время минус 40 секунд last_feed_time = time.time() - 40 # максимум "жизни" max_life = 100 # сколько секунд на одну единицу "жизни" seconds_for_life_point = 10 # сколько времени прошло с прошлого кормления elapsed_time = time.time() - last_feed_time # жизнь не может быть меньше нуля life = max(0, int(max_life - elapsed_time / seconds_for_life_point))
Бонус! Прогресс-бар для отображения статуса питомца.
from tkinter.ttk import * from tkinter import * from tkinter import messagebox life = 100 # Функция для уменьшения жизни каждую секунду def check_life(): global life # уменьшаем жизнь life -= 1 # узаписываем жизнь в прогрессбар progress['value'] = life # если жизни мало - закрываем приложение if life
Вставить картинку в Label
Пытаюсь вставить в Label картинку, но выдает ошибку Image ". " does not exist , путь точно верный.
from tkinter import * tk = Tk() img = PhotoImage("C:/Users/Public/Pictures/Sample Pictures/Lighthouse.jpg") b = Label(image = img) b.img = "C:/Users/Public/Pictures/Sample Pictures/Lighthouse.jpg" b.pack() tk.mainloop()
Искал, да так и не нашел, в чем проблема. Пробовал писать im = Image.open(path_to_file) и соответственно img = PhotoImage(im) , но выдает ошибку.
Отслеживать
49.3k 17 17 золотых знаков 57 57 серебряных знаков 101 101 бронзовый знак
задан 27 мая 2020 в 22:35
Werflame Xij Werflame Xij
81 1 1 золотой знак 3 3 серебряных знака 10 10 бронзовых знаков
Python. Работа с изображениями в tkinter.
На уроке Python. Работа с изображениями мы с вами научились загружать и отображать картинки, а также всяко извращаться с ними. Это мы делали при помощи библиотеки PIL. На уроке Python. GUI мы с вами при помощи библиотеки tkinter создавали виндовый интерфейс программы: всякие кнопочки, флажки, и прочие элементы управления. Но возникает вопрос: а нельзя ли при помощи tkinter как-то выводить изображение на виндовую форму? Можно. Например вот такая программа:
import tkinter from PIL import Image, ImageTk root = tkinter.Tk() # создаем рабочую область frame = tkinter.Frame(root) frame.grid() #Добавим метку label = tkinter.Label(frame, text="Hello, World!").grid(row=1,column=1) # вставляем кнопку but = tkinter.Button(frame, text="Кнопка").grid(row=1, column=2) #Добавим изображение canvas = tkinter.Canvas(root, height=400, width=700) image = Image.open("d:/3/Dscn0116.jpg") photo = ImageTk.PhotoImage(image) image = canvas.create_image(0, 0, anchor='nw',image=photo) canvas.grid(row=2,column=1) root.mainloop()
выдаст вот такое окно:
Что интересно, PIL здесь нужен, чтобы загружать изображения типа jpg, gif-ы и png можно открыть и без него:
import tkinter root = tkinter.Tk() # создаем рабочую область frame = tkinter.Frame(root) frame.grid() #Добавим метку label = tkinter.Label(frame, text="Hello, World!").grid(row=1,column=1) # вставляем кнопку but = tkinter.Button(frame, text="Кнопка").grid(row=1, column=2) #Добавим изображение canvas = tkinter.Canvas(root, height=400, width=700) img = tkinter.PhotoImage(file = 'd:/3/Dscn0116.png') image = canvas.create_image(0, 0, anchor='nw',image=img) canvas.grid(row=2,column=1) root.mainloop()
А теперь попробуем при нажатии на кнопку сменить изображение:
import tkinter from PIL import Image, ImageTk root = tkinter.Tk() # создаем рабочую область frame = tkinter.Frame(root) frame.grid() # Добавим метку label = tkinter.Label(frame, text="Hello, World!").grid(row=1, column=1) image = Image.open("d://1//DSCN1128.png") photo = ImageTk.PhotoImage(image) def my_event_handler(): print("my_event_handler") image = Image.open("d://1//original.jpg") photo = ImageTk.PhotoImage(image) image = canvas.create_image(0, 0, anchor='nw', image=photo) canvas.grid(row=2, column=1) # вставляем кнопку but = tkinter.Button(frame, text="Кнопка", command=my_event_handler).grid(row=1, column=2) # Добавим изображение canvas = tkinter.Canvas(root, height=400, width=700) image = canvas.create_image(0, 0, anchor='nw', image=photo) canvas.grid(row=2, column=1) root.mainloop()
Но не тут то было. При нажатии на кнопку изображение не меняется. Хотя, казалось бы, все написано правильно, и наш обработчик событий работает, наше сообщение, что мы выводим командой print выводится в окно сообщений. В чем же дело? А дело в сборщике мусора (garbage collector). Как только мы вышли из my_event_handler, локальные переменные тут же уничтожаются сборщиком мусора. Именно поэтому мы видим на форме ту же самую картинку, что и до нажатия на кнопку. Как же быть? Не использовать локальные переменные. Давайте объявим класс, пусть изображение и прочие объекты хранятся в его полях:
import tkinter from PIL import Image, ImageTk class App: def __init__(self): self.root = tkinter.Tk() # создаем рабочую область self.frame = tkinter.Frame(self.root) self.frame.grid() # Добавим метку self.label = tkinter.Label(self.frame, text="Hello, World!").grid(row=1, column=1) self.image = Image.open("d://1//DSCN1128.png") self.photo = ImageTk.PhotoImage(self.image) # вставляем кнопку self.but = tkinter.Button(self.frame, text="Кнопка", command=self.my_event_handler).grid(row=1, column=2) # Добавим изображение self.canvas = tkinter.Canvas(self.root, height=600, width=700) self.c_image = self.canvas.create_image(0, 0, anchor='nw', image=self.photo) self.canvas.grid(row=2, column=1) self.root.mainloop() def my_event_handler(self): print("my_event_handler") self.image = Image.open("d://1//original.jpg") self.photo = ImageTk.PhotoImage(self.image) self.c_image = self.canvas.create_image(0, 0, anchor='nw', image=self.photo) self.canvas.grid(row=2, column=1) app= App()
Canvas
Виджет Canvas предоставляет возможности рисования двухмерных фигур. Стоит отметить, что Canvas есть только в пакете tkinter , а в пакете tkinter.ttk аналог отсутствует.
Некоторые основные параметры Canvas:
- bg / background : фоновый цвет
- bd / border : граница
- borderwidth : толщина границы
- cursor : курсор
- height : высота виджета
- width : ширина виджета
По умолчанию Canvas представляет прямоугольную область:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x300") canvas = Canvas(bg="white", width=250, height=250) canvas.pack(anchor=CENTER, expand=1) root.mainloop()
Для двухмерного рисования Canvas предоставляет ряд методов:
- create_line() : рисует линию
- create_rectangle() : рисует прямоугольник
- create_oval() : рисует овал
- create_arc() : рисует дугу
- create_polygon() : рисует многоугольник
- create_text() : добавляет текст
- create_image() : добавляет изображение
- create_window() : добавляет виджет
В качестве результата все эти методы возвращают идентифтикатор добавленного элемента. Этот идентификатор в дальнейшем может использоваться для управления элементом. Рассмотрим применение этих методов.
Создание линии
Для рисования линии применяется метод create_line() . Для вывода линии необходимо как минимум задать координаты точек, например:
create_line(__x0: float, __y0: float, __x1: float, __y1: float)
Параметры __x0 и __y0 представляют координаты начальной точки линии, а __x1 и __y1 - конечной.
Началом координат в Canvas считается верхней левый угол виджета - это точка с координатами (0,0). Таким образом, ось X направлена вправо, а ось Y - вниз.
Нарисуем простейшую линию:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x300") canvas = Canvas(bg="white", width=250, height=250) canvas.pack(anchor=CENTER, expand=1) canvas.create_line(10, 10, 200, 50) root.mainloop()
Кроме того у данного метода можно выделить ряд дополнительных параметров:
- arrow : помещает стрелку в начале линии (значение first), в конце (last) или на обоих концах (both)
- arrowshape : позволяет изменить форму стрелки
- capstyle : если линия не имеет стрелки, то устанавливает, как завершается линия. Принимает значения: butt (по умолчанию), projecting и round
- joinstyle : управляет соединением сегметов линии. Принимает значения: round (по умолчанию), bevel и miter
- smooth : если значение "true" или "bezier", сглаживает сегменты линии
- splinesteps : управляет сглаживанием изогнутых линий
Параметры отрисовки
Методы отрисовки имеют ряд параметров, которые позволяют настроить стилизацию фигур. Некоторые из этих параметров:
- fill : цвет заполнения фигуры
- width : ширина линий
- outline : для заполненных фигур цвет контура
- dash : устанавливает пунктирную линию
- stipple : устанавливает шаблон для заполнения фигуры (например, gray75, gray50, gray25, gray12)
- activefill : цвет заполнения фигуры при наведении курсора
- activewidth : ширина линий при наведении курсора
- activestipple : шаблон заполнения фигуры при наведении курсора
Применим некоторые параметры:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) canvas.create_line(10, 10, 200, 50, activefill="red", fill="blue", dash=2) canvas.create_line(10, 50, 200, 90, activefill="red", fill="blue", dash=2) root.mainloop()
В данном случае нарисованы две параллельные линии пунктиром синим цветом. При наведении на них указателя мыши, они окрашиваются в красный цвет.
Создание прямоугольника
Для отрисовки прямоугольника применяется метод create_rectangle() , которому обязательно передаются координаты верхнего левого и правого нижнего угла:
create_rectangle(__x0: float, __y0: float, __x1: float, __y1: float)
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) canvas.create_rectangle(10, 20, 200, 60, fill="#80CBC4", outline="#004D40") root.mainloop()
Отрисовка овала
Для отрисовки овала применяется метод create_oval() . В качестве обязательных параметров он принимает координаты прямоугольника, в который будет вписан овал. :
create_oval(__x0: float, __y0: float, __x1: float, __y1: float)
Пример использования метода:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) canvas.create_oval(10, 10, 200, 50, fill="#80CBC4", outline="#004D40") canvas.create_rectangle(10, 10, 200, 50) root.mainloop()
Для наглядности здесь также отрисован прямоугольник, чтобы было видно как вписывается овал:
Отрисовка многоугольника
Для создания многоугольника применяется метод create_polygon() . Он принимает в качестве обязательных параметров набор координатов точек:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) canvas.create_polygon(10, 30, 200, 200, 200, 30, fill="#80CBC4", outline="#004D40") root.mainloop()
В данном случае передаются координаты трех точек, которые в итоге станут вершинами треугольника
Для упрощения также можно передавать набор кортежей, где каждый кортеж представляет отдельную точку:
points = ( (10, 30), (200, 200), (200, 30), ) canvas.create_polygon(*points, fill="#80CBC4", outline="#004D40")
Отрисовка дуги
Для отрисовки дуги применяется метод create_arc() , который принимает набор точек:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) canvas.create_arc((10, 10), (200, 200), fill="#80CBC4", outline="#004D40") root.mainloop()
Отображение текста
Для вывода текста применяется метод create_text() . Ключевыми его параметрами являются координаты точки вывода текста, а также параметр text - сам выводимый текст:
При выводе текста стоит учитывать, что по умолчанию указанные координаты представляют центральную точку вывода текста. Но это поведение можно изменить с помощью опции anchor .
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) canvas.create_text(50, 50, text="Hello METANIT.COM", fill="#004D40") canvas.create_text(50, 100, anchor=NW, text="Hello METANIT.COM", fill="#004D40") root.mainloop()
Здесь два раза выводится один и тот же текст. И в обоих случаях совпадает X-координата. Но во втором случае установлен параметр anchor : его значение "NW" указывает, что координаты будут представлять верхний левый угол прямогольной области, в которой выводится текст
С помощью параметра font можно задать шрифт, в том числе его высоту:
canvas.create_text(10, 10, font="Arial 14", anchor=NW, text="Hello METANIT.COM", fill="#004D40")
Вывод изображения
Для вывода изображения применяется метод create_image() , который в качестве обязательно параметра принимает координаты изображения. Для установки самого изображения в метод через параметр image передается ссылка на изображение:
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) python_image = PhotoImage(file="python.png") canvas.create_image(10, 10, anchor=NW, image=python_image) root.mainloop()
В данном случае координаты представлены точкой с x=10 и y=10, а изображение представляет объект PhotoImage (здесь предполагается, что в одной папке с файлом программы находится файл "python.png"). Но как и в случае с выводом текста, следует учитывать, что по умолчанию координаты представляют центр изображения. Чтобы настроить положение изображения относительно координат, применяется параметр anchor . Так, в данном случае значение "NW" означает, что координата представляет верхний левый угол изображения.
Добавление виджетов
Одной из замечательных особенностей Canvas является то, что он позволяет добавлять другие виджеты и таким образом создавать сложные по композиции интерфейсы. Для этого применяется метод create_window() .
create_window(__x: float, __y: float, *, anchor: _Anchor = . height: _ScreenUnits = . state: Literal['normal', 'active', 'disabled'] = . tags: str | list[str] | tuple[str, . ] = . width: _ScreenUnits = . window: Widget = . ) -> _CanvasItemId create_window(__coords: tuple[float, float] | list[int] | list[float], *, anchor: _Anchor = . height: _ScreenUnits = . state: Literal['normal', 'active', 'disabled'] = . tags: str | list[str] | tuple[str, . ] = . width: _ScreenUnits = . window: Widget = . ) -> _CanvasItemId
- _x и _y или __coords : координаты точки размещения виджета. По умолчанию представляет центр виджета
- _anchor : устанавливает положение виджета относительно координат
- height : высота виджета
- width : ширина виджета
- state : состояние виджета
- tags : набор тегов, связанных с виджетом
В качестве результата этот метод возвращает идентификатор добавленного метода.
Например, добавим кнопку:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("300x250") canvas = Canvas(bg="white", width=250, height=200) canvas.pack(anchor=CENTER, expand=1) btn = ttk.Button(text="Click") canvas.create_window(10, 20, anchor=NW, window=btn, width=100, height=50) root.mainloop()
В данном случае верхний левый угол кнопки будет иметь координаты (x=10, y=20), а сама кнопка имеет ширину 100 и высоту 50 единиц. Если ширина и высота явным образом не указаны, то они имеют значения по умолчанию.
Создание прокрутки
Для создания прокрутки виджет Canvas предоставляет параметр , который позволяет установить прокручиваемую область:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") h = ttk.Scrollbar(orient=HORIZONTAL) v = ttk.Scrollbar(orient=VERTICAL) canvas = Canvas(scrollregion=(0, 0, 1000, 1000), bg="white", yscrollcommand=v.set, xscrollcommand=h.set) h["command"] = canvas.xview v["command"] = canvas.yview canvas.grid(column=0, row=0, sticky=(N,W,E,S)) h.grid(column=0, row=1, sticky=(W,E)) v.grid(column=1, row=0, sticky=(N,S)) root.grid_columnconfigure(0, weight=1) root.grid_rowconfigure(0, weight=1) canvas.create_rectangle(10,10, 300, 300, fill="red") root.mainloop()
В данном случае устанавливается прокручиваемая область 1000х1000:
canvas = Canvas(scrollregion=(0, 0, 1000, 1000), .