[Python]メモ帳Twitterを作る（ツイート編）

メモ帳風twitterを作りたいと思い立ったが吉日、作ることにしたのでそのメモです。
特に言語にこだわりはなかったので目の前にあったpythonで作成することにしました。

#作成環境
- python3.7

###使用ライブラリ
- tkinter
- requests
- requests-oauthlib


#メモ帳のGUIを作成する
まずは張りぼてのメモ帳を作ります。
今回はpythonのライブラリであるTkinterを使います。
導入方法等はこちらを参考に。（[参考資料](https://qiita.com/SquidSky/items/90eb450310f1697d03e9 "Pythonで簡単なGUIを作れる「Tkinter」を使おう")）

とりあえず文字が入力できる箱を作ります。
アイコンはメモ帳っぽいやつを適当に用意してください。

```python:notepad.py
# coding: Shift_JIS

import tkinter as tk
import tkinter.font as font

root = tk.Tk()

#フォント指定
my_font = font.Font(root,family = "MS Gothic")

#エディタの作成
text_widget = tk.Text(root, wrap = tk.NONE, font = my_font)
text_widget.grid(column=0, row=0, sticky = (tk.N, tk.S, tk.E, tk.W))
root.columnconfigure(0, weight = 1)
root.rowconfigure(0, weight = 1)

root.title("無題 - メモ帳")
root.iconbitmap(default = "XXXX.ico")
root.geometry("500x250")
root.mainloop()
```

メモ帳っぽい何かができました。
![edit.png](https://qiita-image-store.s3.amazonaws.com/0/121230/ff9f0278-f906-e6e4-d88f-9fd22070549f.png)

###スクロールバーを付ける
メモ帳っぽく画面内にテキストがすべて表示されている時でもスクロールバーが表示されるようにスクロールバーを付けます。

```python:notepad.py
# スクロールバー
yscroll = tk.Scrollbar(text_widget, command=text_widget.yview)
xscroll = tk.Scrollbar(text_widget, command=text_widget.xview, orient=tk.HORIZONTAL)
yscroll.pack(side=tk.RIGHT, fill = "y")
xscroll.pack(side=tk.BOTTOM, fill = "x")
text_widget['yscrollcommand'] = yscroll.set
text_widget['xscrollcommand'] = xscroll.set
```

これでスクロールバーをそれっぽく付けることができました。
(右下がうまいことなってくれない...解決法わかるかたいれば教えてください)
![scrollbar.png](https://qiita-image-store.s3.amazonaws.com/0/121230/4a2b0ce9-9f24-7f98-9590-382657b70866.png)

###メニューバーをつける
メモ帳にはもう一歩足りない...ということでメニューバーを作成します。

```python:notepad.py
#メニューバー
menubar = tk.Menu(root, font = my_font)

filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label = "新規(N)")
filemenu.add_command(label = "開く(O)...")
filemenu.add_command(label = "上書き保存(S)")
filemenu.add_command(label = "名前を付けて保存(A)...")
filemenu.add_separator()
filemenu.add_command(label = "ページ設定(U)...")
filemenu.add_command(label = "印刷(P)...")
filemenu.add_separator()
filemenu.add_command(label = "メモ帳の終了(X)", command = root.quit)
menubar.add_cascade(label = "ファイル(F)", menu = filemenu)

editmenu = tk.Menu(menubar, tearoff=0)
editmenu.add_command(label = "About...")
menubar.add_cascade(label = "編集(E)", menu = editmenu)

formatmenu = tk.Menu(menubar, tearoff = 0)
formatmenu.add_command(label = "About...")
menubar.add_cascade(label = "書式(O)", menu = formatmenu)

viewmenu = tk.Menu(menubar, tearoff = 0)
viewmenu.add_command(label = "About...")
menubar.add_cascade(label = "表示(V)", menu = viewmenu)

helpmenu = tk.Menu(menubar, tearoff = 0)
helpmenu.add_command(label = "About...")
menubar.add_cascade(label = "ヘルプ(H)", menu = helpmenu)

root.config(menu = menubar)
```
これでメモ帳の側はできました!!!!
(ファイル以降のメニューバーの中身は頑張って作ってください（放棄）)
「メモ帳の終了(X)」だけは終了のコマンドを置いているので押すと終了するはずです。
![menubar.png](https://qiita-image-store.s3.amazonaws.com/0/121230/6aa259de-aaa1-741a-7640-5a08b10a8d2d.png)

#ツイートする処理を書く
メモ帳の側は完成したのでツイートする処理を書いていきます。
今回はメモ帳内に書いた文をツイートするようにします。

###Twitterアプリケーションの登録
まずはツイートするための準備をします。
[コチラ](https://yosiakatsuki.net/blog/create-twitter-application/ "Twitterアプリケーションの登録方法")を参考に

- Consumer Key
- Consumer Secret
- Access Token
- Access Token Secret

を発行してください。

###ツイート処理
ツイートする処理を書いていきます。
呼び出すために関数として作成しておきます。
認証キーは別ファイルに置いておくほうが良いかもしれません。

```python:notepad.py
import json
from requests_oauthlib import OAuth1Session

def tweet():
	CONSUMER_KEY = "XXXXXXXXXXXXXX"
	CONSUMER_SECRET = "XXXXXXXXXXXXXX"
	ACCESS_TOKEN = "XXXXXXXXXXXXXX"
	ACCESS_TOKEN_SECRET = "XXXXXXXXXXXXXX"
	twitter = OAuth1Session(CONSUMER_KEY,
				CONSUMER_SECRET,
				ACCESS_TOKEN,
				ACCESS_TOKEN_SECRET)
	params = {"status": text_widget.get('1.0','end -1c')}
	twitter.post("https://api.twitter.com/1.1/statuses/update.json", params = params)
```
ツイートは[ファイル(F)]-[新規(N)]の押下をトリガーにして作成します。
先ほど作ったメニューバーにtweetした関数を実行するように指定します。

```python:notepad.py
#メニューバー
menubar = tk.Menu(root,font = my_font)

filemenu = tk.Menu(menubar, tearoff=0)
#コマンドとしてツイートする処理を呼び出す
filemenu.add_command(label="新規(N)", command = tweet)
```

![tweet1.png](https://qiita-image-store.s3.amazonaws.com/0/121230/5df0e1aa-0518-e631-feea-a707a2a13952.png)
![tweet2.png](https://qiita-image-store.s3.amazonaws.com/0/121230/fd522bf5-2fdc-377d-31b1-fcf70ecfaad0.png)
![tweet3.png](https://qiita-image-store.s3.amazonaws.com/0/121230/ae917afc-3910-7adb-d9d1-2929a912f75e.png)
無事メモ帳からツイートをすることができました。
~~これでメモ帳のフリしながらツイートができるね！！！~~

#今回作成したプログラム
今回作成したプログラムを1つにまとめておきます。
<details><summary>notepad.py</summary><div>

```python:notepad.py
# coding: Shift_JIS

import tkinter as tk
import tkinter.font as font
import json
from requests_oauthlib import OAuth1Session

def tweet():
	CONSUMER_KEY = "XXXXXXXXXXXXXXX"
	CONSUMER_SECRET = "XXXXXXXXXXXXXXX"
	ACCESS_TOKEN = "XXXXXXXXXXXXXXX"
	ACCESS_TOKEN_SECRET = "XXXXXXXXXXXXXXX"
	twitter = OAuth1Session(CONSUMER_KEY,
				CONSUMER_SECRET,
				ACCESS_TOKEN,
				ACCESS_TOKEN_SECRET)
	params = {"status": text_widget.get('1.0','end -1c')}
	twitter.post("https://api.twitter.com/1.1/statuses/update.json", params = params)

root = tk.Tk()

#フォント指定
my_font = font.Font(root,family = "MS Gothic")

#エディタの作成
text_widget = tk.Text(root, wrap = tk.NONE, font = my_font)
text_widget.grid(column = 0, row = 0, sticky = (tk.N, tk.S, tk.E, tk.W))
root.columnconfigure(0, weight = 1)
root.rowconfigure(0, weight = 1)

# スクロールバー
yscroll = tk.Scrollbar(text_widget, command = text_widget.yview)
xscroll = tk.Scrollbar(text_widget, command = text_widget.xview, orient = tk.HORIZONTAL)
yscroll.pack(side = tk.RIGHT, fill = "y")
xscroll.pack(side = tk.BOTTOM, fill = "x")
text_widget['yscrollcommand'] = yscroll.set
text_widget['xscrollcommand'] = xscroll.set

#メニューバー
menubar = tk.Menu(root,font = my_font)

filemenu = tk.Menu(menubar, tearoff = 0)
filemenu.add_command(label = "新規(N)", command = tweet)
filemenu.add_command(label = "開く(O)...")
filemenu.add_command(label = "上書き保存(S)")
filemenu.add_command(label = "名前を付けて保存(A)...")
filemenu.add_separator()
filemenu.add_command(label = "ページ設定(U)...")
filemenu.add_command(label = "印刷(P)...")
filemenu.add_separator()
filemenu.add_command(label = "メモ帳の終了(X)", command = root.quit)
menubar.add_cascade(label = "ファイル(F)", menu = filemenu)

editmenu = tk.Menu(menubar, tearoff = 0)
editmenu.add_command(label = "About...")
menubar.add_cascade(label = "編集(E)", menu = editmenu)

formatmenu = tk.Menu(menubar, tearoff = 0)
formatmenu.add_command(label = "About...")
menubar.add_cascade(label = "書式(O)", menu = formatmenu)

viewmenu = tk.Menu(menubar, tearoff=0)
viewmenu.add_command(label = "About...")
menubar.add_cascade(label = "表示(V)", menu = viewmenu)

helpmenu = tk.Menu(menubar, tearoff = 0)
helpmenu.add_command(label="About...")
menubar.add_cascade(label="ヘルプ(H)", menu = helpmenu)

root.config(menu = menubar)

root.title("無題 - メモ帳")
root.iconbitmap(default = "XXXX.ico")
root.geometry("500x250")
root.mainloop()
```
</div></details>


#最後に
端折りに端折った気がしますが、わからない箇所は下記の参考資料をご参照ください。
初めてのQiita投稿故、間違いやミス等ありましたらご指摘ください。
きっと次はタイムライン取得編とか書くはず...
※悪用などはしないように!!

twitter [@higuratu](https://twitter.com/higuratu) 

#参考資料
###Tkinter
[Pythonで簡単なGUIを作れる「Tkinter」を使おう - Qiita](https://qiita.com/SquidSky/items/90eb450310f1697d03e9)
[PythonのTkinterを使ってみる - Qiita](https://qiita.com/nnahito/items/ad1428a30738b3d93762)
[Scrollbar と Listbox - Python入門](https://python.keicode.com/advanced/tkinter-widget-scrollbar.php)
[Tkinter、Textを使う - naritoブログ](https://torina.top/detail/409/)
[Tkinterでテキストエディタを作りたい - chikuchikugonzalezの雑記帳](http://chiku2gonzalez.hatenablog.com/entry/20100424/1272125961)

###Twitter
[Twitterアプリケーションの登録方法 - akatsuki](https://yosiakatsuki.net/blog/create-twitter-application/)
[PythonでTwitter API を利用していろいろ遊んでみる - Qiita](https://qiita.com/bakira/items/00743d10ec42993f85eb)
[PythonでTwitterしてみた - Qiita](https://qiita.com/konojunya/items/59a68d35e44db8b87186)