Windowsのメモ帳をつくってみる(1)
はじめに
PythonでのGUIアプリケーションの作成を行ってみたいと思い少しずつ学んでいこうと思う。 今回はTkinterを用いる。
フレーム表示
まずは、フレームを表示できないと何も始まらないので軽く調べて表示してみる。
import tkinter as tk class Textarea(tk.Frame): def __init__(self, master=None): # 親フレームの引継ぎ tk.Frame.__init__(self, master) # タイトル定義 master.title('test') # Windowの大きさの定義 master.geometry('1280x720') if __name__ == "__main__": root = tk.Tk() textarea = Textarea(root) root.mainloop()
表示してみると以下のようになる
テキストエリアの表示
今回の最終目標は、Windowsにデフォルトであるメモ帳を参考にしたテキストエディタを作成することにする そのため、まず確実に必要そうなテキストエリアの表示を行う。
tkinterでは、ウィジェットを定義するだけでは繁栄されないらしいので、 ウィジェットを定義した後に明示的に配置してあげる必要があるらしい。
self.textarea.pack()内で fill="both"を指定することで、表示ウィンドウ全体に表示でき、 expand=Trueにすることでウィンドウサイズ変更した際にテキストエリアも一緒にサイズ変更してくれるらしい。
import tkinter as tk class Textarea(tk.Frame): def __init__(self, master=None): # 親フレームの引継ぎ tk.Frame.__init__(self, master) # タイトル定義 master.title('test') # Windowの大きさの定義 master.geometry('1280x720') # Textareaの定義 self.textarea = tk.Text(master) # Textareaの表示 self.textarea.pack(fill="both", expand=True) if __name__ == "__main__": root = tk.Tk() textarea = Textarea(root) root.mainloop()
実行すると以下のようになる。
スライドバーの表示
このままでは使いにくそうなので、スライドバーを作りたいと思う。 スライドバーを設定する際にorientで配置の向きを調整することができる 水平(HORIZONTAL)、垂直(VERTICAL) これを用いてx軸y軸ともにスライドバーを配置した。
スライドバーを配置するだけだとスライドバーと何も同期していないので、ただの飾りとなってしまう。 そのため、作成したテキストエリアとの同期を行う必要がある。
テキストエリアのデフォルトは文字列の折り返しがオンとなっているらしいので、 x軸のスライドバーを実装したい場合には、テキストエリアでwrapをnoneに指定してあげる必要があるっぽい。
実際に実装したコードは以下のようになる。
import tkinter as tk class Textarea(tk.Frame): def __init__(self, master=None): # 親フレームの引継ぎ tk.Frame.__init__(self, master) # タイトル定義 master.title('test') # Windowの大きさの定義 master.geometry('1280x720') # Textareaの定義 self.text = tk.Text(master) #scrollbar self.scrollx = tk.Scrollbar(master, orient=tk.HORIZONTAL) self.scrolly = tk.Scrollbar(master, orient=tk.VERTICAL) self.scrollx.pack(side="bottom", fill="x") self.scrolly.pack(side="right", fill="y") # Textareaの表示 self.text.pack(fill="both", expand=True) # scrollbarとTextareaの同期 self.text["yscrollcommand"] = self.scrolly.set self.text["xscrollcommand"] = self.scrollx.set self.text["wrap"] = "none" if __name__ == "__main__": root = tk.Tk() textarea = Textarea(root) root.mainloop()
これを実行すると画像のようになる。
今回はこの辺にしておこうと思う。