Çoklu py dosyalarında oluşan AttributeError

Merhaba, çoklu dosyalarla çalışıyorum 2 adet py dosyası oluşturdum birbirlerine import ettim ama aşşagıdaki hatayı veriyor nedenini anlayamadım yardım ederseniz sevinirim.

image

Döngüsel bir import yapmaya çalıştığınız için hata alıyorsunuz.

test2.py'yi çalıştırdınız. İlk satırındaki koda göre test3 import edilmeye çalışıldı ve test2'nin devamında satırlara geçilemedi çünkü test3 import edildiği anda bu kez test3'deki ilk satırdan ötürü test2 import edilmeye çalışıldı. test2 import edilmeye çalışılınca bu sefer yine test2nin ilk satırı çalıştırıldı ve o satırda yine test3 import edildi.

Sonuç olarak böyle bir import etme yöntemi sonsuz bir döngü oluşturur ve bir türlü dosyalardaki diğer kodlara geçilmez. Böyle bir import etme yöntemi ister istemez hatalara yol açar.

nasıl yapmalıyım karşılıklı köprüleme yapmak istiyorum

Köprüleme nedir? Ne yapmak istiyorsunuz?

İki dosyanin da birbirini import etmesi gereken bir durum programlamada olamaz. Ne yapmak istediginizi yazin.

yapmak istedigim iki dosyanında birbirinden veri alabilmesi örnegin test2.py de bulunan deneme = 1’i test.py de kullanmak aynı zamanda test.py de bulunan deneme2 = 2 degişkenini test2.py de kullanabilmek

Peki bunun amaci ne? Programlamada neden buna ihtiyac duyuyorsun?

Demek istedigim nasil bir program yapmaya calisirken buna ihtiyac duydun?

Aşşagıdaki örnekte neden ihtiyaç duydugumu görebilirsiniz

Test2.py dosyasındaki kodlar:

from tkinter import*
import test3

if __name__ == '__main__':
    global app
    LeftPanel_BG = "#1a1c20"
    font =('arial',13,'bold')
    Color1 = "#131417"
    Color2 = "#c4c4c5"
    app = Tk()
    app.geometry("300x300+500+200")
    app.configure(bg=LeftPanel_BG)

    left_panel = Frame(app,bg=LeftPanel_BG,width=180,height=715)
    left_panel.pack(side=TOP, anchor=NW,fill=Y)
    left_panel.pack_propagate(0)

    btn = test3.sButton(left_panel,bg="#1a1c20",fg="#c4c4c5",border="0",text="Ana Sayfa",compound=LEFT,justify=LEFT,
    command= lambda:app.show_frame("Anasayfa"),padx=15,width=550,height=50)
    btn.place(x=82,y=200, anchor=CENTER)

Test3.py isimli dosyadaki kodlar

from tkinter import*
import test2


class sButton(Button):
    def __init__(self, master, **kw):
        Button.__init__(self,master=master,**kw)

        self.defaultBackground = self['bg']
        self["activeforeground"] = self['fg']
        self["activebackground"] = self.defaultBackground
        self['font'] = ('arial',13,'bold')
        print(test2.LeftPanel_BG)

        self.bind("<Enter>", self.on_enter)
        self.bind("<Leave>", self.on_leave)

    def on_enter(self, e):
        self['background'] = "#131417"

    def on_leave(self, e):
        self['background'] = self.defaultBackground

HATA

Neden bunu print ediyorsun? Baska bir yerde test2 modulunu kullanmamissin.

çünkü left_panel degişkeni test2.py dosyasının içerisinde başka türlü background colorunu nasıl alabilirm ki

test2 dosyasinde tabii ki. left panel’in tanimlandigi yerde.

Bak, test3 dosyasinda test2'yi import etmissin ama sadece print etmek icin kullanmissin.

nasıl yapabilirim varmı bir çözüm fikrin

Sorunu bilmiyorsun, ve cozum ariyorsun.

?

dediginden birşey anlamadım dostum test2.py dosyasındaki bir veriyi test3.py dosyasında print etmek istiyorum biliyorsan bi çözüm önerebilirsin

sbutton sınıfından örnek oluştururken değişkeni parametre olarak yazabilirsiniz. test2.py dosyasını çalıştırın.

Ayrıca bu aşağıdaki ifade hata üretir.

    command= lambda:app.show_frame("Anasayfa"),padx=15,width=550,height=50)

test2.py

import tkinter as tk
from test3 import sButton

LeftPanel_BG = "#1a1c20"
font = ('arial',13,'bold')
Color1 = "#131417"
Color2 = "#c4c4c5"
app = tk.Tk()
app.geometry("300x300+500+200")
app.configure(bg=LeftPanel_BG)

left_panel = tk.Frame(app,bg=LeftPanel_BG,width=180,height=715)
left_panel.pack(side="top", anchor="nw", fill="y")
left_panel.pack_propagate(0)

btn = sButton(
    master=left_panel,
    bg="#1a1c20",
    fg="#c4c4c5",
    border="0",
    text="Ana Sayfa",
    compound="left",
    justify="left",
    leftpanel_bg=LeftPanel_BG
)

btn.place(x=82,y=200, anchor="center")
app.mainloop()

test3.py

import tkinter as tk


class sButton(tk.Button):
    def __init__(self, master, leftpanel_bg, **kw):
        tk.Button.__init__(self, master=master, **kw)
        self.defaultBackground = self['bg']
        self["activeforeground"] = self['fg']
        self["activebackground"] = self.defaultBackground
        self['font'] = ('arial',13,'bold')
        
        self.bind("<Enter>", self.on_enter)
        self.bind("<Leave>", self.on_leave)
        print(leftpanel_bg)

    def on_enter(self, e):
        self['background'] = "#131417"

    def on_leave(self, e):
        self['background'] = self.defaultBackground
1 Beğeni

Cevabınız için teşekkür ederim test3.py içerisinde if master == “left_panel” yaptıgımda bu işlem neden geçerli olmuyor

örnegin print başarılı bölümü çalışmıyor

import tkinter as tk


class sButton(tk.Button):
    def __init__(self, master, leftpanel_bg, **kw):
        tk.Button.__init__(self, master=master, **kw)
        self.defaultBackground = self['bg']
        self["activeforeground"] = self['fg']
        self["activebackground"] = self.defaultBackground
        self['font'] = ('arial', 13, 'bold')

        self.bind("<Enter>", self.on_enter)
        self.bind("<Leave>", self.on_leave)
        if master == "left_panel":
            print("başarılı")

    def on_enter(self, e):
        self['background'] = "#131417"

    def on_leave(self, e):
        self['background'] = self.defaultBackground

if master == "left_panel" ifadesiyle siz master'in left_panel karakter dizisine eşit olup olmadığını sorguluyorsunuz. master parametresine verilecek olan değişkenin (identifier’ın) ismi left_panel sadece. Yani siz şöyle bir şey yapmaya çalışıyorsunuz.

import tkinter as tk

degisken = tk.Frame()
degisken.pack()


def f(parametre):
    if parametre == "degisken":
        print("başarılı")


f(parametre=degisken)

Dolayısıyla bu da size bir çıktı vermiyor.

master parametresiyle neden bir sorgu yapmak istediğinizi belirtirseniz belki daha rahat yardımcı olabiliriz.

1 Beğeni

Örnegin

btn = sButton(
    master=left_panel,
    bg="#1a1c20",
    fg="#c4c4c5",
    border="0",
    text="Ana Sayfa",
    compound="left",
    justify="left",
    leftpanel_bg=LeftPanel_BG

bu bölüm ile hiç ugraşmayıp direkt master bölümünden tespit edip classın oldugu bölümde ayarlamaları yapmak istiyorum if master == “x” şeklinde

import tkinter as tk


class sButton(tk.Button):
    def __init__(self, master, leftpanel_bg, **kw):
        tk.Button.__init__(self, master=master, **kw)
        if master.__contains__('left_panel'):
            self.defaultBackground = "red"
            self["activeforeground"] = "green"
            self["activebackground"] = self.defaultBackground
            self['font'] = ('arial', 13, 'bold')
        if master.__contains__('right_panel'):
            self.defaultBackground = "blue"
            self["activeforeground"] = "black"
            self["activebackground"] = self.defaultBackground
            self['font'] = ('arial', 13, 'bold')
            self.bind("<Enter>", self.on_enter)
            self.bind("<Leave>", self.on_leave)




    def on_enter(self, e):
        self['background'] = "#131417"

    def on_leave(self, e):
        self['background'] = self.defaultBackground

Bu kullanımı nereden gördünüz bilmiyorum ama şöyle kullanmanız daha doğru olur:

if 'left_panel' in master:

aşşagıdaki hatayı veriyor str(master) şeklinde yaptıgımda ise hata vermiyor ama print bölümü çalışmıyor

Traceback (most recent call last):
  File "C:/Users/user/Desktop/Python/asd.py", line 16, in <module>
    btn = sButton(
  File "C:\Users\user\Desktop\Python\dvs.py", line 11, in __init__
    if 'left_panel' in master:
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 1643, in cget
    return self.tk.call(self._w, 'cget', '-' + key)
TypeError: can only concatenate str (not "int") to str