টিকিন্টার অ্যাপ্লিকেশন গঠনের সেরা উপায়?


136

নিম্নলিখিতটি আমার সাধারণ পাইথন টিনকিটার প্রোগ্রামের সামগ্রিক কাঠামোটি রয়েছে।

def funA():
    def funA1():
        def funA12():
            # stuff

    def funA2():
        # stuff

def funB():
    def funB1():
        # stuff

    def funB2():
        # stuff

def funC():
    def funC1():
        # stuff

    def funC2():
        # stuff


root = tk.Tk()

button1 = tk.Button(root, command=funA)
button1.pack()
button2 = tk.Button(root, command=funB)
button2.pack()
button3 = tk.Button(root, command=funC)
button3.pack()

funA funBএবং funCআরেকটি আপ আনতে হবে Toplevelউইজেট সহ Windows যখন বোতাম 1, 2, 3 ব্যবহারকারীর ক্লিক করুন।

আমি ভাবছি এটি কি অজগর টিনকিটার প্রোগ্রামটি লেখার সঠিক উপায়? অবশ্যই, আমি এইভাবে লিখলেও এটি কাজ করবে, তবে এটি কি সবচেয়ে ভাল উপায়? এটি নির্বোধ শোনায় তবে আমি যখন অন্য লোকদের লিখিত কোডগুলি দেখি তখন তাদের কোডগুলি গুচ্ছ ফাংশনগুলির সাথে মিশে যায় না এবং বেশিরভাগই তাদের ক্লাস থাকে।

এমন কোন নির্দিষ্ট কাঠামো রয়েছে যা আমাদের ভাল অনুশীলন হিসাবে অনুসরণ করা উচিত? অজগর প্রোগ্রাম লেখার আগে আমার কীভাবে পরিকল্পনা করা উচিত?

আমি জানি প্রোগ্রামিংয়ে সেরা অনুশীলন করার মতো কোনও জিনিস নেই এবং আমি এটির জন্যও চাইছি না। আমি নিজেই পাইথন শিখছি বলে আমাকে সঠিক দিকে চালিত করার জন্য আমি কিছু পরামর্শ এবং ব্যাখ্যা চাই।


2
টিন্টেটার জিইউআই ডিজাইনের একটি চমৎকার টিউটোরিয়াল এখানে রয়েছে, এর কয়েকটি উদাহরণ রয়েছে - পাইথন- টেক্সটবক.ড্রেডহেডসকস.অর্গ / en / latest/… এমভিসি ডিজাইনের প্যাটার্নের সাথে এখানে আরও একটি উদাহরণ দেওয়া হয়েছে - sukhbinder.wordpress.com/2014/12/ 25 /…
বন্ডোলিন

12
এই প্রশ্নটি বিস্তৃত হতে পারে, তবে এটি তুলনামূলকভাবে জনপ্রিয় উত্তর হিসাবে (প্রায় অন্যান্য সমস্ত [টিনকিটার উত্তরগুলির সাথে সম্পর্কিত) কার্যকর এবং কার্যকর। আমি আবার খোলার জন্য মনোনীত করছি, যেহেতু আমি দেখতে পাচ্ছি এটি বন্ধ থাকার চেয়ে এটি খোলাই বেশি কার্যকর।
ব্রায়ান ওকলে

উত্তর:


271

আমি একটি অবজেক্ট অরিয়েন্টেড পদ্ধতির পক্ষে। এটি যে টেম্পলেটটি দিয়ে আমি শুরু করি:

# Use Tkinter for python 2, tkinter for python 3
import tkinter as tk

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent

        <create the rest of your GUI here>

if __name__ == "__main__":
    root = tk.Tk()
    MainApplication(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

গুরুত্বপূর্ণ বিষয়গুলি লক্ষ্য করুন:

  • আমি কোনও ওয়াইল্ডকার্ড আমদানি করি না। আমি "tk" হিসাবে প্যাকেজটি আমদানি করি, এর জন্য আমার সমস্ত কমান্ডের সাথে উপসর্গ করা দরকার tk.। এটি বিশ্বব্যাপী নেমস্পেস দূষণকে বাধা দেয়, এছাড়াও আপনি কোডিন্টার ক্লাস, ttk ক্লাস বা আপনার নিজের কিছু ব্যবহার করার সময় কোডটি পুরোপুরি স্পষ্ট করে তোলে।

  • মূল প্রয়োগটি একটি শ্রেণি । এটি আপনাকে আপনার সমস্ত কলব্যাক এবং ব্যক্তিগত ফাংশনের জন্য একটি ব্যক্তিগত নেমস্পেস দেয় এবং কেবল আপনার কোডটি সংগঠিত করা সহজ করে তোলে। একটি পদ্ধতিগত শৈলীতে আপনাকে শীর্ষ-কোড কোড করতে হবে, তাদের ব্যবহারের পূর্বে ফাংশনগুলি সংজ্ঞায়িত করতে হবে ইত্যাদি method এই পদ্ধতিতে আপনি যেহেতু আসলেই শেষ পর্বটি না হওয়া পর্যন্ত মূল উইন্ডোটি তৈরি করেন না। আমি উত্তরাধিকার সূত্রে পছন্দ করি tk.Frameকারণ আমি সাধারণত একটি ফ্রেম তৈরি করে শুরু করি তবে এটি কোনওভাবেই প্রয়োজন হয় না।

যদি আপনার অ্যাপ্লিকেশনটিতে অতিরিক্ত শীর্ষ স্তরের উইন্ডোজ থাকে তবে আমি তাদের প্রত্যেককে পৃথক শ্রেণি তৈরি করার পরামর্শ দিচ্ছি, যা উত্তরাধিকার সূত্রে প্রাপ্ত tk.Toplevel। এটি আপনাকে উপরে উল্লিখিত একই সুবিধাগুলির সমস্ত দেয় - উইন্ডোগুলি পারমাণবিক, তাদের নিজস্ব নাম স্থান রয়েছে এবং কোডটি সুসংহত। এছাড়াও, কোডটি বড় হতে শুরু করলে প্রতিটি তার নিজস্ব মডিউলে রেখে দেওয়া সহজ করে তোলে।

শেষ অবধি, আপনি আপনার ইন্টারফেসের প্রতিটি বড় অংশের জন্য ক্লাস ব্যবহার বিবেচনা করতে চাইতে পারেন। উদাহরণস্বরূপ, আপনি যদি একটি সরঞ্জামদণ্ড, একটি নেভিগেশন ফলক, একটি স্ট্যাটাসবার এবং একটি প্রধান অঞ্চল দিয়ে একটি অ্যাপ তৈরি করে থাকেন তবে আপনি those শ্রেণির প্রত্যেকটিকে তৈরি করতে পারেন। এটি আপনার মূল কোডটিকে বেশ ছোট এবং সহজে বুঝতে সহজ করে তোলে:

class Navbar(tk.Frame): ...
class Toolbar(tk.Frame): ...
class Statusbar(tk.Frame): ...
class Main(tk.Frame): ...

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.statusbar = Statusbar(self, ...)
        self.toolbar = Toolbar(self, ...)
        self.navbar = Navbar(self, ...)
        self.main = Main(self, ...)

        self.statusbar.pack(side="bottom", fill="x")
        self.toolbar.pack(side="top", fill="x")
        self.navbar.pack(side="left", fill="y")
        self.main.pack(side="right", fill="both", expand=True)

যেহেতু এই সমস্ত উদাহরণ একটি সাধারণ পিতামাতাকে ভাগ করে, তাই পিতামাতারা কার্যকরভাবে একটি মডেল-ভিউ-কন্ট্রোলার আর্কিটেকচারের "নিয়ামক" অংশে পরিণত হন। সুতরাং, উদাহরণস্বরূপ, মূল উইন্ডোটি কল করে স্ট্যাটাসবারে কিছু রাখতে পারে self.parent.statusbar.set("Hello, world")। এটি আপনাকে উপাদানগুলির মধ্যে একটি সহজ ইন্টারফেস সংজ্ঞায়িত করতে সহায়তা করে, মিনিমুনে সংযোগ স্থাপনে সহায়তা করে।


22
@ ব্রায়ান ওকলি আপনি কি ইন্টারনেটে এমন কোনও ভাল নমুনা কোড জানেন যে আমি তাদের কাঠামোটি অধ্যয়ন করতে পারি?
ক্রিস অং

2
আমি অবজেক্ট ভিত্তিক পদ্ধতির দ্বিতীয়। যাইহোক, আপনার ক্লাসে উত্তরাধিকার ব্যবহার থেকে বিরত থাকুন যা জিইউআইকে ডাকবে এটি আমার অভিজ্ঞতার পক্ষে। এটি আপনাকে আরও নমনীয়তার প্রস্তাব দেয় যদি টাকা এবং ফ্রেম উভয় বস্তু কোনও শ্রেণীর বৈশিষ্ট্য যা কোনও কিছুর উত্তরাধিকার সূত্রে প্রাপ্ত হয় না। আপনি এইভাবে আরও সহজেই টুকরো এবং ফ্রেম অবজেক্টগুলিতে অ্যাক্সেস করতে পারবেন (এবং কম অস্পষ্টভাবে), এবং যদি না চান তবে আপনার শ্রেণীর সমস্ত কিছুই ধ্বংস করবে না। কিছু প্রোগ্রামে এটি কেন গুরুত্বপূর্ণ তা আমি ভুলে গেছি তবে এটি আপনাকে আরও বেশি কিছু করার অনুমতি দেয়।
ব্রুটসর্ফুজথ্রিক্স

1
ক্লাস না করে কি আপনাকে একটি ব্যক্তিগত নাম স্থান দেবে? ফ্রেম সাবক্লাসিং এর উপর কেন উন্নতি হবে?
gcb

3
@ জিসিবি: হ্যাঁ, যে কোনও শ্রেণি আপনাকে একটি ব্যক্তিগত নেমস্পেস দেবে। কেন একটি ফ্রেম সাবক্লাস? আমি সাধারণত যাইহোক যাইহোক একটি ফ্রেম তৈরি করতে যাচ্ছি, সুতরাং এটি পরিচালনা করার জন্য একটি কম শ্রেণি (ফ্রেমের সাবক্লাস, একটি বৈশিষ্ট্য হিসাবে একটি ফ্রেম সহ বস্তুর উত্তরাধিকার সূত্রে প্রাপ্ত বর্গ)। আরও স্পষ্ট করতে আমি উত্তরটি কিছুটা পুনরায় চাপিয়েছি। সাহায্য করার জন্য ধন্যবাদ.
ব্রায়ান ওকলে

2
@ এমড্যাটিন: parentআপনি যদি পরে এটি ব্যবহার না করেন তবে রেফারেন্স সংরক্ষণ করার দরকার নেই । আমি এটি সংরক্ষণ করিনি কারণ আমার উদাহরণের কোডগুলির কোনওটিরই এটি সংরক্ষণ করার প্রয়োজন নেই।
ব্রায়ান ওকলি

39

আপনার প্রতিটি শীর্ষ-স্তরের উইন্ডোকে এটির পৃথক শ্রেণিতে স্থাপন করা আপনাকে কোড পুনরায় ব্যবহার এবং আরও ভাল কোড সংগঠন দেয়। উইন্ডোতে উপস্থিত যে কোনও বোতাম এবং প্রাসঙ্গিক পদ্ধতিগুলি এই শ্রেণীর মধ্যে সংজ্ঞায়িত করা উচিত। এখানে একটি উদাহরণ দেওয়া হয়েছে ( এখান থেকে নেওয়া ):

import tkinter as tk

class Demo1:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        self.button1 = tk.Button(self.frame, text = 'New Window', width = 25, command = self.new_window)
        self.button1.pack()
        self.frame.pack()
    def new_window(self):
        self.newWindow = tk.Toplevel(self.master)
        self.app = Demo2(self.newWindow)

class Demo2:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25, command = self.close_windows)
        self.quitButton.pack()
        self.frame.pack()
    def close_windows(self):
        self.master.destroy()

def main(): 
    root = tk.Tk()
    app = Demo1(root)
    root.mainloop()

if __name__ == '__main__':
    main()

আরও দেখুন:

আশা করি এইটি কাজ করবে.


6

এটি কোনও খারাপ কাঠামো নয়; এটা ঠিক কাজ করবে। যাইহোক, কেউ যখন কোনও বোতাম বা কিছুতে ক্লিক করেন তখন কমান্ডগুলি করতে কোনও ফাংশনে আপনার কাজ করতে হবে

আপনি যা করতে পারছেন তা হল ক্লাসে লেখার জন্য ক্লাসে এমন পদ্ধতি রয়েছে যা বোতামের ক্লিক এবং এর জন্য আদেশগুলি হ্যান্ডেল করে।

এখানে একটি উদাহরণ:

import tkinter as tk

class Window1:
    def __init__(self, master):
        pass
        # Create labels, entries,buttons
    def button_click(self):
        pass
        # If button is clicked, run this method and open window 2


class Window2:
    def __init__(self, master):
        #create buttons,entries,etc

    def button_method(self):
        #run this when button click to close window
        self.master.destroy()

def main(): #run mianloop 
    root = tk.Tk()
    app = Window1(root)
    root.mainloop()

if __name__ == '__main__':
    main()

সাধারণত একাধিক উইন্ডো সহ টি কে প্রোগ্রামগুলি একাধিক বড় ক্লাস হয় এবং __init__সমস্ত এন্ট্রি, লেবেল ইত্যাদিতে তৈরি হয় এবং তারপরে প্রতিটি পদ্ধতিতে বোতাম ক্লিক ইভেন্টগুলি পরিচালনা করা হয়

এটি করার কোনও সঠিক উপায় নেই, যা আপনার পক্ষে কাজ করে এবং যতক্ষণ কাজ তার পাঠযোগ্য হিসাবে কাজটি সম্পন্ন করে এবং আপনি সহজেই এটি ব্যাখ্যা করতে পারেন কারণ যদি আপনি সহজেই আপনার প্রোগ্রামটি ব্যাখ্যা করতে না পারেন তবে সম্ভবত এটি করার আরও ভাল উপায় আছে ।

কটাক্ষপাত Tkinter মধ্যে চিন্তা


3
"থিংকিং ইন টিনকিটার" বৈশ্বিক আমদানির পক্ষে, যা আমার মনে হয় খুব খারাপ পরামর্শ।
ব্রায়ান ওকলে

1
সত্য কথাটি আমি আপনাকে সুপারিশ করি না যে আপনি গ্লোবালগুলি ব্যবহার করছেন কেবলমাত্র কিছু মূল শ্রেণীর মেঠো স্ট্রাকচারের অধিকারী আপনি :)
সিরিয়াল

2

OOP এর পদ্ধতির frameহওয়া উচিত এবং ইনস্ট্যান্স ভেরিয়েবলের পরিবর্তে শ্রেণি পরিবর্তনশীল হওয়া উচিত ।

from Tkinter import *
class App:
  def __init__(self, master):
    frame = Frame(master)
    frame.pack()
    self.button = Button(frame, 
                         text="QUIT", fg="red",
                         command=frame.quit)
    self.button.pack(side=LEFT)
    self.slogan = Button(frame,
                         text="Hello",
                         command=self.write_slogan)
    self.slogan.pack(side=LEFT)
  def write_slogan(self):
    print "Tkinter is easy to use!"

root = Tk()
app = App(root)
root.mainloop()

এখানে চিত্র বর্ণনা লিখুন

তথ্যসূত্র: http://www.python-course.eu/tkinter_buttons.php


2
আপনি শুধুমাত্র ব্যবহার করতে পারেন TKinterপাইথন 2. উপর আমি ব্যবহার সুপারিশ করবে tkinterপাইথন 3. আমি একটি অধীনে কোডের গত তিন লাইন স্থাপন করবে main()ফাংশন এবং কল প্রোগ্রাম শেষে যে। আমি অবশ্যই ব্যবহারটি এড়িয়ে যাব from module_name import *কারণ এটি বিশ্বব্যাপী নেমস্পেসকে দূষিত করে এবং পাঠযোগ্যতা হ্রাস করতে পারে।
জ্যাক

1
আপনি কিভাবে মধ্যে পার্থক্য বলতে পারতাম button1 = tk.Button(root, command=funA)এবং button1 = ttk.Button(root, command=funA)যদি tkinterএক্সটেনশন মডিউল এছাড়াও আমদানি করা হচ্ছে হয়েছিল? সঙ্গে *সিনট্যাক্স, কোড উভয় লাইন হতে প্রদর্শিত হবে button1 = Button(root, command=funA)। আমি এই সিনট্যাক্স ব্যবহার করার পরামর্শ দেব না।
জ্যাক

0

ক্লাস ব্যবহার করে আপনার অ্যাপ্লিকেশনটি সংগঠিত করা আপনার এবং আপনার সাথে কাজ করা অন্যদের পক্ষে সমস্যাগুলি ডিবাগ করতে এবং অ্যাপটিকে সহজেই উন্নত করা সহজ করে তোলে।

আপনি সহজেই এইভাবে আপনার অ্যাপ্লিকেশনটি সংগঠিত করতে পারেন:

class hello(Tk):
    def __init__(self):
        super(hello, self).__init__()
        self.btn = Button(text = "Click me", command=close)
        self.btn.pack()
    def close():
        self.destroy()

app = hello()
app.mainloop()

-2

আপনার প্রোগ্রামের কাঠামো কীভাবে করা যায় তা শেখার সম্ভবত সেরা উপায় হ'ল অন্য লোকের কোড পড়া, বিশেষত যদি এটি একটি বিশাল প্রোগ্রাম যাতে বহু লোকেরা অবদান রেখেছিল। অনেক প্রকল্পের কোড দেখার পরে, আপনার theকমত্যের স্টাইলটি কী হওয়া উচিত তা সম্পর্কে ধারণা পাওয়া উচিত।

পাইথন, একটি ভাষা হিসাবে, আপনার কীভাবে আপনার কোডটি ফর্ম্যাট করা উচিত সে সম্পর্কে কয়েকটি দৃ strong় নির্দেশিকা রয়েছে এতে বিশেষ। প্রথমটি হ'ল তথাকথিত "পাইথনের জেন":

  • কদর্য চেয়ে সুন্দর।
  • সুস্পষ্ট বর্ণিত চেয়ে ভাল।
  • সহজ জটিল চেয়ে ভাল।
  • জটিল জটিল চেয়ে ভাল।
  • নেস্টেড থেকে ফ্ল্যাট ভাল।
  • গা Sp়ের চেয়ে বিরাগই ভাল।
  • পঠনযোগ্যতা গণনা।
  • বিশেষ কেসগুলি নিয়ম ভাঙার পক্ষে যথেষ্ট বিশেষ নয়।
  • যদিও ব্যবহারিকতা বিশুদ্ধতা বীট।
  • ত্রুটিগুলি কখনই নিঃশব্দে কাটানো উচিত নয়।
  • স্পষ্টভাবে নিরব না হলে।
  • অস্পষ্টতার মুখে অনুমান করার প্রলোভনটিকে অস্বীকার করুন।
  • এটির জন্য একটি - এবং অগ্রাধিকার কেবল একটিই - প্রকাশ্য উপায় থাকতে হবে।
  • যদিও আপনি ডাচ না হলে এই উপায়টি প্রথমে সুস্পষ্ট নাও হতে পারে।
  • এখন আগের চেয়ে ভাল is
  • যদিও কখনো প্রায়ই বেশী ভালো ডান এখন।
  • যদি বাস্তবায়নটি ব্যাখ্যা করা শক্ত হয় তবে এটি একটি খারাপ ধারণা।
  • বাস্তবায়নটি যদি ব্যাখ্যা করা সহজ হয় তবে এটি একটি ভাল ধারণা হতে পারে।
  • নেমস্পেসগুলি হ'ল একটি দুর্দান্ত ধারণা - আসুন আমরা তাদের আরও কিছু করি!

আরও ব্যবহারিক স্তরে, পাইথনের স্টাইল গাইড পিইপি 8 রয়েছে

যারা মনে মনে রাখে, তাদের সাথে আমি বলতে পারি যে আপনার কোড শৈলীটি বিশেষত নেস্টেড ফাংশনগুলির সাথে খাপ খায় না। ক্লাস ব্যবহার করে বা তাদের পৃথক মডিউলে স্থানান্তরিত করে এগুলি সমতল করার একটি উপায় সন্ধান করুন। এটি আপনার প্রোগ্রামের কাঠামো বুঝতে আরও সহজ করে তুলবে।


12
পাইথনের জেন ব্যবহারের জন্য -1। যদিও এটি সমস্ত ভাল পরামর্শ, এটি সরাসরি জিজ্ঞাসা করা প্রশ্নটির সমাধান করে না। শেষ অনুচ্ছেদটি দেখুন এবং এই উত্তরটি এই সাইটের প্রায় প্রতিটি অজগর প্রশ্নের ক্ষেত্রে প্রযোজ্য। এটি ভাল, ইতিবাচক পরামর্শ, তবে এটি প্রশ্নের উত্তর দেয় না।
ব্রায়ান ওকলি

1
@ ব্রায়ান ওকলে আমি তাতে আপনার সাথে একমত নই। হ্যাঁ, পাইথনের জেনটি বিস্তৃত এবং অনেক প্রশ্নের সমাধান করতে ব্যবহার করা যেতে পারে। তিনি ক্লাস বেছে নেওয়ার বা পৃথক মডিউলগুলিতে ফাংশন স্থাপনের জন্য চূড়ান্ত অনুচ্ছেদে উল্লেখ করেছিলেন। তিনি পাইথনের একটি স্টাইল গাইড, পিইপি 8 এর উল্লেখ সহ উল্লেখ করেছেন। যদিও সরাসরি উত্তর না হলেও আমি এই উত্তরটি বিশ্বাসযোগ্য যে এটি গ্রহণযোগ্য অনেকগুলি রুটের উল্লেখ করেছে। এটি আমার মতামত
জ্যাক

1
আমি এই নির্দিষ্ট প্রশ্নের উত্তর খুঁজতে এখানে এসেছি। এমনকি একটি মুক্ত-সমাপ্ত প্রশ্নের জন্য, আমি এই প্রতিক্রিয়া দিয়ে কিছুই করতে পারি না। আমার কাছ থেকেও।
জোনাথন

কোনও উপায় নয়, প্রশ্নটি একটি টিনকিটার অ্যাপ্লিকেশন গঠনের বিষয়ে, স্টাইলিং / কোডিং / জেন নির্দেশিকা সম্পর্কে কিছুই নয়। @ আরবিটারের উদ্ধৃতি হিসাবে সহজ "যদিও প্রত্যক্ষ উত্তর নয়", সুতরাং, এটি কোনও উত্তর নয়। এটি জেন ​​প্রিপেন্ড করা সহ "সম্ভবত হ্যাঁ এবং সম্ভবত না" এর মতো।
এম

-7

আমি ব্যক্তিগতভাবে আপত্তিযুক্ত দৃষ্টিভঙ্গি ব্যবহার করি না, বেশিরভাগ কারণেই এটি ক) কেবল পথে যেতে; খ) আপনি মডিউল হিসাবে কখনও এটি পুনরায় ব্যবহার করতে পারবেন না

তবে এমন কিছু যা এখানে আলোচনা করা হয়নি তা হ'ল আপনাকে অবশ্যই থ্রেডিং বা মাল্টিপ্রসেসিং ব্যবহার করতে হবে । সর্বদা. অন্যথায় আপনার আবেদন ভয়ঙ্কর হবে।

একটি সাধারণ পরীক্ষা করুন: একটি উইন্ডো শুরু করুন এবং তারপরে কিছু URL বা অন্য কিছু আনুন। পরিবর্তনগুলি হ'ল নেটওয়ার্কের অনুরোধটি চলাকালীন আপনার ইউআই আপডেট হবে না। অর্থ, আপনার অ্যাপ্লিকেশন উইন্ডোটি নষ্ট হয়ে যাবে। আপনি যে ওএসটি চালু আছেন তার উপর নির্ভর করুন তবে বেশিরভাগ সময় এটি পুনরায় আঁকবে না, আপনি উইন্ডোটির উপরে যে কোনও কিছু টানবেন তার উপর প্লাস্টার করা হবে, যতক্ষণ না প্রক্রিয়াটি টি কে মেনলুপে ফিরে না আসে।


4
আপনি যা বলছেন তা সত্য নয়। আমি ব্যক্তিগত ও বাণিজ্যিক উভয় ক্ষেত্রেই টেক-ভিত্তিক অ্যাপ্লিকেশনগুলির হুড্রেস লিখেছি এবং প্রায় কখনও থ্রেড ব্যবহার করতে হয়নি। থ্রেডগুলির নিজস্ব জায়গা রয়েছে, তবে টিনকিটার প্রোগ্রাম লেখার সময় আপনার অবশ্যই এটি ব্যবহার করা উচিত তা ঠিক নয় । আপনার যদি দীর্ঘকালীন চলমান ফাংশন থাকে তবে আপনার থ্রেড বা মাল্টিপ্রসেসিংয়ের প্রয়োজন হতে পারে, তবে এমন অনেকগুলি প্রোগ্রাম রয়েছে যা আপনি লিখতে পারেন যা থ্রেডের দরকার নেই need
ব্রায়ান ওকলে

আমি মনে করি আপনি যদি নিজের উত্তরটি এর থেকে কিছুটা আরও পরিষ্কার করে দেখেন তবে এটি আরও ভাল উত্তর হবে। টিনকটারের সাহায্যে থ্রেডগুলি ব্যবহার করার একটি সাধারণ উদাহরণ থাকতে সত্যই এটি সহায়তা করবে।
ব্রায়ান ওকলে

এখানে সেরা উত্তর হওয়ার বিষয়ে চিন্তা নেই কারণ এটি প্রবন্ধটি বন্ধ। তবে মনে রাখবেন থ্রেডিং / মাল্টি দিয়ে শুরু করা খুব সহজ। যদি আপনাকে পরে যুক্ত করতে হয় তবে এটি একটি হারানো যুদ্ধ। এবং আজকাল, একেবারে এমন কোনও অ্যাপ্লিকেশন নেই যা নেটওয়ার্কের সাথে কথা বলবে না। এমনকি যদি আপনি এড়ানো এবং 'আমার কাছে কেবলমাত্র ডিস্ক আইও আছে' মনে করে, কাল আপনার ক্লায়েন্ট সিদ্ধান্ত নিচ্ছে যে ফাইলটি এনএফএসে থাকবে এবং আপনি নেটওয়ার্ক আইওর জন্য অপেক্ষা করছেন এবং আপনার অ্যাপ্লিকেশনটি মারা গেছে বলে মনে হচ্ছে।
gcb

2
@ erm3nda: "নেটওয়ার্কের সাথে সংযুক্ত বা আইও লিখন করা প্রতিটি অ্যাপ্লিকেশন থ্রেড বা সাবপ্রসেস ব্যবহার করে অনেক দ্রুত হবে" - এটি কেবল সত্য নয়। থ্রেডিং অগত্যা আপনার প্রোগ্রামটি দ্রুততর করবে না এবং কিছু ক্ষেত্রে এটি ধীর করে দেবে। জিইউআই প্রোগ্রামিংয়ে, থ্রেডগুলি ব্যবহারের মূল কারণ হ'ল এমন কিছু কোড চালানো সম্ভব যা অন্যথায় জিইউআইকে অবরুদ্ধ করে।
ব্রায়ান ওকলে

2
@ erm3nda: না, আমি বলছি না থ্রেডগুলির প্রয়োজন হয় না । এগুলি অবশ্যই প্রচুর জিনিসের জন্য প্রয়োজন (ভাল, থ্রেড বা মাল্টিপ্রসেসিং)। এটি ঠিক যে জিইউআই অ্যাপ্লিকেশনগুলির একটি খুব বড় শ্রেণীর যেখানে টিন্টিন্টার উপযুক্ত তবে যেখানে থ্রেডগুলি কেবল প্রয়োজন হয় না। এবং হ্যাঁ, "ইনস্টলার, নোটপ্যাডস, এবং অন্যান্য সহজ সরঞ্জাম" সেই বিভাগে আসে। শব্দ, এক্সেল, ফটোশপ ইত্যাদির চেয়ে বিশ্বের এই "সহজ সরঞ্জামগুলি" এর চেয়ে অনেক বেশি গঠিত, প্লাস মনে রাখবেন যে এখানে প্রসঙ্গটি ক্ষুদ্রতর । টিনকিটার সাধারণত খুব বড়, জটিল অ্যাপ্লিকেশনগুলির জন্য ব্যবহৃত হয় না।
ব্রায়ান ওকলে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.