89680


Python3, Tkinterを用いてアプリケーション開発をしています。  
開発アプリケーション内にて複数のウィンドウを使用し、ウィンドウごとに  
別の動作をするようにしたいです。  
その際、サブウィンドウをリスト化し、タイトルがインデックスと同じになるように  
することでサブウィンドウの区別をしました。

そこで、最前面にあるウィンドウのタイトルを取得したいが  
その方法が分からないため困っています。

サンプルコードにおけるゴール: サブウィンドウを2つ生成した後に  
タイトル **sub_window_0** をクリックし最前面に表示し  
その後タイトル **sub_window_0** という値を取得

以下、サンプルコードになります。

[code]

    import tkinter as tk
    
    class make_window():
    
        def __init__(self):
            self.win_li = []
            self.i = 0
            self.root = tk.Tk()
            self.root.title("make_window")
    
            self.b = tk.Button(self.root, text="make_sub_window", command=self.button_event)
            self.b.pack()
    
            self.root.mainloop()
    
    
        def button_event(self):
            sub_win = tk.Toplevel()
            title = "sub_window_#" + str(self.i)
            sub_win.title(title)
            self.win_li.append(sub_win)
            self.i += 1
    
    if __name__ == "__main__":
        
        app = make_window()
    
[/code]


CC BY-SA 4.0
2022-06-29T18:30:12.180
89674
2022-06-30T01:24:19.127
53285
question
python python3 tkinter tk
Tkinterにおいて、最前面に表示したウィンドウのタイトルを取得したい


各Windowの管理や処理内容の分岐などに注意を払う必要がありますが、このような実装ではいかがでしょうか？  
Titleテキストで判断が可能です。  
また、各Windowでの各Entryウィジットへのフォーカスも試してみました。  
main windowへフォーカスが移ったことも判断できます。

サブウィンドウは、メインと異なる動きだと思いますので、クラス化して実装したほうが良いと思います。

[code]

    import tkinter as tk
    
    
    class main_window():
        def __init__(self):
            self.root = self._create_window_()
            self._create_widget_(self.root)
            self.event_bind(self.root)
    
            self.sub_window_cnt = 0
    
            self.root.mainloop()
            return
    
        def _create_window_(self):
            root = tk.Tk()
    
            title = 'main window'
    
            root.title(title)
            root.minsize(300, 200)
    
            return root
    
        def _create_widget_(self, root):
            self.btn_create_sub_widow = tk.Button(
                root,
                text="create sub window",
                command=self.btn_create_sub_widow_cliecked
            )
    
            self.btn_create_sub_widow.pack()
    
            return
    
        def event_bind(self, root):
            root.bind("<FocusIn>", lambda x: self.foucus_in(root))
            root.bind("<FocusOut>", lambda x: self.foucus_out(root))
    
            root.deiconify()
            root.lift()
            root.focus_force()
    
        def btn_create_sub_widow_cliecked(self):
            self.sub_window_cnt += 1
            root = tk.Toplevel()
            root.title(f"sub window #{self.sub_window_cnt}")
            root.minsize(300, 200)
            entry1 = tk.Entry(root)
            entry1.pack()
            entry1.bind("<FocusIn>", lambda x: self.entry_foucus_in(entry1))
            entry2 = tk.Entry(root)
            entry2.pack()
            entry2.bind("<FocusIn>", lambda x: self.entry_foucus_in(entry2))
    
            self.event_bind(root)
    
            return
    
        def foucus_in(self, root):
            print("foucus_in", root.title())
            return
    
        def foucus_out(self, root):
            print("foucus_out", root.title())
            return
    
        def entry_foucus_in(self, Widget):
            print("entry foucus_in", Widget.get())
            return
    
    
    main_window()
    
    
[/code]


CC BY-SA 4.0
2022-06-30T01:24:19.127
89680
2022-06-30T01:24:19.127
32891
89674
answer