Tkinter switch frame

Merhaba,

Uygulamada iki adet frame var. Soldakinde bulunan düğmeye basınca sağdaki frame i değiştirmek istiyorum. Nasıl yapabilirim?

import tkinter as tk
from tkinter import ttk

class PyTkStringer(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self.callAllFrames()

    def callAllFrames(self):
        self. leftFrame()
        self.rightFrame11()

    def leftFrame(self):
        self.leftFrame = tk.Frame(self)
        self.leftFrame.pack(side="left")
        self.btn1 = ttk.Button(self.leftFrame, text="Call Other Frame", command=self.callFrame)
        self.btn1.grid(row=0, column=0)


    def rightFrame11(self):
        self.rightFrame1 = tk.Frame(self)
        self.rightFrame1.pack(side="right")
        self.lbl1 = ttk.Label(self.rightFrame1, text="I am the right Frame 11111")
        self.lbl1.grid(row=0, column=0)

    def rightFrame22(self):
        self.rightFrame2 = tk.Frame(self)
        self.rightFrame2.pack(side="right")
        self.lbl1 = ttk.Label(self.rightFrame2, text="I am the right Frame 22222")
        self.lbl1.grid(row=0, column=0)

    def callFrame(self):
        pass

def main():
    app = PyTkStringer()
    app.mainloop()

if __name__ == "__main__":
    main()

Merhaba.

Sağ frame’deki neyi değiştirmek istiyorsunuz? Aslında callFrame metodunda sınıfın örneğini temsil eden self değişkeni tanımlı. Bu değişkeni kullanarak tüm pencere araçlarına ulaşıp bunları değiştirebilirsiniz. Ayrıca Tkinter’da bir tuşa tıklandığında, bir event argümanı da çağrılan metoda geçirilir; bazı durumlarda bu nesne de kullanışlı olabilir.

İyi çalışmalar.

Örnek olarak, sağ frame de uygulama ilk çalıştığında rightFrame11 çağrılıyor. Sol frame deki düğme ile rightFrame22 frame’ini çağrıp sağ frame’in içeriğini değiştirmek istiyorum.

Sanırım sağ frame’deki içerikten kastınız frame’in içindeki pencere araçları. Eğer durum buysa doğrudan pencere araçlarını çağırabilirsiniz. Örneğin; gördüğüm kadarı ile lbl1 pencere aracı bu frame’in içinde. Bu pencere aracını self.lbl1 diye çağırarak istediğiniz değişikliği yapabilirsiniz.

Tabii frame’den de pencere araçlarına ulaşmak mümkün ama şu durumda bunun gereksiz olduğunu düşünüyorum.

İyi çalışmalar.

Şöyle bir çözüm buldum:

Öncelikle uygulama ilk çalıştığında bütün frame’lerin çağrılmış olması gerek. Sonradan çağrıcılacak frame’in pack’lememek gerekiyor

import tkinter as tk
from tkinter import ttk

class PyTkStringer(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self.callAllFrames()

    def callAllFrames(self):
        self. leftFrame()
        self.rightFrame11()
        self.rightFrame22()

    def leftFrame(self):
        self.leftFrame = tk.Frame(self)
        self.leftFrame.pack(side="left")
        self.btn1 = ttk.Button(self.leftFrame, text="Call Other Frame",
                               command=lambda:self.callFrame(self.rightFrame1, self.rightFrame2))
        self.btn1.grid(row=0, column=0)

    def rightFrame11(self):
        self.rightFrame1 = tk.Frame(self)
        self.rightFrame1.pack(side="right")
        self.lbl1 = ttk.Label(self.rightFrame1, text="I am the right Frame 11111")
        self.lbl1.grid(row=0, column=0)

    def rightFrame22(self):
        self.rightFrame2 = tk.Frame(self)
        self.lbl1 = ttk.Label(self.rightFrame2, text="I am the right Frame 22222")
        self.lbl1.grid(row=0, column=0)

    def callFrame(self, forgetFrame, raiseFrame):
        forgetFrame.pack_forget()
        raiseFrame.pack(side="right")

def main():
    app = PyTkStringer()
    app.mainloop()

if __name__ == "__main__":
    main().