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