Başka bir metod içindeki değişkene erişim

Merhaba,

Python ve tkinter ile ilgileniyorum bu aralar. Şöyle bir sorunla karşılaştım: Bir png dosyasını değişkene atadım. Bu değişkeni aynı metod içerisinde kullanabiliyorum. Aynı dosyaya başka bir metod içinde de ihtiyacım var. Buna nasıl erişebilirim?

def menu(self):
    self.open_file_icon = tk.PhotoImage(file='icons/open_file.gif')

    menu_bar = tk.Menu(self)
    file_menu = tk.Menu(menu_bar, tearoff=0)
    file_menu.add_command(label='Open', accelerator='Ctrl+O', compound='left',
                          image=self.open_file_icon, underline=0)
    menu_bar.add_cascade(label='File', menu=file_menu)
    self.config(menu=menu_bar)

def shortcutToolbar(self):
    shortcutFrame = tk.Frame(self)
    ttk.Button(shortcutFrame, text="Open", image=???).grid(row=0, column=0)

Merhaba,

İki metod aynı sınıfa aitse, ilgili değişkeni, diğer metotlarda kullanabilirsiniz.

def shortcutToolbar(self):
    shortcutFrame = tk.Frame(self)
    ttk.Button(shortcutFrame, text="Open", image=self.open_file_icon).grid(row=0, column=0)
1 Beğeni

Evet. Aynı sınıfa dahil. Ancak şöyle bir uyarı alıyorum:

AttributeError: '_tkinter.tkapp' object has no attribute 'open_file_icon'

Kodun tamamı şu şekilde:

import tkinter as tk
from tkinter import ttk

PROGRAM_NAME = "Tkinter String Creator for Python"

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

        self.title(PROGRAM_NAME)
        self.geometry("800x700")
        self.allFrames()

    def allFrames(self):
        self.shorcutToolbar()
        self.menu()


    def menu(self):
        self.open_file_icon = tk.PhotoImage(file='icons/open_file.gif')


        menu_bar = tk.Menu(self)
        file_menu = tk.Menu(menu_bar, tearoff=0)
        file_menu.add_command(label='Open', accelerator='Ctrl+O', compound='left',
                              image=self.open_file_icon, underline=0)
        menu_bar.add_cascade(label='File', menu=file_menu)

        self.config(menu=menu_bar)


    def shorcutToolbar(self):
        frame = tk.Frame(self)
        frame.configure(height=40, background="dark grey")
        ttk.Button(frame, text="Open", image=self.open_file_icon, compound="left").grid(row=0, column=0)
        frame.pack(side="top", fill="x")


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

if __name__ == "__main__":
    main()

Tekrar merhaba, lütfen bir de aşağıdaki kodları çalıştırmayı deneyin:

import tkinter as tk
from tkinter import ttk

PROGRAM_NAME = "Tkinter String Creator for Python"


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

        self.title(PROGRAM_NAME)
        self.geometry("800x700")

        self.menu()
        self.shorcutToolbar()



    def menu(self):
        self.open_file_icon = tk.PhotoImage(file='icons/open_file.gif')

        menu_bar = tk.Menu(self)
        file_menu = tk.Menu(menu_bar, tearoff=0)
        file_menu.add_command(label='Open', accelerator='Ctrl+O', compound='left',
                              image=self.open_file_icon, underline=0)
        menu_bar.add_cascade(label='File', menu=file_menu)

        self.config(menu=menu_bar)


    def shorcutToolbar(self):
        frame = tk.Frame(self)
        frame.configure(height=40, background="dark grey")
        ttk.Button(frame, text="Open", image=self.open_file_icon, compound="left").grid(row=0, column=0)
        frame.pack(side="top", fill="x")


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

if __name__ == "__main__":
    main()
1 Beğeni

Çok teşekkür ederim. Kod çalışıyor. Sıkıntı yok. Ancak sıkıntının nerede olduğunu anlayamadım? :frowning:

allframes() isimli metodu sildim, o metod içindeki diğer metodları çağırma sırası hata oluşturuyordu (aslında silinmesine gerek yoktu, sadece metodları çağırırken, çağırma sırası değiştirilse kodlar yine çalışırdı ancak allframes() isimli bir metoda da ihtiyacınız yok, o yüzden bu metodu sildim. __init__ metodu içinde diğer metodları çağırdım.).

Sorun oluşturan kısım, metodları çağırırken, önce shortcutToolbar()'ı çağırmanız sonradan da menu() metodunu çağırmanızdan kaynaklanıyordu. Sorun vermemesi için önce menu() metodunu sonra da shortcutToolbar() metodunu çağırmanız gerekir. Çünkü shortcutToolbar() metodundaki self.open_file_icon değişkeni menu() metodu içinde tanımlanmış.

self ile ilgili herhangi bir değişken tanımlaması yapmak istediğinizde bunu __init__ metodu içinde yapabilirsiniz. Fazladan bir metod tanımlamanıza gerek yok. Eğer bu değişkenlerle işlem yapmak istiyorsanız, bu işlemler için metodlar tanımlayabilirsiniz.

1 Beğeni

Çok teşekkür ederim.

Rica ederim, iyi günler dilerim.

Merhaba,

Benzer bir soru olduğu için aynı konu altından sormak istedim. Farklı bir script dosyasından ana penceredeki texte yazı eklemek istiyorum. Buradaki textin metotlarına nasıl erişebilirim? Örneğin ikinci_pencere ile aldığım verileri anaPenceredeki texte eklemeye çalışıyorum.

#anaPencere.py
import tkinter as tk
import ikinci_pencere

class PyTkStringer(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.geometry("400x400")
        self.allFrames()

    def allFrames(self):
        self.textFrame()

    def textFrame(self):
        tk.Button(self, text='Add', command=ikinci_pencere.framePropScr).pack(side='bottom')
        content_text = tk.Text(wrap='word', undo=1)
        content_text.pack(expand='yes', fill='both')

        scroll_bar = tk.Scrollbar(content_text)
        content_text.configure(yscrollcommand=scroll_bar.set)
        scroll_bar.config(command=content_text.yview)
        scroll_bar.pack(side='right', fill='y')

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

if __name__ == "__main__":
    main()


#ikinci_pencere.py
from tkinter import *

class framePropScr(Toplevel):
    def __init__(self):
        super().__init__()

        Label(self, text='Name:').grid(row=1, column=0, padx=2, pady=2, sticky='e')
        nameEntry = StringVar()
        Entry(self, textvariable=nameEntry).grid(row=1, column=1, padx=2, pady=2)
        Label(self, text='Master:').grid(row=2, column=0, padx=2, pady=2, sticky='e')
        selfEntry = StringVar()
        Entry(self, textvariable=selfEntry).grid(row=2, column=1, padx=2, pady=2)
        Button(self, text='Add').grid(row=15, column=0)
        Button(self, text='Cancel').grid(row=15, column=1)

        self.title('Frame Configuration')

Merhaba, aşağıdaki kodları bir inceleyin. Bir de Toplevel sınıfından bir widget oluşturmak için yeni bir betik dosyası oluşturmanız gerekmiyor. Hepsini aynı sınıfın içinde de tanımlayabilirsiniz:

import tkinter as tk


class PyTkStringer(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.geometry("400x400")
        self.textFrame()

    def textFrame(self):
        tk.Button(self, text='Add', command=self.topLevel).pack(side='bottom')
        self.content_text = tk.Text(wrap='word', undo=1)
        self.content_text.pack(expand='yes', fill='both')
        scroll_bar = tk.Scrollbar(self.content_text)
        self.content_text.configure(yscrollcommand=scroll_bar.set)
        scroll_bar.config(command=self.content_text.yview)
        scroll_bar.pack(side='right', fill='y')

    def topLevel(self):
        self.toplevel = tk.Toplevel(master=None)
        self.label1 = tk.Label(self.toplevel, text='Name:')
        self.label1.grid(row=1, column=0, padx=2, pady=2, sticky='e')
        self.nameentry = tk.StringVar()
        self.entry1 = tk.Entry(self.toplevel, textvariable=self.nameentry)
        self.entry1.grid(row=1, column=1, padx=2, pady=2)
        self.label2 = tk.Label(self.toplevel, text='Master:').grid(row=2, column=0, padx=2, pady=2, sticky='e')
        self.selfentry = tk.StringVar()
        self.entry2 = tk.Entry(self.toplevel, textvariable=self.selfentry)
        self.entry2.grid(row=2, column=1, padx=2, pady=2)
        self.button1 = tk.Button(self.toplevel, text='Add', command=self.button_commands).grid(row=15, column=0)
        self.button2 = tk.Button(self.toplevel, text='Cancel').grid(row=15, column=1)

        self.toplevel.title('Frame Configuration')

    def button_commands(self):
        self.content_text.insert("insert", self.entry1.get())
        self.content_text.insert("insert", "\n")
        self.content_text.insert("insert", self.entry2.get())



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


if __name__ == "__main__":
    main()

Aslında yazdığım kodlar uzadıkça arasında kaybolmamak için ayrı betikler oluşturmayı düşünüyordum. Ancak bu da işimi görür. Teşekkür ederim.