2012年6月18日月曜日

初めてのコンピュータサイエンス第14章解答

第14章練習問題の前半の解答です。以下ネタバレなので、読みたくない方は立ち去りましょう。問題文は載せませんので悪しからず(英語版はpdfで公開されている模様)。日本語版が必要なら買いましょう。

1

このコードは実行すると、ボタンが出てきます。ボタンを押すとアプリケーションが終了するようになっています。

import Tkinter as tk

class Goodbye:
    def __init__(self, parent):
        self.parent = parent
        self.frame = tk.Frame()
        self.frame.pack()

        self.bye = tk.Button(self.frame, text='Good-bye', command=self.byebye)
        self.bye.pack()

    def byebye(self):
        self.parent.destroy()


if __name__ == '__main__':
    window = tk.Tk()
    myapp = Goodbye(window)
    window.mainloop()

2

このコードを実行すると数字が入ったボタンが出てきます。ボタンをクリックすると、表示される値が1ずつ大きくなります。

import Tkinter as tk

class CountUp:
    def __init__(self, parent):
        self.parent = parent
        self.frame = tk.Frame(parent)
        self.frame.pack()

        self.state = tk.IntVar()
        self.state.set(0)

        self.button = tk.Button(parent, text=self.state.get(),
                                command=self.count)
        self.button.pack()

    def count(self):
        self.state.set(self.state.get() + 1)
        self.button.config(text=self.state.get())

if __name__ == '__main__':
    window = tk.Tk()
    app = CountUp(window)
    window.mainloop()

3

x = lambda(): 3を読みやすくせよということなのですが、このコードを実行するとエラーになります。読みやすくする以前の問題で、何がしたいのでしょうか?

4

# -*- encoding: utf8 -*-

import Tkinter as tk

class CountDNA:
    def __init__(self, parent):
        self.parent = parent
        self.frame = tk.Frame()
        self.frame.pack()

        # モデルはATGCの数
        self.dic = {'A' : 0, 'T' : 0, 'G' : 0, 'C' : 0}
        self.message = tk.StringVar()

        # DNAの文字列を表示する
        self.textbox = tk.Text(self.frame, width=30, height=10)
        self.textbox.pack()

        # 数えるボタンを表示する
        self.bt = tk.Button(self.frame, text="数える",
                  command=lambda: self.countATGC(self.dic, self.message))
        self.bt.pack()

        # 数えた結果を表示する
        self.label = tk.Label(self.frame, textvariable=self.message)
        self.label.pack()


    # 出現回数を計算する
    def countATGC(self, dic, msg):
        for (key, value) in dic.iteritems():
            dic[key] = 0

        for c in self.textbox.get('0.0', tk.END):
            if c in dic.keys():
                dic[c] = dic.get(c, 0) + 1
        # print dic
        msg.set(self.printATGC(dic))

    def printATGC(self, dic):
        msg =  u'Aの数:%d Tの数:%d Cの数:%d Gの数:%d' % \
               (dic['A'], dic['T'], dic['C'], dic['G'])
        return msg

if __name__ == '__main__':
    window = tk.Tk()
    app = CountDNA(window)
    window.mainloop()

5

練習ということで、敢えてクラスを使わないで書いてみました。ちなみにこのコードをとあるWebエンジニアに見せたところ、__init__に何もかも押し込むのは、Cで言うところのmainに1000行書くようなものだということで、あまり良い作法でないということを教わりました。機能自体は実現できましたが、更によい書き方を知る必要もありそうです。

# -*- encoding: utf8 -*-

import Tkinter as tk

window = tk.Tk()
frame = tk.Frame(window)
frame.pack()
label = tk.Label(frame, text="華氏表現の温度")
label.pack()

var = tk.DoubleVar()

entry = tk.Entry(frame, textvariable=var) # 数値入力部
entry.pack()

svar = tk.StringVar()

msg = tk.Label(frame, textvariable=svar)
msg.pack()

bt_trans = tk.Button(frame, text="変換", command=lambda: click_trans(var,svar))
bt_trans.pack()

bt_end = tk.Button(frame, text="終了", command=lambda: click_end(window))
bt_end.pack()

def to_celsius(t):
    return (t - 32.0) * 5.0 / 9.0

def click_trans(var,svar):
    try:
        # var.get()が文字列だと例外が発生する
        s_temp = "%.10f" % to_celsius(var.get())
        svar.set(s_temp)
    except:
        svar.set("???")

def click_end(window):
    window.destroy()

window.mainloop()

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計