Python
FizzBuzz
python3
Tkinter

tkinterでfizzbuzzを判定するGUIを作ってみた

キャプチャ.JPG

コード

tkfizzbuzz.py
!/usr/bin/env python
-*- coding: utf-8 -*-

from tkinter import *
from tkinter import ttk

root = Tk()
root.title(u'Fizz Buzz')

#FizzBuzzを判定する関数
def fizzbuzz(n):
    fzbz = "Fizz Buzz"
    fz = "Fizz"
    bz = "Buzz"
    try:
        n = int(n)
    except ValueError:
        return Entry1.delete(0, END)
    if n % 15 == 0:          
        resltfizbuz(fzbz)
    elif n % 3 == 0:
        resltfizbuz(fz)
    elif n % 5 == 0:
        resltfizbuz(bz)
    else:
        resltfizbuz(n)
    Entry1.delete(0,END)

#判定結果をリストボックスに書き込む
def resltfizbuz(reslt):
    Listbox1.insert(END,reslt)
    Listbox1.yview_scroll(5, UNITS)

#フレーム
frame = Frame(root,width=30)
frame.grid()

#エントリー
Entry1 = Entry(frame, width=30)
Entry1.bind("<Return>", lambda event:fizzbuzz(Entry1.get()))
Entry1.grid(row=0)

#リストボックス
Listbox1 = Listbox(frame, width=30)
Listbox1.grid(row=1, column=0)

#スクロールバー
Scroll = ttk.Scrollbar(frame, orient=VERTICAL, command=Listbox1.yview)
Listbox1['yscrollcommand'] = Scroll.set
Scroll.grid(row=1, column=1, sticky=(N,S))

#ボタン
Button1 = Button(frame,text=u'FizzBuzz',command=lambda: fizzbuzz(Entry1.get()))
Button1.grid(row=2)

root.mainloop()

コードの説明

#FizzBuzzを判定する関数
def fizzbuzz(n):
    fzbz = "Fizz Buzz"
    fz = "Fizz"
    bz = "Buzz"
    try:
        n = int(n)
    except ValueError:
        return Entry1.delete(0, END)
    if n % 15 == 0:          
        resltfizbuz(fzbz)
    elif n % 3 == 0:
        resltfizbuz(fz)
    elif n % 5 == 0:
        resltfizbuz(bz)
    else:
        resltfizbuz(n)
    Entry1.delete(0,END)

数字を入力するとfizzbuzzを判定し、3の倍数ならfizz、5の倍数ならbuzz、15の倍数ならfizzbuzz、それ以外の数字はそのまま返します。
int以外は消します。

#判定結果をリストボックスに書き込む
def resltfizbuz(reslt):
    Listbox1.insert(END,reslt)
    Listbox1.yview_scroll(5, UNITS)

fizzbuzzの結果をリストボックスに挿入します。
リストボックスの高さ以上に結果が挿入された場合、スクロールが面倒なのでyview_scrollで下にスクロールさせます。

#エントリー
Entry1 = Entry(frame, width=30)
Entry1.bind("<Return>", lambda event:fizzbuzz(Entry1.get()))
Entry1.grid(row=0)

数字を入れるエントリーを一番上に作ります。
Entry1.bind("<Return>", lambda event:fizzbuzz(Entry1.get()))で、
エンターキーを押すと、入力した値をfizzbuzz関数が受け取るように設定します。
注:半角の<>だとなぜか<Return>が消えてしまうので全角で打ちました。

#リストボックス
Listbox1 = Listbox(frame, width=30)
Listbox1.grid(row=1, column=0)

fizzbuzzの判定結果を出力するリストボックスです。

#スクロールバー
Scroll = ttk.Scrollbar(frame, orient=VERTICAL, command=Listbox1.yview)
Listbox1['yscrollcommand'] = Scroll.set
Scroll.grid(row=1, column=1, sticky=(N,S))

リストボックスに縦のスクロールバーを設定します。
sticky=(N,S)でリストボックスと同じ高さにスクロールバーを引き延ばします。

#ボタン
Button1 = Button(frame,text=u'FizzBuzz',command=lambda: fizzbuzz(Entry1.get()))
Button1.grid(row=2)

エントリーの値をget()で受け取りfizzbuzzに渡します。