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

表示してみると以下のようになる

f:id:agepan4869:20211113102836p:plain

テキストエリアの表示

今回の最終目標は、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()

実行すると以下のようになる。

f:id:agepan4869:20211113104943p:plain

スライドバーの表示

このままでは使いにくそうなので、スライドバーを作りたいと思う。 スライドバーを設定する際に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()

これを実行すると画像のようになる。 f:id:agepan4869:20211113110405p:plain

今回はこの辺にしておこうと思う。

次の記事 agepan.hatenablog.com