tkinterを使う

私はGUIを使うプログラムを書くことはあまりなかった。
tkinterはPythonでGUIを構築・操作するための標準ライブラリだという。
CentOSならyum install python3-tkinterで導入する。
続けてpython3 -m tkinterを実行するとデモが動く。

簡単な Hello World プログラムを元に入れ子にする:
import tkinter
root = tkinter.Tk()

class App(tkinter.Frame):
	def __init__(self, master=root):
		super().__init__(master)
		self.master = master
		self.pack()
		self.create_widgets()

	def __del__(self):
		try:
			if self.master is root: self.master.destroy()
			else: self.destroy()
		except: pass

	def create_widgets(self):
		self.hi_there = tkinter.Button(self)
		self.hi_there['text'] = 'Hello World\n(click me)'
		self.hi_there['command'] = self.say_hi
		self.hi_there.pack(side='top')
		self.quit = tkinter.Button(self, text='QUIT', fg='red', command=self.__del__)
		self.quit.pack(side='bottom')

	def say_hi(self):
		print('hi there, everyone!')

app = App()
app1 = App(app)
app2 = App(app1)
#app1.mainloop() # 子孫のmainloopを実行しなくてよい
app.mainloop()
時間内に押されたボタンの名前を取得する:
import tkinter

class Dialog():
	def __init__(self, title, message, duration=None, *params):
		self.result = None
		tk = tkinter.Tk()
		self.tk = tk
		def _set_button(tk, text):
			button = tkinter.Button(tk, text=str(text))
			button.configure(command=lambda: self.set_value(button))
			button.pack(side='left')
		self.tk.title(str(title))
		tkinter.Label(self.tk, text=str(message)).pack(side='top')
		for x in params: _set_button(self.tk, x)
		if duration is not None: self.tk.after(duration, lambda: self.tk.destroy())
		self.tk.mainloop()

	def set_value(self, button):
		self.result = button['text']
		self.tk.destroy()

	def get_result(self):
		return self.result

params = [
	['Title1', 'Message1'],
	['Title2', 'Message2', 3000], # 3秒待つ
	['Title3', 'Message3', None, 'Yes', 'No'],
	['Title4', 'Message4', 5000, 'Button1', 'Button2', 'Button3', 'Button4'], # 5秒待つ
]
for param in params:
	dialog = Dialog(*param)
	print(dialog.get_result())
	del dialog # tk.destoryの後にtk.afterが動くときがあるのでオブジェクトを削除する
便利だ…w
2020/07/05 11:52
タグ