জিইউআই উদাহরণ:
ধরা যাক আমার জিইউআই রয়েছে:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
একটি বোতাম টিপে গেলে কী হয়
দেখুন যে যখন btnএটি টিপানো হয় তখন এটি তার নিজস্ব ফাংশনটিকে কল করে যা button_press_handleনীচের উদাহরণে খুব অনুরূপ :
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
সঙ্গে:
button_press_handle(btn['command'])
আপনি কেবল মনে করতে পারেন যে commandবিকল্প, যেমন নির্ধারণ করা উচিত পদ্ধতি আমরা চাই রেফারেন্স, বলা হবে অনুরূপ callbackমধ্যে button_press_handle।
বোতামটি চাপলে কোনও পদ্ধতিতে কল করা ( কলব্যাক )
তর্ক ছাড়াই
তাই printবোতামটি টিপানোর সময় যদি আমি কিছু করতে চাই তবে আমাকে সেট করতে হবে:
btn['command'] = print # default to print is new line
পাসে অবধান অভাব এর ()সঙ্গে printপদ্ধতি যা অর্থ যে বাদ দেওয়া হয়: "এই পদ্ধতি নাম যা আমি আপনি যখন চাপা কল করতে চান হয় কিন্তু । এটা শুধু এই খুব তাত্ক্ষণিক কল না" যাইহোক, আমি কোনও আর্গুমেন্ট পাস করি নি printতাই এটি যুক্তি ছাড়াই ডাকা হলে এটি যা প্রিন্ট করে তা মুদ্রিত করে।
সঙ্গে আর্গুমেন্ট (সমূহ)
এখন আমি যদি বোতামটি টিপানো হয় তখন আমাকে যে পদ্ধতিতে কল করতে চাইলে তার পক্ষে যুক্তিগুলিও পাস করতে চাইলে আমি বেনামে থাকা পদ্ধতিটির জন্য লাম্বদা স্টেটমেন্ট দিয়ে তৈরি করা যেতে পারে এমন বেনাম ফাংশনগুলি ব্যবহার করতে পারতাম print, যেমন নীচের মত :
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
বোতামটি চাপলে একাধিক পদ্ধতি কল করা
যুক্তি ছাড়াই
আপনি lambdaবিবৃতি ব্যবহার করে তা অর্জন করতে পারেন তবে এটি খারাপ অনুশীলন হিসাবে বিবেচিত হয় এবং এইভাবে আমি এটি এখানে অন্তর্ভুক্ত করব না। ভাল অনুশীলনটি একটি পৃথক পদ্ধতি সংজ্ঞায়িত করা হয় multiple_methods, যা পদ্ধতিগুলি চেয়েছিলকে কল করে এবং তারপরে এটি বোতাম টিপে কলব্যাক হিসাবে সেট করে:
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
সঙ্গে আর্গুমেন্ট (সমূহ)
অন্য পদ্ধতিগুলি কল করে এমন পদ্ধতিতে যুক্তি (গুলি) পাস করার জন্য আবার lambdaবিবৃতি ব্যবহার করুন তবে প্রথমে:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
এবং তারপরে সেট করুন:
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
কলব্যাক থেকে অবজেক্ট (গুলি) ফিরছে
এছাড়াও আরও মনে রাখবেন যে callbackসত্যিই না পারেন, returnকারণ এটি শুধুমাত্র ভিতরে বলা হচ্ছে button_press_handleসঙ্গে callback()যেমন উল্টোদিকে return callback()। এটি করে returnতবে এই ফাংশনের বাইরে কোথাও নয় । সুতরাং আপনার পরিবর্তে বর্তমান সুযোগে অ্যাক্সেসযোগ্য অবজেক্ট (গুলি) সংশোধন করা উচিত ।
গ্লোবাল অবজেক্ট মডিফিকেশন (গুলি) সহ সম্পূর্ণ উদাহরণ
উদাহরণস্বরূপ নীচে এমন একটি পদ্ধতি কল করবে যা btnপ্রতিটি বার বোতাম টিপে টিপে পরিবর্তন হয়:
import tkinter as tk
i = 0
def text_mod():
global i, btn # btn can be omitted but not sure if should be
txt = ("Vicariously", "I", "live", "as", "the", "whole", "world", "dies")
btn['text'] = txt[i] # the global object that is modified
i = (i + 1) % len(txt) # another global object that gets modified
root = tk.Tk()
btn = tk.Button(root, text="My Button")
btn['command'] = text_mod
btn.pack(fill='both', expand=True)
root.mainloop()
আয়না