新しいウィンドウを生成するにはどうしたらいいか?
Toplevel()
を使う。
from Tkinter import *
class Mainwindow(Frame):
def __init__(self, master = None, *args, **kwargs):
Frame.__init__(self, master, *args, **kwargs)
Button(self, text = 'click me! (Open dialog)',
command = self.open_dialog).pack()
def open_dialog(self):
u""" Tk() と同じような感じで使える """
sub_win = Toplevel(master = self.master)
Button(sub_win, text = 'thank you', command = sub_win.destroy).pack()
if __name__ == '__main__':
root = Tk()
mainwindow = Mainwindow(master = root)
mainwindow.pack()
root.mainloop()
新しいウィンドウを生成できるが、問題がいくつかある。
- 新しいウィンドウが開いても、フォーカスはメインウィンドウにある
- タスクバー上に新しいウィンドウのアイテムも表示される
- 同じウィンドウをいくつも生成できてしまう
新しく開かれたウィンドウにフォーカスを移動するためには、 focus_set()
を使う。
def open_dialog(self):
u""" Tk() と同じような感じで使える """
sub_win = Toplevel(master = self.master)
button = Button(sub_win, text = 'thank you', command = sub_win.destroy)
button.pack()
u""" フォーカス移動 """
button.focus_set()
タスクバー上に新しいウィンドウのアイテムも表示されていい場合、ダメな場合はあると 思うが、ダイアログであれば普通はでないと思われる。
Toplevel
クラスの transient()
で新しいウィンドウのアイテムがタスクバーに追加
されなくなる。
def open_dialog(self):
u""" Tk() と同じような感じで使える """
sub_win = Toplevel(master = self.master)
button = Button(sub_win, text = 'thank you', command = sub_win.destroy)
button.pack()
u""" フォーカス移動 """
button.focus_set()
sub_win.transient(self.master)
モーダルダイアログにするイメージですかね。 Toplevel
クラスにある grab_set()
を読んでおくと、メインウィンドウへフォーカスできなくなる。
一般的なモーダルとちょっと挙動が違うような気もするけど。
def open_dialog(self):
u""" Tk() と同じような感じで使える """
sub_win = Toplevel(master = self.master)
button = Button(sub_win, text = 'thank you', command = sub_win.destroy)
button.pack()
u""" フォーカス移動 """
button.focus_set()
sub_win.transient(self.master)
sub_win.grab_set()