Kullanıcı girişinden ana pencereyi yok etmeden yeni sayfa oluşturmak

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 framei çağıramadım.

Açıkcası frameleri 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

1 Beğeni

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.

3 Beğeni

çok teşekkür ederim ellerinize sağlık