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()
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.
@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()
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.