2010-05-04 12 views
7

क्या किसी अन्य फ्रेम के अंदर टिंकर में बटनों का ग्रिड रखना संभव है?एक फ्रेम के भीतर ग्रिड?

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

इसे समझने के लिए:

O | X | X | 
---------- | 
O | O | X | Player 2 wins! 
---------- | 
X | O | X | 

टिक टैक पैर की अंगुली बोर्ड एक ग्रिड कि सभी बटन और 'खिलाड़ी 2 जीत' से बना है में एक फ्रेम के अंदर एक लेबल है।

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

संपादित करें: एक विचार था लेकिन जब मैं इसे चलाता हूं, कुछ भी नहीं होता है? अगर मैं फ्रेम बिट लेता हूं तो यह करता है। कोई विचार?

from Tkinter import * 

root = Tk() 

b = Button(root, text = "1") 
b.grid(row=1, column=3) 
b2 = Button(root, text = "2") 
b2.grid(row=1, column=4) 

f = Frame(root, bg = "red") 
f.pack(side=RIGHT) 

root.mainloop() 
+0

ऐसा कुछ भी नहीं होने का कारण यह है कि आप एक ही माता-पिता (b.grid() और f.pack() दोनों रूट ग्रिड को प्रभावित करते हैं, दोनों रूट विजेट को प्रभावित करते हैं)। यह सभी प्रकार के बुरे व्यवहार का कारण बन सकता है। एक कंटेनर के भीतर आपको केवल एक या दूसरे का उपयोग करना चाहिए। पूरी तरह से अपने आवेदन के भीतर आप उन्हें तब तक मिश्रित कर सकते हैं जब तक आप सीधे उसी कंटेनर में दोनों का उपयोग न करें। –

उत्तर

7

यह अंत में करने के लिए एक तरीका खोज निकाला:

from Tkinter import * 

root = Tk() 

f = Frame(root, bg = "orange", width = 500, height = 500) 
f.pack(side=LEFT, expand = 1) 

f3 = Frame(f, bg = "red", width = 500) 
f3.pack(side=LEFT, expand = 1, pady = 50, padx = 50) 

f2 = Frame(root, bg = "black", height=100, width = 100) 
f2.pack(side=LEFT, fill = Y) 

b = Button(f2, text = "test") 
b.pack() 

b = Button(f3, text = "1", bg = "red") 
b.grid(row=1, column=3) 
b2 = Button(f3, text = "2") 
b2.grid(row=1, column=4) 
b3 = Button(f3, text = "2") 
b3.grid(row=2, column=0) 

root.mainloop() 

एक फ्रेम के अंदर एक फ्रेम के अंदर ग्रिड होने काम कर ग्रिड के आसपास गद्दी पाने के लिए एक हैक का एक सा है, लेकिन यह तो मैं कर रहा हूँ काम करता है खुश।

+2

ग्रिड एक "चीज़" नहीं है, यह एक तरीका है कि विगेट्स फ्रेम के भीतर स्वयं को व्यवस्थित करने के लिए उपयोग करते हैं; ध्यान दें कि कोई 'ग्रिड' निर्मित नहीं है।यह संरचना का एक छोटा मॉडल है, यह टीएक्स के समान है जो खुद को प्रिंटिंग अनुभव के 500 वर्षों से लिया गया था। नेस्टेड बॉक्स वह तरीका है जिसे हमने टेक्स्ट-जैसी ऑब्जेक्ट्स की व्यवस्था करने के लिए पाया है: यह एक हैक नहीं है। – msw

+0

ग्रेट उत्तर = मुझे एक समस्या के साथ मदद मिली जो मैं दिनों से संघर्ष कर रहा हूं। – xxmbabanexx

1

आप विजेट्स को मनमाने ढंग से गहरा कर सकते हैं। Quoth manual:

किसी भी गुरु विजेट के आकार "गुलाम विगेट्स" अंदर के आकार से निर्धारित होता है। पैकर का उपयोग नियंत्रण पर किया जाता है जहां दास विगेट्स मास्टर के अंदर दिखाई देते हैं जिसमें वे पैक होते हैं। आप चाहें की तरह लेआउट प्राप्त करने के लिए आप फ्रेम में फ्रेम और अन्य फ्रेम, में फ्रेम पैक कर सकते हैं। इसके अतिरिक्त, व्यवस्था पर गतिशील रूप से समायोजित की जाती है कॉन्फ़िगरेशन में वृद्धि होने के बाद वृद्धिशील समायोजन को समायोजित करती है।

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

+0

क्या आप कह रहे हैं कि मैं जो पूछ रहा हूं वह संभव नहीं है? मुझे पता है कि मैं एक फ्रेम के भीतर एक फ्रेम डाल सकता हूं, लेकिन एक फ्रेम के भीतर एक ग्रिड रखना संभव होगा? – Sam

+1

@ सैम: आप "फ्रेम के अंदर ग्रिड नहीं डाल सकते" क्योंकि एक ग्रिड ऐसा कुछ नहीं है जिसे आप किसी भी तरह से रख सकते हैं। ग्रिड() विधि केवल एक कंटेनर में विजेट को बाहर रखती है। आप "ग्रिड जोड़ना" नहीं कर रहे हैं, आप केवल "ग्रिड पैटर्न में विजेट डालना" हैं। और, जैसा कि उत्तर कहता है, आप मनमाने ढंग से गहरे टेस्ट विजेट को घोंसला कर सकते हैं (हालांकि मेरे कई वर्षों के अनुभव में, आपको शायद ही कभी 3 या 4 से अधिक गहरी जाने की आवश्यकता है)। –

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