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(): ऊपर से नीचे (याside="left") रखता है। तेज़ और आसान।grid(row=r, column=c): पंक्तियों-स्तंभों की तालिका। फ़ॉर्म के लिए सबसे अच्छा।place(x=…, y=…): ठीक पिक्सेल स्थान। सटीक, पर विंडो का आकार बदलने पर नहीं ढलता।
एक ही पैरेंट में 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 लगाकर फ़ॉर्म को पंक्ति में सजाइए।
मुख्य सूत्र और परिभाषाएँ
- root = tk.Tk() … root.mainloop()
- w = tk.Widget(parent, option=value)
- w.pack() | w.grid(row=r, column=c) | w.place(x=, y=)
- w.config(option=value) — गुण बदलना
- entry.get() — लिखा हुआ पढ़ना
- tk.Button(root, command=function_name) — बिना कोष्ठक
- root.bind("<Key>", handler) — handler(event)
- messagebox.showinfo(title, message)
हल किए गए उदाहरण
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))
आम गलतियाँ
- command=say_hi() कोष्ठक के साथ लिखना: फ़ंक्शन शुरू में एक बार चल जाता है और बटन फिर कुछ नहीं करता।
- pack/grid/place भूल जाना, जिससे विजेट दिखता ही नहीं।
- root.mainloop() भूल जाना, जिससे विंडो झलक दिखाकर बंद हो जाती है।
- एक ही पैरेंट में pack() और grid() मिलाना, जिससे प्रोग्राम अटक सकता है।