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