Yamamoto's Laboratory
 
環境設定
 
プログラム作成
  書き方
 
 
 
 
tkinter
  練習02
 
 
 
 
 
 

はじめに

Pythonのtkinterの練習01のページを執筆中に,たまたま,「An Introduction to Tkinter」を見つけました.ついでに,ここに載っているプログラムも実行してみようと思い練習02のページをつくることにしました.

GUIの練習

Hello, tkinter   ラベル

プログラム

おなじみの Hello world を表示させるプログラムです.

Python tkinter Hello world

このプログラムのソースは,次のようになります.

Hello world プログラム(hello1.py).

001   #!/usr/bin/python3
002   
003   import tkinter as tk
004   
005   #===============================
006   # main function
007   #===============================
008   if __name__  == '__main__':
009   
010       root = tk.Tk()
011       w = tk.Label(root, text="Hello, world!")
012       w.pack()
013   
014       root.mainloop()

解説

このプログラムの内容は,以下の通りです.

行番号 動作の説明
001 Python の実行ファイルのパスの指定(シェバング).
003 モジュール tkinter を 名前空間 tk でインポートします.
008 メイン関数の開始です.
010 オブジェクト root を作成します.
011 ウィジェットにラベル付けます.
012 親ウィジェットに部品を配置する準備をします.
014 無限ループに入ります.

Hello, Again   ボタン

プログラム

Python tkinter Hello world

リスト2 ボタン付き Hello プログラム(hello2.py).

001   #!/usr/bin/python3
002   
003   import tkinter as tk
004   
005   #=================================================
006   # definition of class
007   #=================================================
008   class App:
009   
010       def __init__(self, master):
011   
012           frame = tk.Frame(master)
013           frame.pack()
014   
015           self.button = tk.Button(frame, text="QUIT", fg="red", command=frame.quit)
016           self.button.pack(side="left")
017   
018           self.hi_there = tk.Button(frame, text="Hello", command=self.say_hi)
019           self.hi_there.pack(side="left")
020   
021       def say_hi(self):
022           print("hi there, everyone!")
023   
024   #=================================================
025   # main function
026   #=================================================
027   if __name__  == '__main__':
028       root = tk.Tk()
029       app = App(root)
030       root.mainloop()

解説

Events and Bindings   クリック座標

プログラム

Python tkinter イベントとバインド

クリックした座標を読み取るプログラム(bind1.py).

001   #!/usr/bin/python3
002   
003   import tkinter as tk
004   
005   def callback(event):
006       print("clicked at", event.x, event.y) 
007   
008   #=================================================
009   # main function
010   #=================================================
011   if __name__  == '__main__':
012       root = tk.Tk()
013       frame = tk.Frame(root, width=100, height=100)
014       frame.bind("<Button-1>", callback)
015       frame.pack()
016       root.mainloop()

解説

Protocol   終了メッセージボックス

プログラム

Python tkinter メイン Python tkinter 終了メッセージ

メッセージボックスを表示して終了するプログラム.(protocol1.py).

001   #!/usr/bin/python3
002   
003   import tkinter as tk
004   import tkinter.messagebox as mb
005   
006   def callback():
007       if mb.askokcancel("Quit", "Do you really wish to quit?"):
008           root.destroy()
009   
010   #=================================================
011   # main function
012   #=================================================
013   if __name__  == '__main__':
014       root = tk.Tk()
015       root.protocol("WM_DELETE_WINDOW", callback)
016   
017       root.mainloop()

解説

プログラム

メニューがついた画面をつくるプログラム(menu1.py).

001   #!/usr/bin/python3
002   
003   import tkinter as tk
004   
005   def callback():
006       print("called the callback!")
007   
008   #=================================================
009   # main function
010   #=================================================
011   if __name__  == '__main__':
012   
013       root = tk.Tk()
014   
015       # create a menu
016       menu = tk.Menu(root)
017       root.config(menu=menu)
018   
019       filemenu = tk.Menu(menu)
020       menu.add_cascade(label="File", menu=filemenu)
021       filemenu.add_command(label="New", command=callback)
022       filemenu.add_command(label="Open...", command=callback)
023       filemenu.add_separator()
024       filemenu.add_command(label="Exit", command=callback)
025   
026       helpmenu = tk.Menu(menu)
027       menu.add_cascade(label="Help", menu=helpmenu)
028       helpmenu.add_command(label="About...", command=callback)
029   
030       root.mainloop()

解説

Toolbars

プログラム

Python tkinter ツールバー

ツールバーがついたウィンドウをつくるプログラム(toolbar1.py).

001   #!/usr/bin/python3
002   
003   import tkinter as tk
004   
005   def callback():
006       print("called the callback!")
007   
008   #=================================================
009   # main function
010   #=================================================
011   if __name__  == '__main__':
012       root = tk.Tk()
013       # create a toolbar
014       toolbar = tk.Frame(root)
015   
016       b = tk.Button(toolbar, text="new", width=6, command=callback)
017       b.pack(side="left", padx=2, pady=2)
018   
019       b = tk.Button(toolbar, text="open", width=6, command=callback)
020       b.pack(side="left", padx=2, pady=2)
021   
022       toolbar.pack(side="top", fill=tk.X)
023   
024       root.mainloop()

解説

Status Bars

プログラム

Python tkinter ステータスバー

ステータスバーがついたウィンドウをつくるプログラム(tkSimpleStatusBar.py).

001   #!/usr/bin/python3
002   
003   import tkinter as tk
004   import time
005   
006   #=================================================
007   # definition of class
008   #=================================================
009   class StatusBar(tk.Frame):
010   
011       def __init__(self, master):
012           tk.Frame.__init__(self, master)
013           self.main = tk.Label(self, bd=1, relief="sunken", anchor="n",\
014                                    height=10, width=20, text="status bar test")
015           self.main.pack(fill="both")
016           self.label = tk.Label(self, bd=1, relief="sunken", anchor="w")
017           self.label.pack(fill="x")
018   
019       def set(self, format, *args):
020           self.label.config(text=format % args)
021           self.label.update_idletasks()
022   
023       def clear(self):
024           self.label.config(text="")
025           self.label.update_idletasks()
026   
027   #=================================================
028   # main function
029   #=================================================
030   if __name__  == '__main__':
031       root = tk.Tk()
032       status = StatusBar(root)
033       status.pack(side="bottom", fill="x")
034       for var in range(0, 101):
035           status.set("status\t%d percent",var)
036           time.sleep(1)
037       root.mainloop()

解説

Message Boxes

プログラム

Python tkinter Python tkinter Python tkinter

メッセージボックスを表示するプログラム(message_boxes.py).

001   #!/usr/bin/python3
002   
003   import tkinter as tk
004   import tkinter.messagebox as mb
005   
006   filename = "hoge"
007   try:
008       fp = open(filename)
009   except:
010       mb.showwarning(
011           "Open file",
012           "Cannot open this file\n(%s)" % filename
013       )
014       

Data Entry(string)

プログラム

Python tkinter Data Entry Python tkinter Data Entry

文字列の入力を促すダイアログを表示するプログラム(askstring.py).

001   #!/usr/bin/python3
002   
003   import tkinter as tk
004   import tkinter.simpledialog as sd
005   
006   class main_window(tk.Frame):
007       def __init__(self, master):
008           tk.Frame.__init__(self, master)
009           self.label = tk.Label(master,text="There is no data.")
010           self.label.pack()
011   
012           self.button = tk.Button(master, text="Input String", fg="red", 
013                                   command=self.askstr)
014           self.button.pack(side="left")
015   
016       def set(self, str):
017           self.label.config(text=str)
018   
019       def askstr(self):
020           data=sd.askstring("test askstring", "input", initialvalue="hoge")
021           self.set(data)
022   
023   #=================================================
024   # main function
025   #=================================================
026   if __name__  == '__main__':
027       root = tk.Tk()
028       mw = main_window(root)
029       root.mainloop();

解説

Data Entry(integer)

プログラム

Python tkinter Python tkinter

整数を読み込んでフィボナッチ数列を計算する(askinteger.py).

001   #!/usr/bin/python3
002   
003   import tkinter as tk
004   import tkinter.simpledialog as sd
005   import math
006   
007   #=================================================
008   # difinition class
009   #=================================================
010   class main_window(tk.Frame):
011       def __init__(self, parent):
012           super(main_window, self).__init__(parent)
013           parent.title("Fibonacci number")
014           parent.minsize(200,50)
015           self.label = tk.Label(parent,text="Fibonacci")
016           self.label.pack()
017   
018           #-------------- sin button ----------
019           self.buttons = tk.Button(parent, text="Integer", fg="red",
020                                    command=self.askint)
021           self.buttons.pack()
022   
023       def fibonacci(self, n):
024           if n==0:
025               return 0
026           if n==1:
027               return 1
028           return (self.fibonacci(n-2)+self.fibonacci(n-1))
029   
030       def set(self, st):
031           self.label.config(text=st)
032   
033       def askint(self):
034           n  = sd.askinteger("Input integer", "Fibonacci n",)
035           fn = self.fibonacci(n) 
036           self.set(fn)
037   
038   #=================================================
039   # main function
040   #=================================================
041   if __name__  == '__main__':
042       root = tk.Tk()
043       mw = main_window(root)
044       root.mainloop();

Data Entry(float)

プログラム

Python tkinter Data Entry(float) Python tkinter Data Entry(float)

実数を読み込んで三角関数を計算する(askfloat.py).

001   #!/usr/bin/python3
002   
003   import tkinter as tk
004   import tkinter.simpledialog as sd
005   import math
006   
007   #=================================================
008   # difinition class
009   #=================================================
010   class main_window(tk.Frame):
011       def __init__(self, parent):
012           super(main_window, self).__init__(parent)
013           self.label = tk.Label(parent,text="Trigonometric function.")
014           self.label.pack()
015           #-------------- sin button ----------
016           self.buttons = tk.Button(parent, text="sin(x)", fg="red",
017                                    command=lambda:self.askstr("sin"))
018           self.buttons.pack(side="left")
019           #-------------- cos button ----------
020           self.buttonc = tk.Button(parent, text="cos(x)", fg="red", 
021                                   command=lambda:self.askstr("cos"))
022           self.buttonc.pack(side="left")
023   
024       def set(self, st):
025           self.label.config(text=st)
026   
027       def askstr(self, f):
028           theta=sd.askfloat("test askinteger", "deg",)
029           if f=="sin":
030               data=str(math.sin(math.radians(theta)))
031           if f=="cos":
032               data=str(math.cos(math.radians(theta)))
033           self.set(data)
034   
035   #=================================================
036   # main function
037   #=================================================
038   if __name__  == '__main__':
039       root = tk.Tk()
040       mw = main_window(root)
041       root.mainloop();

解説

ページ作成情報

参考資料

  1. An Introduction to Tkinter.このWebページを参考にしています..
  2. Python v3.0.1 documentationの「Graphical User Interfaces with Tk」.
  3. Tkinter 8.4 reference: a GUI for Python
  4. テキストウィジェットについては,広井誠さんのお気楽 Python/Tkinter 入門の「テキストウィジェット」を参考にしました.同じく広井さんの「Python Programming」も参考になります.

更新履歴

2010年09月 ページの新規作成


no counter