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

Merhaba,

Tkinter kullanarak pencere içinde pencere oluşturmak istiyorum. Oluşturduğum pencere içerisinde yer aldığı pencerenin dışına çıkamayacak şekilde olmalı.

Bunun bir çözümü var mı? Ya da farklı fikir önerileriniz neledir?

gibi.

Pencere içinde pencere olur mu bilmiyorum, bana olmaz gibi geliyor. Tkinter ile ilgili bilgim yok fakat genel olarak pencere formu içinde bir panel oluşturman gerekir. Java’da böyle yapılıyor, genel mantık aynı. Panel ya da container gibi birşey varsa araştırmanda fayda var. Bilgisayar başına geçince ben de tkinterde bu durumu öğrenmek için bakarım inşallah.

Qt ile bir yapılabilir ama tkinter ile var mı bilmiyorum

1 Beğeni

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