見出し画像

Tkinter 私の実績 A2

前回に続いて Tkinter を使っている様子を紹介したいと思います。

前回「Tkinter 私の実績 A1」では色違いのフレーム2つで構成されるウインドウを作っただけでした。
各フレームにウィジェットを追加する様子を紹介するシリーズを想定していましたが、折角なので曲がりなりにも意味のあるものを作ることにします。

簡単なものであっても「一応使えるツール」が手に入れば楽しみが増えると思います。複数のウィジェットが連携してツールを構成する様子も理解し易いのではないでしょうか?

どんな機能のツールなのか? お楽しみに・・・

前回投稿時のタイトルは「Tkinter 私の実績 1」でしたが、今回からAを加えて「Tkinter 私の実績 A2」にしました。「一応使えるツール」A,B,Cと、複数作ってみようと思います。

Aシリーズの最後にソースファイル添付を予定します。

前回との相違点

1.フレームの色とボーダーを変更しました。

好みにもよると思いますが、落ち着いた雰囲気になったと思います。

2.frame1 にウィジェットを追加

2-1.1行入力が出来るbox1 を追加しました。

入力スペースを強調する為、frame1 の中に frame11 を作って、その中に配置しています。

2ー2.プルダウンメニューを追加しました。

プルダウンメニューのリストを定義して、frame1 に配置しました。

2ー3.「生成」ボタンを追加しました。

2-4.使い方を表示するメッセージを追加しました。

差分ソース

def __init__(self,master): に追加した分

        self.msg1 = u'スケールを選択し、文字列を\n入力して、<Enter> または、\n生成ボタンを押下して下さい。\n  まだ何も起こりません。'
        self.scalelist = [      # プルダウンメニューのリスト
               2,
               3,
               4,
               5
               ]


def create_widgets(self): に追加した分

       # ここから frame1 の要素を記述
       # インナーフレーム11の作成 (フレーム1内) ================================
       frame11 = tk.Frame( # frame12インスタンスを作成
           frame1, # frame1要素であるフレームを指定
           background="snow", # 背景色を指定
           borderwidth=2, # ボーダーの幅を指定
           relief="sunken", # ボーダーの浮き彫りを指定
           width=180, # 幅をpixel単位で指定
           height=32, # 高さをpixel単位で指定
           )
       # ---------------------------------------------------------------------
       self.box1 = tk.Entry(frame11, width=21)     # frame11 内に幅21(単位?)のbox1インスタンスを生成
       self.box1.place(x=0,y=0)        # box1インスタンスを配置  pixcel 単位で位置指定
       self.box1.bind('<Return>', func=self.makeqre)
       # ---------------------------------------------------------------------
       frame11.place(x=210,y=10)       # frame11インスタンスを配置  pixcel 単位で位置指定
       # =====================================================================
       # ---------------------------------------------------------------------
       self.button1 = tk.Button(frame1,text="生 成", width=7, height=1, bg="SkyBlue3", command=self.makeqr)
                                       # frame1 内に幅3、高さ1(単位?)のbutton1インスタンスを生成
       self.button1.place(x=305,y=50)  # button1インスタンスを配置  pixcel 単位で位置指定
       # ---------------------------------------------------------------------
       # プルダウンメニュー
       self.variable = tk.StringVar(frame1)    # frame1 内に self.variable インスタンスを生成
       self.variable.set(self.scalelist[1])    # self.varuabke に初期値 self.scalelist[1] を設定
       self.opt = tk.OptionMenu(frame1, self.variable, *self.scalelist)    # frame1 内に self.opt インスタンスを生成
       self.opt.config(width=5, height=1)      # self.opt の高さと幅を設定
       self.opt.place(x=210,y=50)              # self.opt インスタンスを配置  pixcel 単位で位置指定
       # 読出しは self.variable.get()
       # ---------------------------------------------------------------------
       self.msg = tk.StringVar()   # self.msg をバリアブルに設定
       self.msg.set(self.msg1)                 # 表示文字列を指定
       self.ms1 = tk.Message(frame1, width=180, textvariable=self.msg, font=("",9), fg="dim gray", bg="snow")
       self.ms1.place(x=210,y=100)             # self.ms1 インスタンスを配置  pixcel 単位で位置指定
       # ---------------------------------------------------------------------
       # 以上 frame1 の要素


class Application(tk.Frame): に新規追加した関数

   def makeqre(self,a):    # self.box1 から bind
       self.makeqr()
   
   def makeqr(self):       # self.button1 または makeqre から呼び出し
       pass      


解説

再び、コメントが全てですが、簡単に捕捉します。

def __init__(self,master): に追加した分
self.msg1 は、後述のmsgで使うために追加しました。
self.scalelist は、後述のプルダウンメニューで使うために追加しました。

def create_widgets(self): に追加した分
frame11 は box1 の入力スペースを強調する目的で使っています。
前後に =====  のコメントで挟みました。
フレームについては前回解説したので割愛します。

self.box1
一行の文字列入力ボックスです。
前後を ----- のコメントで挟みました。
幅を指定する数値の単位が不明です。高さを指定出来ませんでした。
文字列入力時にReturn を押すと (func=self.makeqre) 後述のself.makeqre()関数が呼ばれます。
外から参照するかもしれないと思って self. を付けました。

self.button1
生成ボタンを定義し、ボタンを押すと (command=self.makeqr) 後述の self.makeqr()関数が呼ばれます。 

プルダウンメニュー
見様見真似です。これも幅と高さを指定する値の単位不明です。
こちらも外から参照する可能性を感じて self. を付けました。

self.msg
メッセージです。アプリの処理に伴って文字列を変更する予定があるのでバリアブルにしました。
サイズと文字色を控え目にしています。

class Application(tk.Frame): に新規追加した関数
makeqre()

前述の self.box1 の記述に従って呼ばれます。
やりたい処理はmakeqr() と同じですが、self.button1 とは引数が違うようなので、この関数がmakeqr() を呼びます。
makeqr()
前述の self.button1 の記述に従って呼ばれます。
現在は pass なので、何も起こりません。


次回もウィジェットの追加を予定しています。

何等か、お役に立てれば幸いです。




出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。