2011-09-29 26 views
26

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

मेरी मुख्य समस्या यह है कि मैं 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() 

उत्तर

39

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

:
for x in range(60): 
    Grid.columnconfigure(grid, x, weight=1) 

for y in range(30): 
    Grid.rowconfigure(grid, y, weight=1) 

तुम भी इतना है कि वे सेल को भरने के लिए विस्तार होगा अपने बटन विन्यस्त करने की जरूरत

btn.grid(column=x, row=y, sticky=N+S+E+W) 

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

from tkinter import * 

root = Tk() 
frame=Frame(root) 
Grid.rowconfigure(root, 0, weight=1) 
Grid.columnconfigure(root, 0, weight=1) 
frame.grid(row=0, column=0, sticky=N+S+E+W) 
grid=Frame(frame) 
grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2) 
Grid.rowconfigure(frame, 7, weight=1) 
Grid.columnconfigure(frame, 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=N+S+E+W) 

for x in range(10): 
    Grid.columnconfigure(frame, x, weight=1) 

for y in range(5): 
    Grid.rowconfigure(frame, y, weight=1) 

root.mainloop() 
+1

धन्यवाद! यह बहुत अच्छा काम किया। मुझे यकीन नहीं है कि मुझे ग्रिड क्लास क्यों नहीं मिला। मैं ज्यामिति प्रबंधकों के दस्तावेज़ीकरण में पढ़ रहा था, लेकिन केवल .grid विधि की खोज की। – Kiril

+1

जब आप मेरे सिस्टम पर इसका आकार बदलते हैं तो आपके उदाहरण में बटन का विस्तार नहीं होता है। मैं Xubuntu 14.04, 32-बिट का उपयोग कर रहा हूँ। मैंने इसे पायथन 2.x और 3.x दोनों पर करने की कोशिश की। – Shule

+0

बहुत उपयोगी उदाहरण। @ किरील - आप किसी ऑब्जेक्ट संदर्भ से कॉलम कॉन्फ़िगरेशन भी कॉल कर सकते हैं, उदा। root.rowconfigure (0, वजन = 1) – NargothBond

2

बटन का विस्तार विंडो अधिकतम, इस प्रकार button.grid प्रविष्टि को संशोधित करने की कोशिश करने के लिए :

btn.grid(column=x, row=y, sticky=N+S+E+W) 
7

@Vaughn Cato gave an excellent answer here। हालांकि, उन्होंने गलती से अपने उदाहरण में अपर्याप्त कोड का एक गुच्छा शामिल किया है। यहां एक साफ और अधिक संगठित पूर्ण उदाहरण है जो वास्तव में उसका उदाहरण करता है।

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