grab_set metodunun toplevel sınıfı örnekleri arasından kendi örneğine odaklıyor olması lazım.
Pencereler arası geçiş için şöyle bir şey düşündüm.
from tkinter import *
import random
child_window_list = []
class MainWindow(Tk):
def __init__(self):
super().__init__()
self.place_widgets()
self.mainloop()
def place_widgets(self):
button = Button(self,text="Bana Tıkla!",command=self.open_new_window)
button.pack()
def open_new_window(self):
Window(parent=self,group=child_window_list)
Window(parent=self,group=child_window_list)
random.choice(child_window_list).grab_set()
class Window(Toplevel):
def __init__(self,parent,group=None):
self.parent = parent
self.group = group
super().__init__(self.parent)
group.append(self)
self.setup()
def setup(self):
self.protocol("WM_DELETE_WINDOW",self.destroy_)
self.geometry("600x600")
self.footer = Frame(self,bg="white",height=80)
self.footer.pack(side="bottom",fill="x")
self.prev_button = Label(self.footer,text="<",bg="ghostwhite",font=("System",25))
self.prev_button.pack(side="left",padx=50,pady=40)
self.prev_button.bind("<Button-1>",self.prev_window)
self.next_button = Label(self.footer,text=">",bg="ghostwhite",font=("System",25))
self.next_button.pack(side="right",padx=50,pady=40)
self.next_button.bind("<Button-1>",self.next_window)
def next_window(self, event):
self.grab_release()
self.group[self.group.index(self)+1].grab_set()
def prev_window(self, event):
self.grab_release()
self.group[self.group.index(self)-1].grab_set()
def destroy_(self):
self.destroy()
MainWindow()
Ayrıca sizin dediğiniz gibi artarda 3 tane pencere açılınca yalnızca birini kilitlemesi gibi bir sorun yaşamadım. Verdiğiniz kodda oluşturulan toplevel örneklerinin parentinin olmamasından dolayı oluyor olabilir.