MakeCaptionWithLogo


#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()