मैं टिंकर के साथ बटनों का ग्रिड (क्लिक करने योग्य सेल प्रभाव प्राप्त करने के लिए) बनाने की कोशिश कर रहा हूं।

मेरी मुख्य समस्या यह है कि मैं grid नहीं बना सकता और बटन मूल विंडो को स्वतः आकार और फिट कर सकते हैं।

उदाहरण के लिए, जब मेरे पास ग्रिड पर बटनों की संख्या अधिक होती है, तो बटनों को सिकोड़ने के बजाय ताकि ग्रिड खिड़की के अंदर फिट हो जाए, मुझे एक स्ट्रेच्ड फ्रेम मिलता है जो ऑफ स्क्रीन हो जाता है।

मैं जिस प्रभाव की तलाश कर रहा हूं वह है ग्रिड सभी उपलब्ध स्थान को भरना, फिर उस स्थान के भीतर फिट होने के लिए अपनी कोशिकाओं का आकार बदलना। मैंने प्रलेखन में पढ़ा है, लेकिन मैं अभी भी यह नहीं समझ सकता कि इसे कैसे काम करना है।

यह मूल कोड है जो मेरा प्रारंभिक बिंदु है:

def __init__(self):
    root = Tk()
    frame = Frame(root)
    frame.grid()

    #some widgets get added in the first 6 rows of the frame's grid          

    #initialize grid
    grid = Frame(frame)  
    grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2)

    #example values
    for x in range(60):
        for y in range(30):
            btn = Button(grid)
            btn.grid(column=x, row=y)

    root.mainloop()
54
Kiril 29 सितंबर 2011, 04:54

4 जवाब

सबसे बढ़िया उत्तर

आपको गैर-शून्य भार के लिए पंक्तियों और स्तंभों को कॉन्फ़िगर करने की आवश्यकता है ताकि वे अतिरिक्त स्थान ले सकें:

grid.columnconfigure(tuple(range(60)), weight=1)
grid.rowconfigure(tuple(range(30)), weight=1)

आपको अपने बटनों को भी कॉन्फ़िगर करने की आवश्यकता है ताकि वे सेल भरने के लिए विस्तृत हों:

btn.grid(column=x, row=y, sticky="news")

यह सभी तरह से किया जाना है, इसलिए यहां एक पूर्ण उदाहरण दिया गया है:

from tkinter import *

root = Tk()
frame = Frame(root)
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
frame.grid(row=0, column=0, sticky="news")
grid = Frame(frame)
grid.grid(sticky="news", column=0, row=7, columnspan=2)
frame.rowconfigure(7, weight=1)
frame.columnconfigure(0, weight=1)

#example values
for x in range(10):
    for y in range(5):
        btn = Button(frame)
        btn.grid(column=x, row=y, sticky="news")

frame.columnconfigure(tuple(range(10)), weight=1)
frame.rowconfigure(tuple(range(5)), weight=1)

root.mainloop()
72
TheLizzard 2 सितंबर 2021, 17:01
1
धन्यवाद! यह बहुत अच्छा काम किया। मुझे यकीन नहीं है कि मुझे ग्रिड क्लास क्यों नहीं मिली। मैं ज्यामिति प्रबंधकों के दस्तावेज़ीकरण में पढ़ रहा था, लेकिन केवल .grid विधि की खोज की।
 – 
Kiril
29 सितंबर 2011, 17:41
3
जब आप मेरे सिस्टम पर इसका आकार बदलते हैं तो आपका उदाहरण बटन का विस्तार नहीं कर रहा है। मैं जुबंटू 14.04, 32-बिट का उपयोग कर रहा हूं। मैंने इसे पायथन 2.x और 3.x दोनों पर आजमाया।
 – 
Brōtsyorfuzthrāx
4 जुलाई 2014, 03:12
बहुत मददगार उदाहरण। @ किरिल - आप किसी ऑब्जेक्ट संदर्भ से columnconfigure को भी कॉल कर सकते हैं, उदा। root.rowconfigure(0, weight=1)
 – 
Bondolin
26 जून 2015, 16:16
काटो, इस महान उत्तर के लिए धन्यवाद! आपके पूर्ण उदाहरण में कुछ बाहरी कोड हैं, इसलिए मैंने अपने उत्तर में एक साफ-सुथरा उदाहरण पोस्ट किया है जिसे मैंने अभी पोस्ट किया है, और इसमें स्क्रीनशॉट शामिल हैं।
 – 
Gabriel Staples
7 अगस्त 2016, 03:41
पायथन 27 के लिए वाक्यविन्यास है, चिपचिपा = 'एनएसई' (चिपचिपा नहीं = एन + एस + ई + डब्ल्यू)
 – 
mosh
1 सितंबर 2016, 12:23

@Vaughn Cato ने यहां एक उत्कृष्ट उत्तर दिया। हालांकि, उन्होंने गलती से अपने उदाहरण में बाहरी कोड का एक गुच्छा शामिल कर लिया है। यहां एक साफ-सुथरा और अधिक संगठित पूर्ण उदाहरण दिया गया है जो उसका उदाहरण करता है।

from tkinter import *

#Create & Configure root 
root = Tk()
Grid.rowconfigure(root, 0, weight=1)
Grid.columnconfigure(root, 0, weight=1)

#Create & Configure frame 
frame=Frame(root)
frame.grid(row=0, column=0, sticky=N+S+E+W)

#Create a 5x10 (rows x columns) grid of buttons inside the frame
for row_index in range(5):
    Grid.rowconfigure(frame, row_index, weight=1)
    for col_index in range(10):
        Grid.columnconfigure(frame, col_index, weight=1)
        btn = Button(frame) #create a button inside frame 
        btn.grid(row=row_index, column=col_index, sticky=N+S+E+W)  

root.mainloop()

स्क्रीनशॉट:

जब यह पहली बार खुलता है (छोटा):

enter image description here

आपके द्वारा विंडो को बड़ा करने के बाद:

enter image description here

37
Community 23 मई 2017, 14:55
1
मैंने इस सटीक उदाहरण को कॉपी और पेस्ट किया, और इसने क्षैतिज रूप से 'हम' का आकार बदला, लेकिन लंबवत नहीं, 'ns' OS X 10.13.4 पर अजगर 3.6.4 के साथ। मुझे पता नहीं क्यों, लेकिन आपका कोड मेरी विंडोज़ मशीन पर ठीक काम करता है। मैंने पाया कि अगर मैंने टीटीके मॉड्यूल के बटन का उपयोग किया है तो आकार बदलने का काम आपके द्वारा प्रदर्शित किया जाता है। तो ओएस एक्स उपयोगकर्ता ध्यान दें, tkinter.ttk.Button के बजाय tkinter.ttk.Button का उपयोग करें या यह काम नहीं करेगा।
 – 
cmaceachern
14 अप्रैल 2018, 19:51
मैं इसे एकाधिक कक्षाओं का उपयोग करके प्रोग्राम में कैसे कार्यान्वित करूं?
 – 
James
18 पद 2018, 19:30
यह एक ही बटन को XXY बार डुप्लिकेट करने के साथ काम करता है। क्या होता है जब आप एक ही ग्रिड में XXY अलग-अलग बटन रखना चाहते हैं? मैंने सभी बटनों पर पंक्ति/कॉल को row_index/col_index पर सेट करने का प्रयास किया, लेकिन XXY बार केवल एक बटन प्रदर्शित किया जा रहा है। चर वृद्धि नहीं कर रहे हैं।
 – 
Troy
10 मार्च 2021, 07:34

विंडो के बड़े होने पर बटनों का विस्तार करने के लिए, बटन को संशोधित करने का प्रयास करें। ग्रिड प्रविष्टि को निम्नानुसार संशोधित करें:

btn.grid(column=x, row=y, sticky=N+S+E+W)
4
Max 30 अप्रैल 2015, 11:13

जब आप स्क्रॉलबार (कम से कम मैक में) का उपयोग करते हैं तो ग्रिड वजन विधि काम नहीं कर सकती है, इसलिए इसका उपयोग करते समय विजेट और स्क्रॉलबार को फ्रेम के अंदर पैक करें और फिर फ्रेम को ग्रिड करें।

1
Sanjay 2 नवम्बर 2020, 18:28