سید علی ابطحی

تابع ()get در Tkinter کار نمی‌ کند

سید علی ابطحی ۱۳۹۸/۰۱/۰۳ زبان برنامه‌نویسی پایتون

با سلام

from tkinter import *
window = Tk()
entry1 = Entry(window)
entry1.pack()
a= entry1.get()
def login():
 if a == "ali": print("Welcome ali")
 else: print("Ok")
button1 = Button(window,text="Login",command=login)
button1.pack()
button2 = Button(window,text="Exit",command=window.destroy)
button2.pack()
mainloop()

با توجه به کد های بالا پس از وارد کردن عبارت ali و فشردن دکمه لاگین، باید Welcome ali پرینت شود اما این اتفاق نمی افتد و همیشه عبارت Ok را پرینت می کند. لطفا راهنمایی کنید.

پاسخ‌ها به این تاپیک
سهراب عسکرزاده
سهراب عسکرزاده برنامه نویس وب و ویندوز
۱۳۹۸/۰۱/۱۷

سلام،
من در مورد برنامه نویسی پایتون اطلاعات چندانی ندارم فقط کدتون رو توی یک IDE آنلاین اجرا کردم و مقادیر a رو یه بررسی کوچیک کردم در حالات مختلف. چیزی که مشخصه a وقتی تابع شما اجرا میشه مقدارش خالیه، یعنی زود دارین a رو میخونید از صفحه ، یعنی احتمالا موقع لود صفحه(یا یه وقت غیر مناسبه دیگه) داره a رو پر میکنه، خود دریافتی رو مستقیم گذاشتم توی متد و آنلاین خروجی گرفتم درست جواب داد برای ali خروجی Welcome Ali داده شد. زمانی که شما روی دکمه کلیک میکنید a رو از TextBox پر نمیکنه بلکه قبلا پر شده و مقدارش null هست.

کد اصلاح شده:

from tkinter import *
window = Tk()
entry1 = Entry(window)
entry1.pack()

#a= entry1.get();

def login():
#a is null when this func starts
 if entry1.get() == "ali": print("Welcome ali")
 
 else: print("ok")
button1 = Button(window,text="Login",command=login)
button1.pack()
button2 = Button(window,text="Exit",command=window.destroy)
button2.pack()
mainloop()

حالا خودتون بررسی کنید که برای پر کردن صحیح مقدار a چه زمان باید فراخوانی بشه، یا به تناسب زبان مورد استفادتون ممکنه روش متفاوتی بخواد. طبیعتا باید توی تابع login یک بار از کنترل متنی مقدار دهی کنید متغیر رو. برای رفع باگ های حلقه بهتره همیشه نقطه به نقطه مقدار متغیر‌های موثرتون رو چک کنین قطعا زودتر به پاسخ میرسین.
موفق باشید.