tkinterde frame diye bir şey var onun sayesinde bu istediğinizi yapabilirsiniz
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…
Aşağıdaki linkte ilgili kütüphane var… İçeriği işini çözecek sanırım.
teşekkür ederim cevabınız ve kaynak tavsiyeniz için. İnceliyorum.
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:
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()
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.
Ş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.
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.