Skip to content

Instantly share code, notes, and snippets.

@kuchida1981
Created April 21, 2014 03:27
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kuchida1981/11131457 to your computer and use it in GitHub Desktop.
Save kuchida1981/11131457 to your computer and use it in GitHub Desktop.
Tkinterネタ 新しいウィンドウの生成

Tkinter で新しいウィンドウ/ダイアログを生成する

新しいウィンドウを生成するにはどうしたらいいか? 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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment