Tkinter pencere sorunu

Arkadaşlar önemli bir sorum var Tkinter’de mesela kullanıcı adı şifre yazılan bir ekran yaptık giriş yaptıktan sonra bu ekranın gitmesini istiyorum ben nasıl yaparım yeni bir ekran gelsin
Not: Ekstra bir ekran oluşmadan var olan ekrandaki şeyler yok olacak yenileri gelcek

bir frame (çerçeve) oluturabilirsiniz. kullanıcı, ad ve şifresini girdikten sonra bir düğmeye basar. ve bu düğme kullanıcı adı ve şifresinin doğru girilip girilmediğini denetler, girilen ad ve şifre doğruysa, frame widgetini, destroy() fonksiyonu ile yok edebilirsiniz.

Aşağıdaki kodları bir inceleyin isterseniz, sonra da kendi programınıza göre bir algoritma oluşturabilirsiniz.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import tkinter as tk


def create_entry_and_label(master, name):
    for i in range(len(name)):
        label = tk.Label(master, text=name[i])
        label.grid(row=i, column=0)
        entry = tk.Entry(master)
        entry.grid(row=i, column=1)
        yield label
        yield entry


def create_frame():
    global frame
    if frame is None:
        frame = tk.Frame(root)
        frame.pack()
        l1, e1, l2, e2 = create_entry_and_label(
            frame, ["Kullanıcı Adı", "Şifre"]
        )
        return frame, l1, e1, l2, e2


def command():
    global frame, l1, e1, l2, e2
    if frame is not None:        
        if e1.get() in kullanici_adi_sifre.keys() and \
            e2.get() in kullanici_adi_sifre.values():
            frame.destroy()
            frame = None
    else:
        frame, l1, e1, l2, e2 = create_frame()
        

root = tk.Tk()

frame = None

button = tk.Button(root, text="bas", command=command)
button.pack()

frame, l1, e1, l2, e2 = create_frame()
       
kullanici_adi_sifre = {
    "admin": "123456"
}
       
root.mainloop()

Bende bir soru sormak isterim. root isimli ana penceremde bulunan bir butona tıkladığımda yeni bir Toplevel penceresi açıyorum. root penceresinin hemen üzerinde oluşuyor. tekrar aynı butona bastığımda Toplevel penceresi bir tane daha oluşuyor. Bu durumu nasıl engelleyebilirim?
Yada en azından command ile gönderdiğim fonksiyon içerisinde root taki butonu nasıl disable edebilirim?

but1.bind('<Button-1>',but1.configure(state = DISABLED))

burada hata alıyorum

but1.bind(’’,lambda :but1.configure(state = DISABLED))
AttributeError: ‘NoneType’ object has no attribute ‘bind’

hatası veriyor

@Engin_Kanat
Her düğmeye tıklandığında yeni bir toplevel açılmasını önlemek için şöyle bir yöntem izleyebilirsiniz:

from tkinter import Tk, Toplevel, Button

root = Tk()

toplevel = None


def command():
    global toplevel
    if toplevel is None:
        toplevel = Toplevel()


button = Button(root, text="Button", command=command)
button.pack()

root.mainloop()
1 Beğeni

düğmelerde bind fonksiyonu kullanılmıyor. düğmelere fonksiyon atarken command ile yapıyoruz.
düğme disable olsun istiyorsanız dugme_ismi.config(state=‘disabled’) yazmanız yeterli.

1 Beğeni

@dildeolupbiten, toplevel = None me anlama geliyor? root tan bağımsız anlamına mı geliyor
Şimdi farkettim global için oldugunu

Şöyle anlatmaya çalışayım: toplevel'in ilk değeri None oluyor. Kullanıcı düğmeye basarsa, toplevel'in ilk değeri None olduğu için, yeni değeri Tk.Toplevel() olarak değişiyor. Kullanıcı bir daha düğmeye basarsa, koşul sağlanmadığı için bir daha toplevel oluşturulmuyor.

Ayrıca şöyle de yapılabilirdi:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from tkinter import Tk, Toplevel, Button

root = Tk()


def command():
    toplevel = Toplevel()
    button.configure(state="disable")


button = Button(root, text="Button", command=command)
button.pack()

root.mainloop()

Düğmelerde de bind fonksiyonu kullanılabilir. Ama gerek yok.

from tkinter import Tk, Toplevel, Button

root = Tk()


def command(event):
    toplevel = Toplevel()
    event.widget.configure(state="disable")


button = Button(root, text="Button")
button.pack()
button.bind("<Button-1>", command)

root.mainloop()
2 Beğeni

Mustafa Murat Coşkun isimli bir arkadaşın Udemy de python ve java kursları var. Önerirmisiniz?
(Keşke YazBel kursu olsa daha iyi olurdu.)

@dildeolupbiten hocam yukarıda yazdığınız koda benzer bir kod yazdım. işimi halledene kadar yenı sayfa yazılmasını engelledim ancak programı kapatmadan tekrar giriş yapmak istediğimde yeni pencere açılmadı. bunun ile ilgili bir çok deneme yaptığıma emin olabilirsiniz. Nesne tabanlı programlamayı öğrenmeye karar verdim. ilerleyen günlerde tekrar sizleri rahatsız edeceğimden emin olabilirsiniz. oğlum ise procesing öğrenmek istiyormuş izmir’de kurs arıyoruz şimdi

Udemy’den kurs almadım daha önce. Ama kurs almanın bir sakıncası yoktur bence, alabilirsiniz.

Kodları paylaşırsanız, belki bir çözüm yolu bulabiliriz.

Java kursunu bilmiyorum fakat Python kursunun yeni başlayanlar için oldukça faydalı olacağını düşünüyorum.