Изображение просмотрщик с использованием Python и Tkinter

PythonPythonBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте мы создадим приложение для просмотра изображений с использованием Python и Tkinter. Приложение для просмотра изображений позволит вам открыть файл изображения, отобразить его и выполнить действия, такие как увеличение, уменьшение и вращение изображения. Мы будем использовать библиотеку PIL (Python Imaging Library) для обработки операций с изображениями и Tkinter для создания графического пользовательского интерфейса.

👀 Предварительный просмотр

Предварительный просмотр приложения для просмотра изображений

🎯 Задачи

В этом проекте вы научитесь:

  • Создавать графическое приложение с использованием Tkinter.
  • Обрабатывать загрузку и отображение изображений с использованием PIL.
  • Реализовывать функциональность увеличения, уменьшения и вращения для отображаемого изображения.

🏆 Достижения

После завершения этого проекта вы сможете:

  • Разрабатывать функциональное приложение для просмотра изображений с использованием Python и Tkinter.
  • Интегрировать возможности обработки изображений с использованием библиотеки PIL.
  • Реализовывать базовые функции обработки изображений, такие как увеличение и вращение.

Создайте файлы проекта

Сначала создайте новый файл с именем ~/project/image_viewer.py и откройте его в текстовом редакторе или интегрированной среде разработки (IDE).

cd ~/project
touch image_viewer.py
✨ Проверить решение и практиковаться

Импортируйте необходимые библиотеки

В файле image_viewer.py импортируйте необходимые библиотеки:

import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
from PIL import Image, ImageTk
import os

Библиотека tkinter предоставляет функциональность для создания элементов графического интерфейса, filedialog позволяет нам открыть диалог выбора файла для выбора файла изображения, messagebox используется для отображения сообщений пользователю, PIL используется для обработки изображений, а os предоставляет функции для взаимодействия с операционной системой.

✨ Проверить решение и практиковаться

Создайте класс ImageViewer

Определите новый класс под названием ImageViewer, который будет обрабатывать приложение для просмотра изображений:

class ImageViewer:
    def __init__(self, root):
        self.root = root
        self.root.title('LabEx Image Viewer')
        self.root.geometry('800x600')
        self.root.configure(background='white')

        self.image_label = tk.Label(self.root)
        self.image_label.pack()

        self.control_frame = tk.Frame(self.root)
        self.control_frame.pack()

        self.open_button = tk.Button(self.control_frame, text='Open', command=self.open_image)
        self.open_button.pack(side='left')

        self.close_button = tk.Button(self.control_frame, text='Quit', command=self.root.quit)
        self.close_button.pack(side='left')

        self.zoom_in_button = tk.Button(self.control_frame, text='Zoom In', command=self.zoom_in)
        self.zoom_in_button.pack(side='left')

        self.zoom_out_button = tk.Button(self.control_frame, text='Zoom Out', command=self.zoom_out)
        self.zoom_out_button.pack(side='left')

        self.rotate_button = tk.Button(self.control_frame, text='Rotate', command=self.rotate)
        self.rotate_button.pack(side='left')

        self.current_image_path = ''
        self.zoom_level = 1

В методе __init__ мы инициализируем главное окно с заголовком, размером и цветом фона. Затем мы создаем метку для отображения изображения и рамку для хранения кнопок управления (Open, Quit, Zoom In, Zoom Out, Rotate). Мы также определяем переменные экземпляра для отслеживания текущего пути к изображению и уровня приближения.

✨ Проверить решение и практиковаться

Реализуйте метод open_image

Добавьте метод open_image в класс ImageViewer:

    def open_image(self):
        self.current_image_path = filedialog.askopenfilename(defaultextension=".jpg",
            filetypes=[("All Files", "*.*"), ("JPEG", ".jpg"), ("PNG", ".png"), ("GIF", ".gif")])
        if self.current_image_path:
            self.load_image()

Метод open_image открывает диалог выбора файла для выбора файла изображения. Он устанавливает переменную current_image_path в выбранный путь к файлу и вызывает метод load_image для отображения изображения.

✨ Проверить решение и практиковаться

Реализуйте метод load_image

Реализуйте метод load_image:

    def load_image(self):
        image = Image.open(self.current_image_path)

        ## Resize image for display
        max_size = (600, 600)
        image.thumbnail(max_size)

        ## Save a reference to the original image (for zooming/rotating)
        self.original_image = image

        ## Create a Tkinter-compatible image
        self.tk_image = ImageTk.PhotoImage(image)
        self.image_label.configure(image=self.tk_image)

        self.zoom_level = 1

Метод load_image открывает выбранный файл изображения с использованием метода Image.open библиотеки PIL. Он изменяет размер изображения, чтобы оно поместилось в максимальный размер 600x600 пикселей, используя метод thumbnail. Затем он сохраняет ссылку на исходное изображение для целей масштабирования и вращения. Далее он создает изображение, совместимое с Tkinter, с использованием ImageTk.PhotoImage, и обновляет метку изображения для отображения загруженного изображения. Наконец, он устанавливает начальный уровень масштабирования равным 1.

✨ Проверить решение и практиковаться

Реализуйте метод zoom_in

Реализуйте метод zoom_in:

    def zoom_in(self):
        if not self.current_image_path:  ## No image loaded
            return
        self.zoom_level *= 1.1  ## Increase zoom level by 10%
        self.zoom_or_rotate_image()

Метод zoom_in проверяет, загружено ли изображение. Если изображение не загружено, он возвращает. В противном случае он увеличивает уровень приближения на 10% и вызывает метод zoom_or_rotate_image для обновления отображаемого изображения.

✨ Проверить решение и практиковаться

Реализуйте метод zoom_out

Реализуйте метод zoom_out:

    def zoom_out(self):
        if not self.current_image_path:  ## No image loaded
            return
        if self.zoom_level < 0.1:  ## Limit outwards zoom
            return
        self.zoom_level *= 0.9  ## Decrease zoom level by 10%
        self.zoom_or_rotate_image()

Метод zoom_out проверяет, загружено ли изображение. Если изображение не загружено, он возвращает. Если уровень приближения уже ниже 0,1, то есть изображение уменьшено до предела, он возвращает. В противном случае он уменьшает уровень приближения на 10% и вызывает метод zoom_or_rotate_image для обновления отображаемого изображения.

✨ Проверить решение и практиковаться

Реализуйте метод rotate

Реализуйте метод rotate:

    def rotate(self):
        if not self.current_image_path:  ## No image loaded
            return
        self.original_image = self.original_image.rotate(-90)
        self.zoom_or_rotate_image()

Метод rotate проверяет, загружено ли изображение. Если изображение не загружено, он возвращает. В противном случае он вращает исходное изображение на -90 градусов с использованием метода rotate из библиотеки PIL и вызывает метод zoom_or_rotate_image для обновления отображаемого изображения.

✨ Проверить решение и практиковаться

Реализуйте метод zoom_or_rotate_image

Реализуйте метод zoom_or_rotate_image:

    def zoom_or_rotate_image(self):
        ## Zoom and rotate original image, convert to Tk image, and display
        new_image = self.original_image.resize((int(self.original_image.width * self.zoom_level),
                                                int(self.original_image.height * self.zoom_level)))
        self.tk_image = ImageTk.PhotoImage(new_image)
        self.image_label.configure(image=self.tk_image)

Метод zoom_or_rotate_image изменяет размер исходного изображения в соответствии с текущим уровнем приближения. Он создает новое изображение с обновленным размером с использованием метода resize из библиотеки PIL. Затем он преобразует новое изображение в изображение, совместимое с Tkinter, с использованием ImageTk.PhotoImage, и обновляет метку изображения для отображения обновленного изображения.

✨ Проверить решение и практиковаться

Создайте главный цикл приложения

Добавьте следующий код в конец файла image_viewer.py, чтобы создать главный цикл приложения:

if __name__ == '__main__':
    root = tk.Tk()
    app = ImageViewer(root)
    root.mainloop()

Этот код создает окно корневого элемента Tkinter, инициализирует экземпляр класса ImageViewer и запускает главный цикл приложения.

Перейдите на рабочий стол и запустите файл image_viewer.py, чтобы протестировать приложение. Вы должны увидеть следующее окно:

python image_viewer.py
Окно приложения Tkinter
✨ Проверить решение и практиковаться

Резюме

Поздравляем! Вы создали приложение для просмотра изображений с использованием Python и Tkinter. Приложение позволяет открывать файл изображения, отображать его и выполнять действия, такие как приближение, удаление приближения и вращение изображения. Вы узнали, как использовать библиотеку PIL для обработки изображений и Tkinter для создания графического пользовательского интерфейса. Не стесняйтесь дальнейшего настройки приложения или изучения дополнительных функций.