Как поставить картинку на фон в tkinter
Перейти к содержимому

Как поставить картинку на фон в tkinter

  • автор:

Как сделать Label из TKinter с фоном своей картинки?

Label отображается с картинкой, но перекрывает текст который я передаю для лейбла. Как это исправить и в чем я ошибаюсь?

  • Вопрос задан более двух лет назад
  • 703 просмотра

1 комментарий

Средний 1 комментарий

phaggi

Алан Гибизов @phaggi Куратор тега Python

Canvas — Фоновое изображение

Author24 — интернет-сервис помощи студентам

Требуется именно на Tkinter. Весь интернет обшарил и ничего не нашёл. Заранее, спасибо!

Добавлено через 11 минут
Попробовал так, но не получилось:

image = tk.PhotoImage(file=path, width=root.winfo_screenwidth(), height=root.winfo_screenheight())

Добавлено через 1 час 26 минут
Нашёл ответ. Спасибо!
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Вставить изображение из буфера обмена в Canvas
Подскажите как вставить картинку из буфера обмена на холст Canvas?

Не могу добавить фоновое изображение в PyGame
Не могу добавить фоновое изображение в PyGame. Фото которое хочу сделать фоном игры в размере.

Как добавить фоновое изображение, а также, чтобы оно адаптировалось под размер окна?
Здравствуйте. Как добавить к качестве фона изображение? Пробовал через стили: .

Не загружается изображение в canvas, ошибок нет, Python 3
Не загружается изображение в canvas, ошибок нет, Python 3. Нажимаю кнопку и выбираю картинку.

Фоновое изображение
Привет всем. Я вывожу фоновое изображение размером 854х480 — по умолчанию именно такого размера.

Добавляем картинки и пишем тамагочи

На самом деле все просто, достаточно просто добавить 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 

Как поставить изображение на задний фон tkinter?

У меня есть окно, и я хочу сделать для него задний фон.
Я пытался сделать, пробовал разные способы, но не получилось.

import os from tkinter import * from tkinter import ttk def start(): app = App() app.mainloop() class App(Frame): def __init__(self, master = None): super().__init__(master) self.master.geometry('640x360') self.master.title("Bot") self.bg() self.pack() def bg(self): bgImg = PhotoImage(file = "bg.png") self.bg = ttk.Label(self) self.bg["text"] = "Yep" self.bg["image"] = bgImg self.bg.pack() start()
  • Вопрос задан более двух лет назад
  • 2033 просмотра

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *