📘 CodingMarble Learn

Tkinter से GUI प्रोग्रामिंग: विंडो, विजेट और इवेंट

GUI (ग्राफ़िकल यूज़र इंटरफ़ेस) से लोग कमांड टाइप करने की जगह विंडो, बटन और बॉक्स से प्रोग्राम चलाते हैं। पायथन की अंतर्निर्मित Tkinter लाइब्रेरी यह आसान बनाती है: Tk() से विंडो बनाओ, Label, Entry, Button जैसे विजेट जोड़ो, pack, grid या place से सजाओ, और हर बटन को एक फ़ंक्शन से जोड़ो। फिर प्रोग्राम mainloop() में इंतज़ार करता है और क्लिक या कुंजी दबाने जैसे इवेंट होने पर आपके फ़ंक्शन चलाता है।

🎬 कदम-दर-कदम कहानी

  1. tk.Tk() एक ख़ाली विंडो बनाता है। title() उसे नाम देता है। mainloop() उसे खुला रखता है और उपयोगकर्ता का इंतज़ार करता है।
  2. विजेट ऑब्जेक्ट हैं: Label, Entry, Button, Checkbutton, Radiobutton। हर एक के गुण हैं जैसे text और रंग, और config() उन्हें बदलता है।
  3. लेआउट मैनेजर विजेट रखते हैं: pack() एक के नीचे एक, grid() पंक्ति-स्तंभ में, place() ठीक x और y पर।
  4. एक इवेंट: बटन दबाने पर उसका command फ़ंक्शन चलता है, जो get() से Entry पढ़ता है और Label बदलता है।
  5. Canvas पर खेल: हर तीर-कुंजी दबाना एक इवेंट है, और हैंडलर गेंद खिसकाता है। तारे तक पहुँचो, अंक पाओ।
  6. खुला खेल: बटन दबाकर इवेंट भेजिए और देखिए हर हैंडलर क्या बदलता है।

टिप: 3D दृश्य को घुमाने के लिए खींचें। ज़ूम के लिए दो उंगलियाँ इस्तेमाल करें।

🤔 आम शंकाएँ और उनके जवाब

मेरी विंडो तुरंत बंद क्यों हो जाती है?

root.mainloop() के बिना प्रोग्राम अंत तक पहुँचकर रुक जाता है। mainloop विंडो खुली रखकर इवेंट का इंतज़ार करता है।

मैंने Button बनाया पर दिखता नहीं। क्यों?

विजेट बनाना काफ़ी नहीं; उसे pack(), grid() या place() से रखना पड़ता है।

Entry और Text में क्या अंतर है?

Entry एक पंक्ति (नाम, संख्या)। Text कई पंक्तियाँ (नोट्स)। Entry get() से, Text get('1.0', 'end') से पढ़ते हैं।

command=say_hi में कोष्ठक क्यों नहीं?

आप Tkinter को फ़ंक्शन ख़ुद देते हैं ताकि वह क्लिक पर बाद में बुलाए। कोष्ठक लगाने पर वह तुरंत एक बार चल जाता है।

प्रोग्राम को कैसे पता चलता है कि कौन-सी कुंजी दबी?

root.bind कुंजी के नाम जैसे <Right> को हैंडलर से जोड़ता है। Tkinter event ऑब्जेक्ट भेजता है जिसका keysym कुंजी का नाम है।

क्या विंडो खुलने के बाद लेबल बदल सकते हैं?

हाँ, config() से। खुले खेल में बटन इवेंट होते ही लेबल 'Hello, Asha!' हो जाता है।

GUI क्या है और Tkinter कैसे शुरू होता है?

GUI (ग्राफ़िकल यूज़र इंटरफ़ेस) में विंडो, बटन और टेक्स्ट बॉक्स दिखते हैं। CLI (कमांड-लाइन) में केवल टेक्स्ट। Tkinter पायथन के साथ ही आता है, कुछ अलग इंस्टॉल नहीं करना।

import tkinter as tk
root = tk.Tk()            # मुख्य विंडो
root.title("My App")      # टाइटल बार का नाम
root.geometry("400x300")  # चौड़ाई x ऊँचाई (पिक्सेल)
root.mainloop()           # दिखाओ और इवेंट का इंतज़ार करो

mainloop() इवेंट लूप है। यह विंडो खुली रखता है और बार-बार देखता है: क्या क्लिक हुआ? कुछ टाइप हुआ? विंडो बंद हुई? mainloop() के बाद वाला कोड विंडो बंद होने पर ही चलता है।

विजेट: गुणों वाले ऑब्जेक्ट

हर विजेट एक ऑब्जेक्ट है। इसे क्लास से बनाते हैं, एक पैरेंट (जिस विंडो में रहेगा) और गुण (options) देते हैं।

विजेटकाम
Labelटेक्स्ट या चित्र दिखाता है
Entryएक पंक्ति का टेक्स्ट बॉक्स; .get() से पढ़ो
Textकई पंक्तियों का बॉक्स
Buttonदबाने पर फ़ंक्शन चलाता है (command=)
Checkbuttonहाँ/नहीं टिक बॉक्स, IntVar/BooleanVar से जुड़ा
Radiobuttonकई में से एक चुनो, सब एक ही वेरिएबल साझा करते हैं
Frameदूसरे विजेट समूह में रखने वाला डिब्बा
Canvasआकृतियाँ, रेखाएँ और खेल बनाने की जगह

आम गुण: text, bg (पृष्ठभूमि रंग), fg (अक्षर रंग), font, width। बाद में बदलना: widget.config(bg="yellow")।

संदेश: from tkinter import messagebox, फिर messagebox.showinfo("Title", "Saved!"), showwarning, showerror या askyesno (True/False लौटाता है)।

लेआउट: pack, grid और place

विजेट तब तक नहीं दिखता जब तक कोई लेआउट मैनेजर उसे रखे नहीं।

एक ही पैरेंट में pack और grid मिलाकर न लगाएँ; हर भाग के लिए अलग Frame लें।

इवेंट, हैंडलर और एक छोटा खेल

GUI प्रोग्राम इवेंट-ड्रिवन होता है: ऊपर से नीचे चलकर रुकता नहीं। वह इवेंट (क्लिक, कुंजी, माउस) का इंतज़ार करता है और हर एक के लिए हैंडलर फ़ंक्शन चलाता है।

def say_hi():
    name = ent.get()
    lab.config(text="Hello, " + name + "!")

btn = tk.Button(root, text="Say hi", command=say_hi)

ध्यान दें: command=say_hi बिना कोष्ठक। कोष्ठक लगाया तो फ़ंक्शन क्लिक पर नहीं, तुरंत चल जाएगा।

कुंजियों के लिए bind; हैंडलर को event ऑब्जेक्ट मिलता है:

cv = tk.Canvas(root, width=400, height=300, bg="black")
ball = cv.create_oval(10, 10, 40, 40, fill="orange")
def right(event):
    cv.move(ball, 20, 0)
root.bind("<Right>", right)

खेल में अंक का वेरिएबल, दो आकृतियों के टकराने की जाँच (cv.coords से) और टाइमर पर चलाने के लिए root.after(ms, function) जोड़ते हैं।

ख़ुद करके देखिए

ऊपर का say_hi प्रोग्राम .py फ़ाइल में लिखकर चलाइए। फिर: (1) bg से बटन का रंग बदलिए; (2) 'Loud' नाम का Checkbutton जोड़िए जो टिक होने पर अभिवादन .upper() से बड़े अक्षरों में दिखाए; (3) pack की जगह grid लगाकर फ़ॉर्म को पंक्ति में सजाइए।

मुख्य सूत्र और परिभाषाएँ

हल किए गए उदाहरण

1. 'Quiz' नाम की विंडो बनाइए जिसमें 'Ready?' लेबल हो।

import tkinter as tk root = tk.Tk() root.title('Quiz') tk.Label(root, text='Ready?').pack() root.mainloop()

2. एक Entry और Button जोड़िए जो लिखा नाम संदेश बॉक्स में दिखाए।

from tkinter import messagebox ent = tk.Entry(root); ent.pack() def show(): messagebox.showinfo('Hi', 'Hello ' + ent.get()) tk.Button(root, text='OK', command=show).pack()

3. लॉगिन फ़ॉर्म: लेबल स्तंभ 0 में, Entry स्तंभ 1 में।

tk.Label(root, text='User').grid(row=0, column=0) tk.Entry(root).grid(row=0, column=1) tk.Label(root, text='PIN').grid(row=1, column=0) tk.Entry(root, show='*').grid(row=1, column=1)

4. 'Dark mode' Checkbutton टिक होने पर विंडो की पृष्ठभूमि काली कर दे।

dark = tk.IntVar() def toggle(): root.config(bg='black' if dark.get() == 1 else 'white') tk.Checkbutton(root, text='Dark mode', variable=dark, command=toggle).pack()

5. तीन Radiobutton से Easy / Medium / Hard चुनें; बटन दबाने पर चुनाव छापें।

level = tk.StringVar(value='Easy') for t in ['Easy', 'Medium', 'Hard']: tk.Radiobutton(root, text=t, value=t, variable=level).pack() tk.Button(root, text='Start', command=lambda: print(level.get())).pack()

6. तीर-कुंजियों से Canvas का वर्ग बाएँ-दाएँ खिसकाइए।

sq = cv.create_rectangle(180, 130, 220, 170, fill='blue') root.bind('<Left>', lambda e: cv.move(sq, -10, 0)) root.bind('<Right>', lambda e: cv.move(sq, 10, 0))

आम गलतियाँ

अभ्यास क्विज़

1. कौन-सी पंक्ति Tkinter विंडो को खुला रखकर इवेंट का इंतज़ार करती है?
2. एक पंक्ति का टेक्स्ट बॉक्स कौन-सा विजेट है?
3. Entry e में लिखा कैसे पढ़ें?
4. कौन-सा लेआउट मैनेजर पंक्ति-स्तंभ का उपयोग करता है?
5. इवेंट होने पर चलने वाले फ़ंक्शन को कहते हैं:

अभ्यास: खुद जवाब दो

अपना जवाब लिखो या चुनो, फिर जाँचें दबाओ। अटको तो संकेत देखो; जवाब देने के बाद पूरा हल दिखेगा।

अक्सर पूछे जाने वाले प्रश्न

पायथन में Tkinter क्या है?

Tkinter पायथन की मानक लाइब्रेरी है जिससे बटन, टेक्स्ट बॉक्स और चित्रों वाली विंडो बनती हैं। यह पायथन के साथ आती है, बस import tkinter लिखना है।

pack, grid या place में कौन बेहतर है?

फ़ॉर्म के लिए grid, सीधे ढेर के लिए pack, ठीक जगह के लिए place। कई ऐप हर Frame में अलग मैनेजर लगाते हैं।

क्या Tkinter से खेल बना सकते हैं?

हाँ, आसान 2D खेल: Canvas पर बनाओ, कुंजी इवेंट और root.after टाइमर से आकृतियाँ चलाओ, अंक वेरिएबल में रखो।

यह कहाँ पढ़ाया जाता है

कनाडा (ओंटारियो)Grade 12B. Software Development
रोमानियाClasa a IX-aStoring data and organising code in a programming language
रोमानियाClasa a IX-aStoring data and organising code in a programming language
यूक्रेन9 класProblem solving

पहले यह पढ़ें

आगे पढ़ें

इससे जुड़े पाठ

सभी कंप्यूटर विज्ञान पाठ