Python - Tkinter'da Pencere İçinde Pencere Yapılabilir Mi?

tkinterde frame diye bir şey var onun sayesinde bu istediğinizi yapabilirsiniz

kullanımı için kaynak :
python tkinter frame kullanımı - Google’da Ara

Frame işinizi görür.

Aslında düşündüğüm şey farklı pencerelere ihtiyaç duyulan durumlarda açılacak her pencere tek bir ana pencere içerisinde açılsın. Öbür türlü bir sürü pencere olmaya başlıyor.

frame tam işime yarayacak olan şey mi bilmiyorum. eğitim sürecinde biraz öğrenmiştim. Sınırlarını zorlayalım bakalım aklımdan geçenleri gerçekleştirebilecek mi? Göreceğiz.

Yani, SQLite Studio veya Excel’deki gibi bir “pencere içinde pencere” 'den mi bahdediyorsunuz?

yoo aslında frameyi işiniz bittikten sonra kapatabilirsiniz. mainloop() fonksiyonu ile

evet, ifade etmeye çalıştığımın bir örneği bu

Şöyle bir şey buldum, ama deneme fırsatım olmadığı için işinize yarar mı bilmiyorum?

import Tkinter as tk

base=tk.Tk()  #this is the main frame
root=tk.Frame(base)  #Really this is not necessary -- the other widgets could be attached to "base", but I've added it to demonstrate putting a frame in a frame.
root.grid(row=0,column=0)
scoreboard=tk.Frame(root)
scoreboard.grid(row=0,column=0,columnspan=2)

###
#Code to add stuff to scoreboard ...
# e.g. 
###
scorestuff=tk.Label(scoreboard,text="Here is the scoreboard")
scorestuff.grid(row=0,column=0)
#End scoreboard

#Start cards.
cards=tk.Frame(root)
cards.grid(row=1,column=0)
###
# Code to add pitcher and batter cards
###
clabel=tk.Label(cards,text="Stuff to add cards here")
clabel.grid(row=0,column=0)
#end cards

#Offense/Defense frames....
offense=tk.Frame(root)
offense.grid(row=1,column=1)
offense.isgridded=True #Dynamically add "isgridded" attribute.
offense_label=tk.Label(offense,text="Offense is coolest")
offense_label.grid(row=0,column=0)

defense=tk.Frame(root)
defense.isgridded=False
defense_label=tk.Label(defense,text="Defense is coolest")
defense_label.grid(row=0,column=0)

def switchOffenseDefense():
    print "Called"
    if(offense.isgridded):
        offense.isgridded=False
        offense.grid_forget()
        defense.isgridded=True
        defense.grid(row=1,column=1)
     else:
        defense.isgridded=False
        defense.grid_forget()
        offense.isgridded=True
        offense.grid(row=1,column=1)


switch_button=tk.Button(root,text="Switch",command=switchOffenseDefense)
switch_button.grid(row=2,column=1)

root.mainloop()

Kaynak: https://stackoverflow.com/questions/9844171/how-can-i-put-frames-inside-frames-using-tkinter

Windows yapısında SDI, MDI yapısı vardır. Bahsettiğiniz MDI yapısı. Arka kısma container (taşıyıcı) adı verilir. İç kısımda oluşan pencere ile uygulamanın child’larıdır. Excel, Word, Photoshop en bilinen örnekleridir. Sanırım Tkinter ve MDI kelimesini birlikte aratırsanız yeterli dökümantasyona erişebilirsiniz…

1 Beğeni

Aşağıdaki linkte ilgili kütüphane var… İçeriği işini çözecek sanırım.

değişik bir mevzu oldu. switch butonuna basınca Defense is coolest yazısı değişiyor.

teşekkür ederim cevabınız ve kaynak tavsiyeniz için. İnceliyorum.

1 Beğeni

Hmm… bilemiyorum, verdiğim linkte(kaynak) bir kod daha vardı, o muydu acaba?

Biraz uğraştım, istediğiniz bunun gibi bir şey olabilr.

from tkinter import *
 
root = Tk()  
root.geometry("600x400")
root.title("Çerçeve Örneği")
root.configure(bg="Orange")

# Bu etiket ana pencere (root) içerisinde
etiketAna = Label(root, text="Ana Pencere", fg="Black", bg="White", justify=LEFT)

# Çerçeve ana pencere (root) içerisinde. 
# relief=RAISED (kabartmalı görünüm) Bu kısmı silebilirsin, ön tanımlı değeri FLAT (düz gösterim)
cerceve = Frame(root, bg="Red", bd=4, relief=RAISED)

# Alt başlık etiketi ile diğer etiket ve buton ise çerçeve içerisinde
etiketIc = Label(cerceve, text="İç Pencere", fg="Black", bg="White")
etiket = Label(cerceve, text="Onaylıyor musunuz?", fg="White", bg="Red")
buton = Button(cerceve, text="Onay", command=tikla)

"""
YERLEŞİM DÜZENİ (x, y ekseninde birbirlerine göre olan uzaklıkları, sıralama)
Düzeni sağlarken pencere içerisindekileri yukarıdan aşağıya, soldan sağa doğru
sırasıyla .pack() methodu ile yazman gerekiyor anladığım kadarıyla
"""
etiketAna.pack(pady=10)
cerceve.pack(pady=50)
etiketIc.pack(pady=10, padx=150, side=TOP)
etiket.pack(pady=50, padx=50, side=LEFT)
buton.pack(pady=50, side=LEFT)

def tikla():
    print("Onayladı")
    
root.mainloop()

Faydalandığım Kaynaklar:

https://www.tutorialspoint.com/python3/tk_frame.htm#:~:text=The%20Frame%20widget%20is%20very,the%20position%20of%20other%20widgets.

Ayrıca yerleşim ile ilgili özelliklere bakmak da işinize yarayabilir

Teşekkür ederim, örneğiniz için.

Sizin yazdığınız bu kodu aldım şu şekilde oluşturdum;

from tkinter import *
 
root = Tk()  
root.geometry("600x400")
root.title("Çerçeve Örneği")
root.configure(bg="Orange")

def tikla():
    cerceve = Frame(root, bg="Red", bd=4, relief=RAISED)
    cerceve.pack(pady=50)
    etiketIc = Label(cerceve, text="İç Pencere", fg="Black", bg="White")
    etiketIc.pack(pady=10, padx=150, side=TOP)
    buton = Button(cerceve, text="X", command=cerceve.destroy)
    buton.pack()
    
# Bu etiket ana pencere (root) içerisinde
etiketAna = Label(root, text="Ana Pencere", fg="Black", bg="White", justify=LEFT)
etiketAna.pack(pady=10)

# Çerçeve ana pencere (root) içerisinde. 
# relief=RAISED (kabartmalı görünüm) Bu kısmı silebilirsin, ön tanımlı değeri FLAT (düz gösterim)


# Alt başlık etiketi ile diğer etiket ve buton ise çerçeve içerisinde

buton = Button(root, text="Onay", command=tikla)

# Yerleşim düzeni: x, y ekseninde birbirlerine göre olan uzaklıkları

buton.pack(pady=50, side=LEFT)

    
root.mainloop()

Şimdi bunu çalıştırdığınız zaman onay a basınca çerçeve oluşturuluyor. çerçevenin içinde de X butonuna basılınca çerçeve kapanıyor. Mevzu güzel.

Bu mevzu da bir koşul kurmalıyım çünkü kullanıcı onay butonuna defalarca basarak çok sayıda aynı çerçeveyi oluşturabilir. Bunu engellemek için bir şeyler düşünüyorum. Tavsiyeniz olur mu?

from tkinter import *
 
root = Tk()  
root.geometry("600x400")
root.title("Çerçeve Örneği")
root.configure(bg="Orange")
sayi = 0

def tikla():
    global sayi
    if(sayi<1):
        cerceve = Frame(root, bg="Red", bd=4, relief=RAISED)
        cerceve.pack(pady=50)
        etiketIc = Label(cerceve, text="İç Pencere", fg="Black", bg="White")
        etiketIc.pack(pady=10, padx=150, side=TOP)
        buton = Button(cerceve, text="X", command=cerceve.destroy)
        buton.pack()
    sayi += 1
    
# Bu etiket ana pencere (root) içerisinde
etiketAna = Label(root, text="Ana Pencere", fg="Black", bg="White", justify=LEFT)
etiketAna.pack(pady=10)

# Çerçeve ana pencere (root) içerisinde. 
# relief=RAISED (kabartmalı görünüm) Bu kısmı silebilirsin, ön tanımlı değeri FLAT (düz gösterim)


# Alt başlık etiketi ile diğer etiket ve buton ise çerçeve içerisinde

buton = Button(root, text="Onay", command=tikla)

# Yerleşim düzeni: x, y ekseninde birbirlerine göre olan uzaklıkları

buton.pack(pady=50, side=LEFT)

    
root.mainloop()
2 Beğeni

canavar gibi çalışıyor. Ellerine sağlık. Teşekkür ederim. Şimdi bunu başkalaştırıp sınırlarını zorlamanın zamanıdır.

1 Beğeni

Şu daha sağlıklı çalışıyor kardeş

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

Ayrıca aşağıdaki şu örneği de incelemeni tavsiye ederim. Sayfanın altında tüm kodlar paylaşılmış. Örnekte Ctrl+L tuş kombinasyonu ile çerçeveyi açıp kapattırıyor. Sen de böyle bir özellik ekleyebilirsin.

2 Beğeni

Teşekkür ederim. Ben zaten kodu aldıktan sonra nesne tabanlı hale getirdim. Nesne tabanlı programlama nedende daha çok hoşuma gidiyor artık.

1 Beğeni