#coding: utf-8
"""展覧会に展示する絵画や写真のキャプション作成の
ためのプログラムである。題名、作者、素材、ファイル名(半角文字)
を入力するとL版サイズの用紙に作者、題名、素材の順に印字された
画像がファイル(ファイル名で指定した)出力される。フォントの
大きさから見て、題名の文字の長さは全角文字で最大6であり、それ以上の長さ
の題名は複数行にする。題名の文字の中に\nを入れるとそこが折り返し
になる。たとえな「1億後年の\nかなた」。体裁から折り返された
文字列は6文字の右つまりがよい。この文字列が6文字のなるように
元の文字列に空白を追加あうる。例えば「1億後年の\n かなた」。"""
import tkinter as tk
from PIL import ImageGrab
import win32gui, time
fields = '題名', '作者', '素材', 'ファイル名'
def logo(xc, yc, size, canvas):
def rectagle(x,y,size,aspect, color, canvas):
xs=x-size/2
ys=y-size*aspect/2
xe=x+size/2
ye=y+size*aspect/2
canvas.create_rectangle(xs, ys, xe, ye, fill=color, width=0)
aspect=0.9
color="black"
delta=4
size4=size/4-delta
rectagle(xc,yc,size, aspect, color, canvas)
x= xc-size4
y= yc-size4
color="#411445"
rectagle(x,y,0.6*size/2, aspect, color, canvas)
x= xc-size4
y= yc+size4
color="#DC143C"
rectagle(x,y,0.6*size/2, aspect, color, canvas)
x= xc+size4
y= yc-size4
color="#DAA520"
rectagle(x,y,0.6*size/2, aspect, color, canvas)
x= xc+size4
y= yc+size4
color="#556B2F"
rectagle(x,y,0.6*size/2, aspect, color, canvas)
def fetch(entries, canvas):
#カンバスをまっさらにする
canvas.delete("all")
cap_data=[]
delta=35
for entry in entries:
field = entry[0]
text = entry[1].get()
cap_data.append(text)
#print('%s: "%s"' % (field, text))
#draw caption
canvas_width = canvas.winfo_width()
canvas_height =canvas.winfo_height()
#test用
#cap_data[1]="J.ターナー"
#cap_data[0]="海上の船"
#cap_data[2]="油彩"
#cap_data[3]="turner0"
#multiline
multiline=False
for char in cap_data[0]:
if char == "\n":
multiline=True
if multiline:
#caption
print("複数行")
canvas.create_text(canvas_width / 2,
canvas_height / 6+delta,
text=cap_data[1],font=("HGSoeiKakupoptai",50))
canvas.create_text(canvas_width / 2,
canvas_height*3 / 6+delta,
text=cap_data[0],font=("HGSoeiKakupoptai",60))
canvas.create_text(canvas_width / 2,
canvas_height*5 / 6+delta,
text=cap_data[2],font=("HGSoeiKakupoptai",20))
else:
#caption
canvas.create_text(canvas_width / 2,
canvas_height / 6+delta,
text=cap_data[1],font=("HGSoeiKakupoptai",50))
canvas.create_text(canvas_width / 2,
canvas_height*3 / 6+delta,
text=cap_data[0],font=("HGSoeiKakupoptai",70))
canvas.create_text(canvas_width / 2,
canvas_height*5 / 6+delta,
text=cap_data[2],font=("HGSoeiKakupoptai",20))
logo(80, 80, 80, canvas)
canvas.update()
time.sleep(1)
xw=canvas.winfo_rootx() # canvas.winfo_x() は加算不要でした
yw=canvas.winfo_rooty() # canvas.winfo_y() は加算不要でした
ww=canvas.winfo_width()
hw=canvas.winfo_height()
file_name = dir_name+"\\"+cap_data[3]+".jpg"
hwnd = win32gui.FindWindow(None, root_title)
if hwnd:
# 前面に移動
win32gui.SetForegroundWindow(hwnd)
window_size = win32gui.GetWindowRect(hwnd)
# 取得したウィンドウサイズでスクリーンショットを撮る
#image = ImageGrab.grab(window_size)
image=ImageGrab.grab(bbox=(xw,yw,xw+ww,yw+hw),include_layered_windows=False)
#image.save("screenshot.jpg")
image.save(file_name)
#print("Done")
#entry reset
for entry in entries:
entry[1].delete(0, tk.END)
#entry[0]にフォーカス
entries[0][1].focus()
def makeform(fm, fields):
entries = []
for field in fields:
row = tk.Frame(fm)
lab = tk.Label(row, width=8, text=field, anchor='w')
ent = tk.Entry(row, width=50)
row.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5)
lab.pack(side=tk.LEFT)
ent.pack(side=tk.RIGHT, expand=tk.YES, fill=tk.X)
entries.append((field, ent))
entries[0][1].focus()
return entries
if __name__ == '__main__':
import os
xc=1270/2
yc=890/2
xm=900
ym=yc
dir_name = ".\\captions"
import os
if not os.path.exists(dir_name):
# ディレクトリが存在しない場合、ディレクトリを作成する
os.makedirs(dir_name)
root_title="MakeCaption"
root = tk.Tk()
root.title(root_title)
root.geometry("800x700")
fc=tk.Frame(root,)
fm=tk.Frame(root, width=xm, height=ym, bg="green")
fm.pack()
fc.pack()
canvas=tk.Canvas(master=fc, width=xc, height=yc, \
relief=tk.GROOVE, bd=2)
canvas.pack()
ents = makeform(fm, fields)
root.bind('', (lambda event, e=ents, c=canvas: fetch(e,c)))
b1 = tk.Button(fm, text='Show',
command=(lambda e=ents, c=canvas: fetch(e,c)))
b1.pack(side=tk.LEFT, padx=5, pady=5)
b2 = tk.Button(fm, text='Quit', command=root.quit)
b2.pack(side=tk.LEFT, padx=5, pady=5)
root.mainloop()