Как открыть изображение PIL при каждом нажатии кнопки tkinter? - PullRequest
0 голосов
/ 28 сентября 2019

Я очень плохо знаком с Pyton и программированием в целом, и для своего первого проекта я пытаюсь создать сценарий с интерфейсом Tkinter, который должен делать следующее:

  1. Разрешить пользователю писать текств запись,
  2. при нажатии кнопки поместите этот текст на изображение с определенным именем,
  3. сохраните это изображение под именем, которое является текущей датой и временем,
  4. , повторитевсе вышеперечисленное при нажатии кнопки.

Сценарий работает правильно только один раз (после первого нажатия кнопки), после чего вводит введенный текст в ранее введенный текст.

Я понимаю, что это потому, что он открывает исходное изображение только один раз и выполняет другие шаги при каждом нажатии кнопки, но я не могу написать код, который определяет исходное изображение, в command = lambda (это вызываетразличные ошибки).Вот мой код:

import tkinter as tk
from PIL import Image, ImageDraw, ImageFont
from datetime import datetime

def adresat1_function(self): draw.text(xy=(273, 215), text=(entry_1.get()),
    fill=(0, 0, 0), font=font_type)

root = tk.Tk()
root.title("Postal")
root.maxsize(height=530, width=590,)

canvas = tk.Canvas(root, height=530, width=590, highlightthickness=0)
canvas.pack()

frame_1 = tk.Frame(canvas, bg='#75a3a3', bd=2)
frame_1.place(x=5, y=10, height=200, width=580, anchor='nw')

entry_1 = tk.Entry(frame_1, font=18,)
entry_1.place(x=202, y=0, width=374, height=22,)

#Image

image = Image.open('Blank.jpg')
font_type = ImageFont.truetype('arial.ttf',14,)
draw = ImageDraw.Draw(image)

#Button

button = tk.Button(frame_1, text = 'Fill', width=8,
    command=lambda:

    #Fill
    (adresat1_function(entry_1.get()),
    image.save(datetime.now().strftime("%Y-%m-%d %H-%M-%S") + '.jpg'),))

button.place(x=202, y=160, width=374, height=22,)
root.mainloop()

Что нужно сделать, чтобы эта программа сохранила введенный текст на новом изображении, не перезаписывая его поверх ранее введенного текста?Я, возможно, даже не знаю некоторые основные понятия Python, в таком случае извините за тупой вопрос.Заранее спасибо.

1 Ответ

0 голосов
/ 28 сентября 2019

Изменение вашего кода, как показано ниже, решит проблему.Вы хотите, чтобы при каждом нажатии этой кнопки создавалась новая копия изображения, и вы можете применить к ней свой текст:

import tkinter as tk
from PIL import Image, ImageDraw, ImageFont
from datetime import datetime

# Changes here.
def adresat1_function(self):
    newImage = image.copy()
    draw = ImageDraw.Draw(newImage)
    draw.text(xy=(273, 215), text=(entry_1.get()),fill=(0, 0, 0), font=font_type)
    newImage.save(datetime.now().strftime("%Y-%m-%d %H-%M-%S") + '.jpg')

root = tk.Tk()
root.title("Postal")
root.maxsize(height=530, width=590,)

canvas = tk.Canvas(root, height=530, width=590, highlightthickness=0)
canvas.pack()

frame_1 = tk.Frame(canvas, bg='#75a3a3', bd=2)
frame_1.place(x=5, y=10, height=200, width=580, anchor='nw')

entry_1 = tk.Entry(frame_1, font=18,)
entry_1.place(x=202, y=0, width=374, height=22,)

#Image

image = Image.open('Blank.jpg')
font_type = ImageFont.truetype('arial.ttf',14,)
newImage = None

#Button

button = tk.Button(frame_1, text = 'Fill', width=8,
    command=lambda:

    # Changes in fill.
    (adresat1_function(entry_1.get()),))


button.place(x=202, y=160, width=374, height=22,)
root.mainloop()
...