【Python】tkinter 再利用しそうなコード

# インポート
```Python
import tkinter as tk
```

# レイアウト
## メインウィンドウ

```
# メインウィンドウ生成
tk1 = tk.Tk()
#  ウィンドウサイズを指定
tk1.geometry("900x600")
# ウィンドウタイトルを指定
tk1.title("TextConv 2020")
# ウィンドウサイズの変更可否設定
tk1.resizable(0,0)
#  ウィンドウの背景色
tk1.configure(bg="white")

tk1.mainloop()
```
tk1.withdraw()　#  ウィンドウの表示を抑制はつけない

## メニューバー
```
from tkinter import filedialog

def m_load():
    typ = [('テキストファイル','*.txt')] 
    dir = 'C:\\'
    file = filedialog.askopenfilename(filetypes = typ, initialdir = dir) 
    f = open(file)
    fdata = f.read()  #  ファイル終端まで全て読んだデータを返す
    textField.delete('1.0', 'end')
    textField.insert('1.0', fdata)
    f.close()

def m_save():
    file = filedialog.asksaveasfilename()
    txt = textField.get('1.0', 'end -1c')
    f=open(file, mode='w') 
    f.write(txt)
    f.close()

# メニューバー作成 
men = tk.Menu(tk1) 

# メニューバーを画面にセット 
tk1.config(menu=men) 

# メニューに親メニュー（ファイル）を作成する 
menu_file = tk.Menu(tk1) 
men.add_cascade(label='File', menu=menu_file) 
men.add_cascade(label='File Load', command=m_load) 
men.add_cascade(label='File Save', command=m_save) 
```

## パネルウィンドウ
```
#   orient : 配置（vertical or horizontal）
#   bg : 枠線の色
#  pack
#   expand ：可変（True or False(固定)
#   fill : スペースが空いている場合の動き（tk.BOTH　縦横に広がる）
#   side ：　配置する際にどの方向からつめていくか（side or top ・・・）

pw_main = tk.PanedWindow(tk1, orient='horizontal')
pw_main.pack(expand=True, fill = tk.BOTH, side="left")

pw_left = tk.PanedWindow(pw_main, bg="cyan", orient='vertical')
pw_main.add(pw_left)
pw_right = tk.PanedWindow(pw_main, bg="white", orient='vertical')
pw_main.add(pw_right)
```

## フレーム
```
mainFrame = tk.Frame(pw_left, width=450, height=600, bg="white")
# propagation を False にすると，フレームの大きさは width, height 
# Trueの場合は、中のウィジェットにくっつく
mainFrame.propagate(False)
mainFrame.pack()
```
## タブ
```
import tkinter.ttk as ttk

note = ttk.Notebook(tk1)
tab = tk.Frame(note,height=100,width=100)

note.add(tab, text="Tab")

note.pack()
```

# 操作

## クリップボード
```
def c_button1_click():
    #  クリップボードから読み込み
    MOji1 = tk1.clipboard_get()
    # txt1.insert(0,"test")
    # insert()メソッドは、第一引数に位置を、第二引数に挿入する文字を指定します。
    textField.delete('1.0', 'end')
    textField.insert('1.0', MOji1)
    # textField.insert('1.0', 'あいうえお\nアイウｱｲｳ\nabcABCａｂｃＡＢＣ\n123１２３')

def c_button2_click():
    #  クリップボードから読み込み
    textField.clipboard_append

# ボタン（クリップボードから貼付)
c_button1 = tk.Button(clipboardFrame, text='クリップボードから貼付',command=c_button1_click,bg="yellow")
c_button1.place(x=10, y=5)

# ボタン(クリップボードにコピー)
c_button2 = tk.Button(clipboardFrame, text="クリップボードにコピー", command=c_button2_click,bg="gold")
c_button2.place(x=150, y=5)
```

## テキストエリア
```
#  スクロールバー
scrollbar = tk.Scrollbar(textFrame)
scrollbar.pack(side=tk.RIGHT, fill="y")

#  テキストボックス
textField = tk.Text(textFrame, width=500, height=500, bd=5, relief="groove")
textField.propagate(False)
textField.pack(side=tk.LEFT, padx=(0, 0), pady=(0, 0))
textField["yscrollcommand"] = scrollbar.set
textField.insert('1.0', 'あいうえお\nアイウｱｲｳ\nabcABCａｂｃＡＢＣ\n123１２３')
```

padx:外側の横の隙間   =10 両側　　=(10,10) 左,右
pady:外側の縦の隙間
絶対座標ではなく、前・左のものとの相関位置を示すので
（,）を使用する時は(n,0)と後を0にした方が設定しやすい
デフォルトは Tk.CENTER. 
他に、Tk.W (左よせ）、Tk.E （右よせ）、Tk.N （上よせ）、Tk.S （下よせ）、
Tk.NW （左上）、Tk.SW （左下）、Tk.NE （右上）、Tk.SE （右下）

・テキストボックスに文字をセット
　textField.insert(tk.END,"2020")
　第一パラメータは文字をセットする位置
　「tk.END」にするとテキストボックスの最後に追加する
・Entryから文字列を取得
　textField.get
・テキストボックスの文字列をクリア
　textField.delete(0,tk.END)

・数値 1.0 または文字列"1.0"
　テキストウィジェットの最初の文字の位置は 1.0 
・"end" or tk.END
　Textボックスの最後

# コントロール

##  チェックボタン
```
chk1 = tk.Checkbutton(SideFrame1, text='行',bg="lightgreen")
chk1.place(x=180, y=7)
```

## ボタン
```
S_button1 = tk.Button(SideFrame2, text="入替", command= lambda:c_button_click(10),bg="salmon")
```

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439291/9790bb25-dbe9-f22f-a78f-81de283ef81f.png">


# jpg表示
```
# tkinterはjpg表示対応していないため
from PIL import Image, ImageTk 

img = Image.open('img.jpg')
w = img.width #  横幅を取得                                                      
h = img.height #  縦幅を取得
# 画に合わせて横を縮小                                 
img = img.resize(( int(w * (600/h)), int(h * (600/h)) ))
img  = ImageTk.PhotoImage(img)

canvas = tk.Canvas(bg="pink", width=400, height=600)
canvas.place(x=0, y=0)
canvas.create_image(0, 0, image=img, anchor=tk.NW)
```

# TkinterDnD2 インストール
```
conda install -c gagphil1 tkinterdnd2
```

# おまけ
### グローバル変数をモジュール間で共有する

cfg.pyを作成

```
x = 0
```

片方のモジュール、インポートして、x=設定

```
import cfg
cfg.x = 1
```

もう片方で読み込む

```
import cfg
import mod
print(cfg.x)
```