私は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