Tkinter dıştaki bir değişkene Entry ile değer atama

Merhaba arkadaşlar.Bugün yine çok basit iki sorunla karşılaştım ama çözemedim :frowning:
Program kullanıcı adı ve şifresi olmayan birisini kaydolması için pencere açıyor ve bu penceredeki kullanıcı adını ve şifresini baştaki kullanıcı adı ve şifreye eşitliyor
1.defkullanıcı ve defşifre değişkenleriniz fonksiyon dışına nasıl atacağım
2.ikinci pencerede olan ‘iptal’ butonuna basarak sadece o pencereden nasıl çıkacağım
şimdiden yardımınız için teşekkür ederim

import tkinter as tk

def Kontrol():
    selam1["text"] = boşluk1.get()
    selam2["text"] = boşluk2.get()
    defkullanıcı = "wormer"
    defşifre = "Python"

    if (defkullanıcı==selam1["text"] and defşifre == selam2["text"]):
        print("kabul edildi")

    elif (defkullanıcı != selam1["text"] and defşifre == selam2["text"]):
        print("kullanıcı adınız yanlış")

    elif (defkullanıcı == selam1["text"] and defşifre != selam2["text"]):
        print("şifre yanlış")
    else:
        def kullanıcı():
            defkullanıcı =kayıt1.get()
            defşifre = kayıt2.get()
            return (defkullanıcı ,defşifre)
        yeni = tk.Tk()
        yeni.geometry("250x250")
        yeni.title("Kayıt OL")

        kayıt1 = tk.Entry(yeni,font="Verdana 14",fg="RED")
        kayıt1.place(x=20,y=20)

        kayıt2 = tk.Entry(yeni,font="Verdana 14",fg="RED")
        kayıt2.place(x=20,y=60)

        self1 = tk.Button(yeni,text="TAMAM",fg="GREEN",font="Verdana 14",command=kullanıcı)
        self1.place(x=20,y=130)

        self2 = tk.Button(yeni,text="İptal",fg="RED",font="Verdana 14",command=exit)
        self2.place(x=20,y=180)
        print(defkullanıcı)
        print(defşifre)


pencere = tk.Tk()
pencere.geometry("350x350")
pencere.title("Sesli asistan Örneği")

boşluk1 = tk.Entry(font="Verdana 14",fg="BLUE")
boşluk1.place(x=20,y=20)

boşluk2 = tk.Entry(font="Verdana 14",fg="BLUE")
boşluk2.place(x=20,y=60)

Buton1 = tk.Button(text="Devam et",fg="GREEN",font="Verdana 14",command=Kontrol)
Buton1.place(x=20,y=130)

Buton2 = tk.Button(text="İptal Et",font="Verdana 14",fg="RED",command=exit)
Buton2.place(x=20,y=180)

selam1 = tk.Label(text="Kullanıcı adın buraya yazılır",font="Verdana 14",fg="ORANGE")
selam1.place(x=20,y=230)

selam2 = tk.Label(text="Şifre buraya yazılır",font="Verdana 14",fg="ORANGE")
selam2.place(x=20,y=270)


pencere.mainloop()

global deyimini kullanabilirsiniz.

Pencereleri destroy metodu ile kapatıyoruz, command için yeni.destroy yazabilirsiniz.

1 Beğeni
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "D:\PyCharm Community Edition 2020.1\plugins\python-ce\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "D:\PyCharm Community Edition 2020.1\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/tuncaypc/PycharmProjects/Python3.8/Naber.py", line 21
    global defkullanıcı
    ^
SyntaxError: name 'defkullanıcı' is assigned to before global declaration

şu şekilde hata aldım

        def kullanıcı():
            defkullanıcı =kayıt1.get()
            defşifre = kayıt2.get()
            global defkullanıcı
            global defşifre

şuda kod

global deyimlerini en başa yazıyoruz (değişkeni kullanmadan önce yazmak yeterli ama normalde en başa yazılır), kullanımı ile birkaç örnek görmek için buraya bakabilirsiniz:
https://python-istihza.yazbel.com/fonksiyonlar.html#fonksiyonlarin-kapsami-ve-global-deyimi

else:
        def kullanıcı():
            global defkullanıcı
            global defşifre

            defkullanıcı =kayıt1.get()
            defşifre = kayıt2.get()
            return defkullanıcı
            return defşifre 

şeklinde yaptığımda fonksiyon dışına atıyor ama ben if in üstünde olan şu değere eşitlemek istiyorum

Hatanız şurada. Her Devam Et tuşuna bastığınızda, defkullanıcı wormer'a ve defşifre de Python'a eşitlenecek. Bu yüzden onu global alana alın. Ayrıca kullanıcı fonksiyonunu else bloku altında tutmayın. Her defasında fonksiyonu tekrar tekrar oluşturuyorsunuz.

Kodlarınızı da aşağıdaki gibi değiştirdim. Bir bakın bakalım.

import tkinter as tk

defkullanıcı = "wormer"
defşifre = "Python"


def kullanıcı(yeni, kayıt1, kayıt2):
    global defkullanıcı, defşifre
    defkullanıcı = kayıt1.get()
    defşifre = kayıt2.get()
    yeni.destroy()        


def Kontrol():
    selam1["text"] = boşluk1.get()
    selam2["text"] = boşluk2.get()
    if (defkullanıcı==selam1["text"] and defşifre == selam2["text"]):
        print("kabul edildi")

    elif (defkullanıcı != selam1["text"] and defşifre == selam2["text"]):
        print("kullanıcı adınız yanlış")

    elif (defkullanıcı == selam1["text"] and defşifre != selam2["text"]):
        print("şifre yanlış")
    else:
        yeni = tk.Tk()
        yeni.geometry("250x250")
        yeni.title("Kayıt OL")

        kayıt1 = tk.Entry(yeni,font="Verdana 14",fg="RED")
        kayıt1.place(x=20,y=20)

        kayıt2 = tk.Entry(yeni,font="Verdana 14",fg="RED")
        kayıt2.place(x=20,y=60)

        self1 = tk.Button(
            yeni,
            text="TAMAM",
            fg="GREEN",
            font="Verdana 14",
            command=lambda: kullanıcı(yeni, kayıt1, kayıt2)
        )
        self1.place(x=20,y=130)

        self2 = tk.Button(
            yeni,
            text="İptal",
            fg="RED",
            font="Verdana 14",
            command=yeni.destroy
        )
        self2.place(x=20,y=180)
        print(defkullanıcı)
        print(defşifre)

pencere = tk.Tk()
pencere.geometry("350x350")
pencere.title("Sesli asistan Örneği")

boşluk1 = tk.Entry(font="Verdana 14",fg="BLUE")
boşluk1.place(x=20,y=20)

boşluk2 = tk.Entry(font="Verdana 14",fg="BLUE")
boşluk2.place(x=20,y=60)

Buton1 = tk.Button(
    text="Devam et",
    fg="GREEN",
    font="Verdana 14",
    command=Kontrol
)
Buton1.place(x=20,y=130)

Buton2 = tk.Button(
    text="İptal Et",
    font="Verdana 14",
    fg="RED",
    command=exit
)
Buton2.place(x=20,y=180)

selam1 = tk.Label(
    text="Kullanıcı adın buraya yazılır",
    font="Verdana 14",
    fg="ORANGE"
)
selam1.place(x=20,y=230)

selam2 = tk.Label(
    text="Şifre buraya yazılır",
    font="Verdana 14",
    fg="ORANGE"
)
selam2.place(x=20,y=270)

pencere.mainloop()
1 Beğeni