2011-08-21 5 views
5

मैं टिनटर में 10 बटन जोड़ना चाहता हूं, जिसका नाम वन टू टेन है। मैंने मूल रूप से केवल ब्रूट फोर्स विधि का उपयोग किया, जैसा कि मैंने देखा था, प्रत्येक बटन को init मेरे एप्लिकेशन के वर्ग के फ़ंक्शन में शामिल किया गया। यह काम करता है, लेकिन मैं अधिक कुशल होने के लिए इस्तेमाल किए गए कोड को कम करना चाहता हूं, जैसे कि सभी बटनों को पकड़ने के लिए डेटा संरचना का उपयोग करना।मैं tkinter फ्रेम में कुशलता से बहुत सारे बटन कैसे जोड़ सकता हूं?

मैं सभी बटनों को पकड़ने के लिए buttonBox का उपयोग करने के बारे में सोच रहा था, लेकिन मुझे यकीन नहीं था कि मैं बटन को रखने के लिए grid() के माध्यम से प्लेसमेंट में हेरफेर कर सकता हूं।

self.one = Button(frame, text="One", command=self.callback) 
self.one.grid(sticky=W+E+N+S, padx=1, pady=1) 

self.two = Button(frame, text="Two", command=self.callback) 
self.two.grid(sticky=W+E+N+S, row=0, column=1, padx=1, pady=1) 

self.three = Button(frame, text="Three", command=self.callback) 
self.three.grid(sticky=W+E+N+S, row=0, column=2, padx=1, pady=1) 

# ... 

self.ten = Button(frame, text="Ten", command=self.callback) 
self.ten.grid(sticky=W+E+N+S, row=1, column=4, padx=1, pady=1) 

क्या कोई मुझे डेटा संरचना जैसे अधिक कुशल बनाने के लिए एक तरीका दिखा सकता है?

उत्तर

4

बटन self.one, self.two इत्यादि नामकरण करने के बजाय, self.button जैसे किसी सूची को अनुक्रमणित करके उन्हें संदर्भित करना अधिक सुविधाजनक होगा।

यदि बटन अलग चीजें करते हैं, तो आपको कॉलबैक के साथ स्पष्ट रूप से सहयोगी बटनों को स्पष्ट करना होगा। उदाहरण के लिए:

name_callbacks=(('One',self.callback_one), 
       ('Two',self.callback_two), 
       ..., 
       ('Ten',self.callback_ten)) 
self.button=[] 
for i,(name,callback) in enumerate(name_callbacks): 
    self.button.append(Button(frame, text=name, command=callback)) 
    row,col=divmod(i,5) 
    self.button[i].grid(sticky=W+E+N+S, row=row, column=col, padx=1, pady=1) 

बटन सभी समान बातें करते हैं, तो एक कॉलबैक उन सब की सेवा के लिए पर्याप्त हो सकता है। चूंकि कॉलबैक ही तर्क नहीं ले जा सकते, आप सेटअप एक कॉलबैक कारखाने बहस में एक बंद करने के माध्यम से पारित करने के लिए कर सकते हैं:

def callback(self,i): # This is the callback factory. Calling it returns a function. 
    def _callback(): 
     print(i) # i tells you which button has been pressed. 
    return _callback 

def __init__(self): 
    names=('One','Two','Three','Four','Five','Six','Seven','Eight','Nine','Ten') 
    self.button=[] 
    for i,name in enumerate(names): 
     self.button.append(Button(frame, text=name, command=self.callback(i+1))) 
     row,col=divmod(i,5) 
     self.button[i].grid(sticky=W+E+N+S, row=row, column=col, padx=1, pady=1) 
+1

धन्यवाद! यह काम करता था, लेकिन मुझे इसे "self.button.append()" में बदलना पड़ा, इसलिए इससे इंडेक्स एरर नहीं हुआ। और नीचे की रेखा मैं self.one.grid() के बजाय self.button [i] .grid() में बदल गया। यह पूरी तरह से काम किया :) – thatbennyguy

+0

@thatbennyguy: एक! सुधार के लिए धन्यवाद! – unutbu

+0

केवल एक चीज ... आप विभिन्न आदेशों को कॉलबैक करने के लिए बटन कैसे प्राप्त करेंगे? – thatbennyguy

1

आप एक dict में सभी बटन गुण डाल सकता है, और फिर पाश पर उसे बनाने के लिए आपके बटन, यहां एक उदाहरण है:

buttons = { 
    'one': {'sticky': W+E+N+S, 'padx': 1, 'pady': 1}, 
    'two': {'sticky': W+E+N+S, 'row': 0, 'column': 1, 'padx': 1, 'pady': 1}, 
    'three': {'sticky': W+E+N+S, 'row': 0, 'column': 2, 'padx': 1, 'pady': 1} 
} 
for b in buttons: 
    button = Button(frame, text=b.title(), command=self.callback) 
    button.grid(**buttons[b]) 
    setattr(self, b, button) 

यह आपको आवश्यक होने पर आसानी से नए बटन जोड़ने की अनुमति देगा।

संबंधित मुद्दे