tkinterで忘れがちなこと色々 其の3

いつもPyrhonプログラムを作るときに調べながら作るけどもすぐ忘れてしまう。なのでメモを残しておこうと。其の3。

目次

  1. メニューを付ける
  2. メニューを階層化する
  3. 定義済みの便利機能を利用する
  4. tkinter関連の記事一覧

メニューを付ける

import tkinter

if __name__ == '__main__':
    root = tkinter.Tk()
    menu = tkinter.Menu(root)
    root.configure(menu = menu)
    menu.add_command(label="Quit", command=root.quit)
    tkinter.mainloop()

実行結果は以下の通り。

実行終了のためのQuitを付けただけの一番シンプルな例。普通のボタンと同じように、クリックするとadd_commandで登録したメソッド(この場合root.quit)が呼ばれる。

メニューを階層化する

import tkinter

if __name__ == '__main__':
    def dummy(string):
        print(string)

    root = tkinter.Tk()
    menu = tkinter.Menu(root)
    root.configure(menu=menu)

    menu1 = tkinter.Menu(menu)
    menu1.add_command(label="11", command=lambda x=11: dummy(x))
    menu1.add_command(label="12", command=lambda x=12: dummy(x))
    menu1.add_command(label="13", command=lambda x=13: dummy(x))

    menu2 = tkinter.Menu(menu1)
    menu2.add_command(label="21", command=lambda x=21: dummy(x))
    menu2.add_command(label="22", command=lambda x=22: dummy(x))
    menu2.add_command(label="22", command=lambda x=23: dummy(x))

    menu.add_cascade(label="menu1", menu=menu1)
    menu1.add_cascade(label="manu2", menu=menu2)
    menu.add_command(label="Quit", command=root.quit)

    tkinter.mainloop()

実行結果は以下の通り。

メニューを階層化して機能を整理分類しつつ多く実装したい場合に便利な例。tkinter.Menuで作成したオブジェクトをadd_cascadeで追加していく。各メニュー内の項目はadd_command等で追加していく。(尚、上記の例ではlambda式を利用しているが、どの目項目がクリックされたかをわかりやすくするためで本質的な意味はない)

定義済みの便利機能を利用する

import tkinter
from tkinter.filedialog import *

if __name__ == '__main__':
    def open_file():
        name = askopenfilename()
        print(name)

    def open_dir():
        name = askdirectory()
        print(name)

    def save_file():
        name = asksaveasfilename(title='save', filetypes=(('all', '*'), ('txt','txt')))
        print(name)

    def check_status():
        print(cvalue[0].get(), cvalue[1].get(), cvalue[2].get(), rvalue.get())

    root = tkinter.Tk()
    menu = tkinter.Menu(root)
    root.configure(menu=menu)

    filemenu = tkinter.Menu(menu)
    menu.add_cascade(label="Menu", menu=filemenu)
    menu.add_command(label="File", command=open_file)
    menu.add_command(label="Folder", command=open_dir)
    menu.add_command(label="Check", command=check_status)
    menu.add_command(label="Save", command=save_file)
    menu.add_command(label="Quit", command=root.quit)

    cvalue = [tkinter.BooleanVar(), tkinter.BooleanVar(), tkinter.BooleanVar()]
    cvalue[0].set(True)
    filemenu.add_checkbutton(label="Op.1", onvalue=True, offvalue=False, variable=cvalue[0])
    filemenu.add_checkbutton(label="Op.2", onvalue=True, offvalue=False, variable=cvalue[1])
    filemenu.add_checkbutton(label="Op.3", onvalue=True, offvalue=False, variable=cvalue[2])

    filemenu.add_separator()

    rvalue = tkinter.IntVar()
    rvalue.set(1)
    filemenu.add_radiobutton(label="Op.1", value=0, variable=rvalue)
    filemenu.add_radiobutton(label="Op.2", value=1, variable=rvalue)
    filemenu.add_radiobutton(label="Op.3", value=2, variable=rvalue)

tkinter.mainloop()

実行結果は以下の通り。

「File」をクリック時

「Folder」クリック時

「Save」クリック時

ファイルを読み込んだり、書き込んだりする際に便利な機能群とチェックボタン(複数選択可能)、ラジオボタン(単一のみ選択可能)の例。Windowアプリで利用しそうな機能は概ね揃っており(マニュアルを探すのは面倒だが)
tkinter.filedialogに多くが用意されている。上記ではaskopenfilename, askdirectory, asksaveasfilenameの3通りを利用しているがそのほかにも数種類用意されている。Web上の情報ではtkFileDialogというPython2の際の名称で説明されていることが多いようなので参照する場合には注意が必要。

チェックボタンはadd_checkbuttonで追加する。onvalue, offvalueに値を登録しておくと、選択、未選択時にvariableに格納される値を制御可能。この例では設定してもしなくても動作は同じ。
    cvalue = [tkinter.BooleanVar(), tkinter.BooleanVar(), tkinter.BooleanVar()]
    cvalue[0].set(True)
    filemenu.add_checkbutton(label="Op.1", onvalue=True, offvalue=False, variable=cvalue[0])
    filemenu.add_checkbutton(label="Op.2", onvalue=True, offvalue=False, variable=cvalue[1])
    filemenu.add_checkbutton(label="Op.3", onvalue=True, offvalue=False, variable=cvalue[2])

見やすさのためのにセパレータも設定可能。この例では、チェックボタンとラジオボタンの境目が分かりづらいのでセパレータを追加している。
    filemenu.add_separator()

ラジオボタンはadd_radiobuttonで追加する。valueに値を登録して選択時の値を制御する。
    rvalue = tkinter.IntVar()
    rvalue.set(1)
    filemenu.add_radiobutton(label="Op.1", value=0, variable=rvalue)
    filemenu.add_radiobutton(label="Op.2", value=1, variable=rvalue)
    filemenu.add_radiobutton(label="Op.3", value=2, variable=rvalue)

コメント

このブログの人気の投稿

Python SQLite スレッド間でコネクションの使いまわしは出来ない

slackでgeneralの投稿を全削除する

Google location history(JSON形式)をCSVファイルにする