Merhaba database’den kullanıcı sorgusu yaptıktan sonra anasayfaya geçmek istiyorum. Ancak bunu yaparken root yok olmadan birinci frame’i yok edip ikinci bir frame yaratmaya çalıştım ancak başarılı olamadım. Başka bir yolu var mı nasıl yapabilirim.
.destroy() ile yapabilirsiniz.
framein değişkeni + .destroy()
frame_1.destroy()
destroy
ile yapmam gerektiğini biliyorum aynı pencere üstünde ikinci frame’i nasıl yaratacağımı bi türlü çözemedim daha doğrusu birinci class
ta ki frame
'den kurtulup ikinci class
'ta ki frame
i çağıramadım.
Açıkcası frame
leri yok ederek ana pencereyi sabit tutmaktan daha mantıklı fikriniz varsa ona da açığım
bak bu konudaki yazdığım kodları incele anlarsın. koşul durum kontrolleri var. onları yapman lazım.
ya da şu kod a bak burada daha kısa hemen öğrenirsin
@Muallim #alıntı
import tkinter as tk
class Pencere:
def __init__(self, root):
self.root = root
self.root.geometry("600x600")
self.root.title("Çerçeve Örneği")
self.root.configure(bg="Orange")
self.etiketAna = Label(self.root, text="Ana Pencere", fg="Black", bg="White", justify=tk.LEFT)
self.etiketAna.pack(pady=10)
self.buton = Button(self.root, text="Onay", command=self.ac)
self.buton.pack(pady=50, side="left")
self.acikMi = False
def ac(self):
if (not self.acikMi): # Kapalıysa
self.cerceve = Frame(self.root, bg="Red", bd=4, relief=tk.RAISED)
self.cerceve.pack(pady=50)
self.etiketIc = Label(self.cerceve, text="İç Pencere", fg="Black", bg="White")
self.etiketIc.pack(pady=10, padx=150, side="top")
self.buton = Button(self.cerceve, text="X", command=self.kapa)
self.buton.pack()
self.acikMi = True # Çerçevenin açık olduğu kaydedildi
def kapa(self):
if(self.acikMi): # Eğer Açıksa
self.cerceve.destroy() # Kapat
self.acikMi = False # Çerçevenin kapalı olduğu kaydedildi
root = tk.Tk()
ornekle = Pencere(root)
root.mainloop()
teşekkür ederim yardımlarınız için peki
self.cerceve = Frame(self.root, bg="Red", bd=4, relief=tk.RAISED)
self.cerceve.pack(pady=50)
nesnesi farklı dosya da ve başka bir class
'ta ise nasıl self.root
üzerinde oluşturabilirim
Rica ederim. Hiç denemedim. Denemek lazım. Vardır bir yolu yöntemi illa ki.
Dün TkInter'da GUI'yi Ayrı Dosyaya Bölme başlığında bir örnek paylaşmıştım, kullanıcı login yaptıktan sonra toplevel
açılıyordu. Yapacağınız ufak değişiklikler ile toplevel
yerine login ekranının yok olmasını yerine yeni bir frame widgetinin gelmesini sağlayabilirsiniz.
Örnek:
Programın dosyalarının ağaç dizin yapısı şu şekilde:
.
├── run.py
└── Scripts
├── button.py
├── entry.py
├── frame.py
├── __init__.py
├── modules.py
└── utilities.py
Bunlar da dosyaların içinde yer alan kodlar:
Dosya: run.py
#!/usr/bin/python3.8
# -*- coding: utf-8 -*-
if __name__ == "__main__":
from Scripts import main
main()
Dosya: Scripts\modules.py
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter.messagebox import showwarning
Dosya: Scripts\__init__.py
# -*- coding: utf-8 -*-
from .modules import tk
from .button import Button
from .frame import LoginFrame
from .utilities import authenticate
def main():
root = tk.Tk()
login = LoginFrame(
master=root,
texts=["Username", "Password"],
max_chars=[20, 20]
)
apply_button = Button(
master=root,
text="\u2714",
color="green",
command=lambda: authenticate(*login.entries.values(), master=root)
)
root.mainloop()
Dosya: Scripts/button.py
# -*- coding: utf-8 -*-
from .modules import tk
class Button(tk.Button):
def __init__(self, color, *args, **kwargs):
super().__init__(*args, **kwargs)
self.configure(
activebackground=self["bg"],
activeforeground=color,
borderwidth=0,
highlightthickness=0,
font="Default 20",
fg=color
)
self.pack()
Dosya: Scripts\entry.py
# -*- coding: utf-8 -*-
from .modules import tk
class Entry(tk.Entry):
def __init__(self, max_char: int, *args, **kwargs):
super().__init__(*args, **kwargs)
self.bind(
sequence="<KeyRelease>",
func=lambda event: self.__apply_max_char(max_char=max_char)
)
self.configure(width=max_char)
if self._name == "password":
self.configure(show="*")
def __apply_max_char(self, max_char):
if len(self.get()) > max_char:
self.delete(max_char, "end")
Dosya: Scripts/frame.py
# -*- coding: utf-8 -*-
from .modules import tk
from .entry import Entry
class LoginFrame(tk.Frame):
def __init__(self, texts: list, max_chars: list, *args, **kwargs):
super().__init__(*args, **kwargs)
self.pack()
self.entries = self.__create_entries(
texts=texts,
max_chars=max_chars
)
def __create_entries(self, texts, max_chars):
entries = {}
for index, (text, max_char) in enumerate(zip(texts, max_chars)):
label = tk.Label(master=self, text=text)
label.grid(row=index, column=0, sticky="w")
entry = Entry(
master=self,
max_char=max_char,
name=text.lower()
)
entry.grid(row=index, column=1, sticky="w")
entries[text] = entry
return entries
class WelcomeFrame(tk.Frame):
def __init__(self, username: str, *args, **kwargs):
super().__init__(*args, **kwargs)
self.pack()
self.label = tk.Label(master=self, text=f"Welcome {username}")
self.label.pack()
Dosya: Scripts/utilities.py
# -*- coding: utf-8 -*-
from .modules import tk, showwarning
from .frame import WelcomeFrame
def get_entry_values(*entries):
return [ent.get() for ent in entries if isinstance(ent, tk.Entry)]
def has_authentication(*entries):
return get_entry_values(*entries) == ["Admin", "123456"]
def authenticate(*entries, master):
if has_authentication(*entries):
username = entries[0].get()
for child in master.winfo_children():
child.destroy()
WelcomeFrame(master=master, username=username)
else:
showwarning(
title="Warning",
message="Wrong username and password"
)
Mesela bakın burada __init__.py
dosyasında root
ile birlikte bir LoginFrame
ve bir Button
tanımlanıyor. Button
'un yapacağı işlem olan authenticate
ise utilities.py
dosyasında tanımlı. utilities.py
dosyasındaki authenticate
'e baktığımız zaman, bu fonksiyon LoginFrame
'e girilen kullanıcı adı ve şifresinin doğru olup olmamasına göre iki farklı işlem yapıyor. Şayet kullanıcı adı ve şifre doğruysa, LoginFrame
ve Button
yok ediliyor yerine WelcomeFrame
getiriliyor ya da ekrana bir uyarı penceresi getiriliyor.
Kodları bir inceleyin isterseniz.
çok teşekkür ederim ellerinize sağlık