第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 件のコメント:
コメントを投稿