Pythonシステム学習ノート17(tkinter:GUI、コンポーネントButton/Entry/Label/Menu/Canvasなど、手順、コンポーネントレイアウトpack/gridなど、メッセージメカニズム、バインド、メニュー、canvasキャンバス)


GUI紹介
  • GraphicalUserInterface,
  • GUI for Python: Tkinter, wxPython, PyQt
  • TKinter:
  • バインドTK GUIツールセット、用途PythonパッケージTclコード
  • PyGTK
  • Tkinterの代替品
  • wxPython
  • プラットフォームにまたがるPython GUI
  • PyQt
  • プラットフォームにまたがる
  • 商業授権は、問題
  • によって行われる可能性がある.
  • 推奨資料
  • 辛星GUI、辛星Python
  • Python GUI Programming cookbook
  • Tkinter reference a GUI for Python

  • #   tkinter     
    import tkinter
    
    tkinter._test()
    
  • フレーム:
  • # hello world
    import tkinter
    
    base = tkinter.Tk()
    
    #     
    base.mainloop()
    

    Tkinter共通コンポーネント
  • ボタン
      Button				    
      RadioButton			     
      CheckButton			      
      Listbox				     
    
  • テキスト入力コンポーネント
      Entry				       
      Text				       
    
  • タグアセンブリ
      Label				    ,         
      Message				    ,           
    
  • メニュー
      Menu				    
      MenuButton			      ,    Menu  
    
  • スクロールバー
      scale				    
      Scrollbar			     
    
  • その他のコンポーネント
     Canvas				    
     Frame				    ,       
     Toplevel			         
    
  • コンポーネントの概略使用手順
  • 総パネル
  • を作成する.
  • パネルのさまざまなコンポーネントを作成
  • コンポーネントの親コンポーネント、すなわち依存関係
  • を指定する.
  • は、対応する属性を利用してコンポーネントを設定
  • である.
  • コンポーネントにレイアウト
  • を配置する
  • 同期フラッシュ2は類似しており、複数のコンポーネント
  • を作成する.
  • 最後に、総パネルのメッセージループ
  • が開始する.
  • Labelの例
  • # Label   
    
    import tkinter
    
    base = tkinter.Tk()
    #     
    base.wm_title("Label Test")
    
    lb = tkinter.Label(base, text="Python Label")
    #          
    lb.pack()
    
    
    base.mainloop()
    
  • Label設定例
  • #   Label   
    import tkinter
    
    
    base = tkinter.Tk()
    base.wm_title("Label Test")
    #       background, font, underline 
    #      ,    
    lb1= tkinter.Label(base, text="Python AI")
    lb1.pack()
    
    lb2= tkinter.Label(base, text="    ", background="green")
    lb2.pack()
    
    lb3= tkinter.Label(base, text="    ", background="blue")
    lb3.pack()
    
    base.mainloop()
    

    Buttonのプロパティ:
    anchor 				            ,          
    background(bg) 		         
    foreground(fg)		        (     )
    borderwidth(bd)		        
    cursor				           
    command				            
    bitmap				          
    font				          
    width				         (    )
    height				         (    )
    state				       
    text				        
    image				        
    
  • Buttonのケース
  • # Button   
    
    import tkinter
    
    def showLabel():
        global baseFrame
        #          label
        # label     baseFrame
        lb = tkinter.Label(baseFrame, text="  Label")
        lb.pack()
    
    
    baseFrame = tkinter.Tk()
    #       
    # command    ,         ,      
    btn = tkinter.Button(baseFrame, text="Show Label", command=showLabel)
    #btn = tkinter.Button(baseFrame, text="Show Label")
    btn.pack()
    
    baseFrame.mainloop()
    

    コンポーネントレイアウト
  • 制御ユニットの配置方式
  • の3つのレイアウト:
  • pack:方位配置
  • place:座標レイアウト
  • grid:グリッドレイアウト
  • packレイアウト
  • は最も簡単で、コードの量は最も少なくて、1つごとに配置して、デフォルトは上から倒れて、システムは自動的に
  • を設定します
  • の一般的な使用方法は、コンポーネントオブジェクトである.Pack(設定、、、、、、、)
  • side:ドッキング方位、オプション値はLEFT、TOP、RIGHT、BOTTON
  • fill:充填方式,X,Y,BOTH,NONE
  • expande: YES/NO
  • anchor: N,E,S,W,CENTER
  • ipadx:x方向の内辺距離
  • ipady: y
  • padx:x方向外境界
  • pady: y…

  • gridレイアウト
  • 共通使用方式:コンポーネントオブジェクト.grid(設定)
  • row,column番号は,いずれも0から
  • である.
  • sticky:N,S,W,Eは上下左右を表し、コンポーネントがどの方向から始まるかを決定するための
  • である.
  • はipadx,padxなどのパラメータをサポートし、pack関数の意味と同じ
  • をサポートする.
  • はrowspan,columnspanをサポートし、行間、列間の数
  • を表します.
  • placeレイアウト
  • 明確な方位の配置
  • 相対位置レイアウト、ウィンドウサイズを勝手に変更すると混乱
  • place関数を使用し、絶対レイアウトと相対レイアウトに分け、絶対レイアウトはx、yパラメータ
  • を使用する.
  • 相対レイアウトrelx,rely,relheight,relwidth
  • を使用
  • packレイアウトケース
  • # pack    
    import tkinter
    
    baseFrame = tkinter.Tk()
    #               ,    
    
    btn1 = tkinter.Button(baseFrame, text='A')
    btn1.pack(side=tkinter.LEFT, expand=tkinter.YES, fill=tkinter.Y)
    
    btn2 = tkinter.Button(baseFrame, text='B')
    btn2.pack(side=tkinter.TOP, expand=tkinter.YES, fill=tkinter.BOTH)
    
    btn2 = tkinter.Button(baseFrame, text='C')
    btn2.pack(side=tkinter.RIGHT, expand=tkinter.YES, fill=tkinter.NONE, 
              anchor=tkinter.NE)
    
    btn2 = tkinter.Button(baseFrame, text='D')
    btn2.pack(side=tkinter.LEFT, expand=tkinter.NO, fill=tkinter.Y)
    
    btn2 = tkinter.Button(baseFrame, text='E')
    btn2.pack(side=tkinter.TOP, expand=tkinter.NO, fill=tkinter.BOTH)
    
    btn2 = tkinter.Button(baseFrame, text='F')
    btn2.pack(side=tkinter.BOTTOM, expand=tkinter.YES)
    
    btn2 = tkinter.Button(baseFrame, text='G')
    btn2.pack(anchor=tkinter.SE)
    
    
    baseFrame.mainloop()
    
  • gridレイアウトケース
  • # grid    
    import tkinter
    
    baseFrame = tkinter.Tk()
    
    #                    
    #lb1 = tkinter.Label(baseFrame, text="  : ").grid(row=0, sticky= tkinter.W)
    lb1 = tkinter.Label(baseFrame, text="  : ")
    lb1.grid(row=0, sticky= tkinter.W)
    
    en = tkinter.Entry(baseFrame)
    en.grid(row=0, column=1, sticky=tkinter.E)
    
    lb2 = tkinter.Label(baseFrame, text="  : ").grid(row=1, sticky= tkinter.W)
    tkinter.Entry(baseFrame).grid(row=1, column=1, sticky=tkinter.E)
    
    btn = tkinter.Button(baseFrame, text="  ").grid(row=2, column=1, sticky=tkinter.W)
    
    
    baseFrame.mainloop()
    

    メッセージメカニズム
  • メッセージの伝達メカニズム
  • イベント/メッセージを自動的に発行する
  • メッセージは、システムがキュー
  • に送信する責任を負う.
  • 関連コンポーネントによるバインド/設定
  • バックエンドは、関心のあるイベントを自動的に選択し、対応する反応を示す
  • .
  • メッセージ形式:

  • :Buttonはボタンイベントを表し、1はマウスの左ボタンを表し、2は中ボタン
  • を表す.
  • :キーボードAキー
  • :同時にControl,Shift,Aの3つのキー
  • を押す
  • :F 1キーボード
  • キービット対応名称
  • #        
    import tkinter
    
    def baseLabel(event):
            global  baseFrame
            print("  ,     ")
            lb = tkinter.Label(baseFrame, text="    ")
            lb.pack()
    
    #         
    baseFrame = tkinter.Tk()
    
    lb = tkinter.Label(baseFrame, text="    ")
    # label            
    #         ,          baseLabel
    lb.bind("", baseLabel)
    lb.pack()
    
    #       
    #   ,        
    baseFrame.mainloop()
    

    Tkinterのバインド
  • bind_all:グローバル範囲のバインド、デフォルトはグローバルショートカットキーです.例えば、F 1はヘルプドキュメント
  • です.
  • bind_class:3つのパラメータを受け入れます.1つ目はクラス名、2つ目はイベント、3つ目は操作です.
  • w.bind_class(“Entry”, “”, my_paste)

  • bind:インスタンスを個別にバインド
  • unbind:バインドを解除するには、どのイベント
  • をバインドするかを解くパラメータが必要です.
    Entry
  • 入力ボックス、機能単一
  • entry[「show」=「*」、オクルージョン文字
  • を設定
    #      
    
    import tkinter
    
    #         
    def reg():
        #        ,       
        name = e1.get()
        pwd = e2.get()
    
        t1 = len(name)
        t2 = len(pwd)
    
        if name == "111" and pwd == "222":
            #            
            lb3["text"] = "    "
        else:
            lb3['text'] = "        "
            #              
            #   delete     ,            
            e1.delete(0,t1)
            e2.delete(0,t2)
            
    #     
    baseFrame = tkinter.Tk()
    
    lb1 = tkinter.Label(baseFrame, text="   ")
    lb1.grid(row=0, column=0, stick=tkinter.W )
    
    e1 = tkinter.Entry(baseFrame)
    e1.grid(row=0, column=1, stick=tkinter.E)
    
    lb2 = tkinter.Label(baseFrame, text="  : ")
    lb2.grid(row=1, column=0, stick=tkinter.W )
    
    e2 = tkinter.Entry(baseFrame)
    e2.grid(row=1, column=1, stick=tkinter.E)
    e2['show'] = '*'
    
    # Button  command    ,                
    btn = tkinter.Button(baseFrame, text="  ", command=reg)
    btn.grid(row=2, column=1, stick=tkinter.E)
    
    lb3 = tkinter.Label(baseFrame, text="")
    lb3.grid(row = 3)
    
    #    Frame
    baseFrame.mainloop()
    

    メニュー
    1.一般メニュー
  • 最初のMenuクラス定義はparent
  • です.
  • add_commandはメニュー項目を追加し、メニューが最上位メニューの場合は左から右に追加します.そうしないとドロップダウンメニューになります.
  • label:メニュー項目名
  • を指定
  • command:クリックすると対応する関数
  • が呼び出されます.
  • acceletor:ショートカット
  • underline:メニュー情報の下に横線があるか否かを定める
  • menu:属性は、トップメニューとしてどのメニューを使用するかを決定する
  • #        
    import tkinter
    
    baseFrame = tkinter.Tk()
    
    menubar = tkinter.Menu(baseFrame)
    
    for item in ['File', 'Edit', 'View', 'About']:
        menubar.add_command(label=item)
    
    baseFrame['menu'] = menubar
    
    baseFrame.mainloop()
    

    カスケードメニュー
  • add_cascade:カスケードメニューで、後ろのメニュー
  • を引き出す役割を果たす
  • add_cascadeのmenuプロパティ:メニューをどのメニューにカスケードするかを示す
  • label:名前
  • プロセス:
  • menuインスタンス
  • を確立する
  • add_command
  • add_cascade

  • import tkinter
    
    baseFrame = tkinter.Tk()
    
    menubar = tkinter.Menu(baseFrame)
    
    emenu = tkinter.Menu(menubar)
    for item in ['Copy', 'Past', 'Cut']:
        emenu.add_command(label=item)
    
    menubar.add_cascade(label='File')
    menubar.add_cascade(label='Edit', menu=emenu)
    menubar.add_cascade(label='About')
    
    baseFrame['menu'] = menubar
    
    baseFrame.mainloop() 
    

    ポップアップメニュー
  • ポップアップメニューはコンテキストメニュー
  • とも呼ばれる.
  • 実現の大まかな考え方
  • メニューを作成し、メニューに各種機能を追加する
  • マウス右ボタン
  • を監視
  • 右クリックすると位置判断により
  • がポップアップする.
  • Menuを呼び出すpopメソッド
  • add_separator:セパレータ
  • を追加
    import tkinter
    
    def makeLabel():
        global baseFrame
        tkinter.Label(baseFrame, text="PHP        ,  Python").pack()
    
    baseFrame = tkinter.Tk()
    
    menubar = tkinter.Menu(baseFrame)
    for x in ['    ', '   ', '    ']:
        menubar.add_separator()
        menubar.add_command(label=x)
        
    menubar.add_command(label='    ', command=makeLabel)
    
    #                 ,              
    def pop(event):
        #      event.x   event.x_root    
        #menubar.post(event.x_root, event.y_root)
        menubar.post(event.x_root, event.y_root)
    
    baseFrame.bind("", pop)
    
    baseFrame.mainloop()
    

    canvasキャンバス
  • キャンバス:図形を自由に描くことができる小さなステージ
  • キャンバスにオブジェクトを描画します.通常はcreate_を使用します.xxxx,xxxxx=オブジェクトタイプ、例えばline,rectangle
  • キャンバスの役割は、一定のコンポーネントをキャンバスに表示する
  • である.
  • キャンバスでサポートされているコンポーネント:
  • arc円または円弧
  • bitmapビットマップ
  • イメージ画像
  • line
  • oval楕円形
  • polygon多角形
  • rectangle四角形
  • text
  • window(コンポーネント)
  • createを呼び出すたびにxxxは、作成したコンポーネントのIDを返し、タグ
  • をtag属性で指定することもできる.
  • はcanvasを呼び出す.moveは、使い捨て動作
  • を実現する
    #     
    import tkinter
    
    baseFrame = tkinter.Tk()
    
    cvs = tkinter.Canvas(baseFrame, width=300, height=200)
    cvs.pack()
    
    #             
    #         px  
    cvs.create_line(23,23, 190,234)
    cvs.create_text(56,67, text="I LOVE PYTHON")
    
    
    baseFrame.mainloop()
    
  • 五角星
  • を描きます
    #       
    import tkinter
    import math as m
    
    baseFrame = tkinter.Tk()
    
    w = tkinter.Canvas(baseFrame, width=300, height=300, background="gray" )
    w.pack()
    
    
    center_x = 150
    center_y = 150
    
    r = 150
    
    #           
    points = [
            #   
            # pi       ,3.1415926
            center_x - int(r * m.sin(2 * m.pi / 5)),
            center_y - int(r * m.cos(2 * m.pi / 5)),
    
            #   
            center_x + int(r * m.sin(2 * m.pi / 5)),
            center_y - int(r * m.cos(2 * m.pi / 5)),
    
            #   
            center_x - int(r * m.sin( m.pi / 5)),
            center_y + int(r * m.cos( m.pi / 5)),
    
            #  
            center_x,
            center_y - r,
    
            #   
            center_x + int(r * m.sin(m.pi / 5)),
            center_y + int(r * m.cos(m.pi / 5)),
        ]
    
    #        
    w.create_polygon(points, outline="green", fill="yellow")
    w.create_text(150,150, text="   ")
    
    baseFrame.mainloop()
    
    import tkinter
    
    baseFrame = tkinter.Tk()
    
    def btnClick(event):
            global  w
            w.move(id_ball, 12,5)
            w.move("fall", 0,5)
    
    
    
    w = tkinter.Canvas(baseFrame, width=500, height=400)
    w.pack()
    w.bind("", btnClick)
    
    #        id
    id_ball  = w.create_oval(20,20, 50,50, fill="green")
    
    #       tag  
    w.create_text(123,56, fill="red", text="ILovePython", tag="fall")
    #            tag    addtag_withtag  
    #        addtag_all, addtag_above, addtag_xxx  
    id_rectangle = w.create_rectangle(56,78,173,110, fill="gray")
    w.addtag_withtag("fall", id_rectangle)
    
    
    baseFrame.mainloop()