Birden fazla toplevel penceresinin açılmasını engellemek

Mrb arkadaşlar çoklu toplevel olan bir pogramda aynı anda 1 den fazla toplevel penceresinin açılmasını istemiyorum. Mümkün müdür ? Amacım Herhangi bir toplevel penceresindeki widget değişkenlerini diğer toplevel pencerelerinde de kullanmak. Tşkler…

Mümkündür. Bunun için algoritma oluşturmanız lazım.

Kullanıcıya böyle olduğu hissettirilebilir. Yani bu durumu taklit edebilirsiniz. Ancak Tkinter’in altyapısı tk buna izin vermez sanıyorum.

Biraz araştırma yaptım toplevel açıldığında menubarı disable yaparak istediğimi gerçekleştirebildim; Fakat pencereyi kapattığımda menubarın tekrar etkinleştirilmesini yapamıyorum. Bu orada widget olayları hakkında ayrıntılı kaynak bulamıyorum. Önerebileceğiniz bir site var mı?

from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from tkcalendar import *
class Anamenu():
    def __init__(self,master):#ana menü
        self.deger=2
        self.sayac=8
        self.master=master
        self.master.title("KASA PROGRAMI")
        self.master.geometry("{0}x{1}+0+0".format(master.winfo_screenwidth(),master.winfo_screenheight()))#"0X1+0+0 TAMEKRAN YAPAR
    def menucubugu(self):#------------------------------ANA MENU MENUBAR------------------------------------------
        self.menubar=Menu(self.master)
        self.kayit=Menu(self.menubar,tearoff=0)
        self.kayit.add_command(label="Öğrenci Kayıt",command=self.kayit_kaydet)
        self.kayit.add_command(label="Personel Kayıt",command=self.personel_kaydet)
        self.kayit.add_command(label="Sınav Kulübü Kayıt")
        self.kayit.add_command(label="Gelir Kalemleri")
        self.kayit.add_command(label="Gider Kalemleri")
        self.menubar.add_cascade(label="--KAYIT--",font=("Verdana 13" ),menu=self.kayit)
        self.gelir=Menu(self.menubar,tearoff=0)
        self.menubar.add_cascade(label="--GELİR--",font=("times", 35),menu=self.gelir)
        self.master.config(bg="lightgreen",menu=self.menubar)
    def kayit_kaydet(self):#öğrenci kayıt penceresi------------------------------------------------------------------------------
        self.kayitwin=Toplevel(self.master)
        self.kayitwin.title("Öğrenci Kaydı")
        self.menubar.entryconfig("--KAYIT--",state="disable")
        self.menubar.entryconfig("--GELİR--",state="normal")
    def personel_kaydet(self):#Personel kayıt penceresi------------------------------------------------------------------------------
        self.personelwin=Toplevel(self.master)
        self.personelwin.title("PERSONEL KAYIT EKRANI")
        self.personelwin.geometry("360x330")
root=Tk()
my_gui=Anamenu(root)
my_gui.menucubugu()
root.mainloop()

Basit mantık olarak şöyle yapabilirsiniz. Bir değişken olsun. Bu değişken toplevel pencerenin açık olup olmadığını kontrol etmek için kullanılsın.

if pencere_acik:
    # pencere açılmaz
else:
    # pencere açılır
    pencere_acik = True

Toplevel pencere kapandığı zaman pencere_acik değişkeni False olarak değiştirilirse hersey tamam olur :slight_smile:

coderistan iyi güzel söylüyorsunda açık pencereleri koda dökmek benim için sıkıntı. ´´´if pencere.open:
menu.enable´´´ şeklinde kod mu yazacağım yoksa for döngüsü mü kuracağım.
For döngüsü kuracaksam açık pencereleri nasıl tespit edeceğim ?

Kodları yukarıda paylaşmıştım…

Gözden kaçmış kusura bakmayın.Şöyle bir şey mi istiyorsunuz acaba?

from tkinter import *
from tkinter import ttk
from tkinter import messagebox
#import tkcalendar

# Kilit sınıfı
class Locker:
    def __init__(self):
        self.windows = {}

    def isLock(self,window):
        return self.windows.get(window,False)

    def lock(self,window):
        self.windows[window] = True

    def acquire(self,window):
        if(self.isLock(window)):
            self.windows.pop(window)


class Anamenu():
    def __init__(self,master):#ana menü
        self.deger=2
        self.sayac=8
        self.master=master
        self.master.title("KASA PROGRAMI")
        #self.master.geometry("{0}x{1}+0+0".format(master.winfo_screenwidth(),master.winfo_screenheight()))#"0X1+0+0 TAMEKRAN YAPAR

        # pencereleri kilitlemek için kullanacağımız nesne
        self.locker = Locker()

    def menucubugu(self):#------------------------------ANA MENU MENUBAR------------------------------------------
        self.menubar=Menu(self.master)
        self.kayit=Menu(self.menubar,tearoff=0)
        self.kayit.add_command(label="Öğrenci Kayıt",command=self.kayit_kaydet)
        self.kayit.add_command(label="Personel Kayıt",command=self.personel_kaydet)
        self.kayit.add_command(label="Sınav Kulübü Kayıt")
        self.kayit.add_command(label="Gelir Kalemleri")
        self.kayit.add_command(label="Gider Kalemleri")
        self.menubar.add_cascade(label="--KAYIT--",font=("Verdana 13" ),menu=self.kayit)
        self.gelir=Menu(self.menubar,tearoff=0)
        self.menubar.add_cascade(label="--GELİR--",font=("times", 35),menu=self.gelir)
        self.master.config(bg="lightgreen",menu=self.menubar)

    def kayit_kaydet(self):#öğrenci kayıt penceresi------------------------------------------------------------------------------
        if(self.locker.isLock("kayit_kaydet")):
            messagebox.showwarning("Hata","Pencere zaten açık")
        else:
            self.locker.lock("kayit_kaydet") # kilitledik
            self.kayitwin=Toplevel(self.master)
            self.kayitwin.title("Öğrenci Kaydı")
            self.kayitwin.protocol("WM_DELETE_WINDOW",lambda:self.close_window(self.kayitwin,"kayit_kaydet"))
            
    def personel_kaydet(self):#Personel kayıt penceresi------------------------------------------------------------------------------
        if(self.locker.isLock("personel_kaydet")):
            messagebox.showwarning("Hata","Pencere zaten açık")
        else:
            self.locker.lock("personel_kaydet")
            self.personelwin=Toplevel(self.master)
            self.personelwin.title("PERSONEL KAYIT EKRANI")
            self.personelwin.geometry("360x330")
            self.personelwin.protocol("WM_DELETE_WINDOW",lambda:self.close_window(self.personelwin,"personel_kaydet"))

    # kilidi açıp, pencereleri kapattığımız metod
    def close_window(self,window,lock_key):
        self.locker.acquire(lock_key)
        window.destroy()


root=Tk()
my_gui=Anamenu(root)
my_gui.menucubugu()
root.mainloop()

coderistan tşk ederim menu çubuğunu disable yaparak sorunu çözdüm. Amacım tek pencereyle çalışmaktı.

Rica ederim, sorun çözüldüyse sorun yok :slight_smile: