2015-12-14 11 views
9

मेरे gui layouttkinter जीयूआई फ्रेम और ग्रिड

gui layout

का उपयोग कर लेआउट की तरह what I expect

what I expect

लगभग कुछ भी नहीं लग रहा है तो मुझे लगता है कुछ मूल बातें है कि मुझे समझ नहीं आता नहीं है।

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

आप केवल हरे रंग के फ्रेम के दाईं ओर प्रवेश फ़ील्ड में से एक देख सकते हैं। यह वहाँ क्यों जा रहा है?

from Tkinter import * 

root = Tk() 
root.title('Model Definition') 
root.resizable(width=FALSE, height=FALSE) 
root.geometry('{}x{}'.format(460, 350)) 

top_frame = Frame(root, bg='cyan', width = 450, height=50, pady=3).grid(row=0, columnspan=3) 
Label(top_frame, text = 'Model Dimensions').grid(row = 0, columnspan = 3) 
Label(top_frame, text = 'Width:').grid(row = 1, column = 0) 
Label(top_frame, text = 'Length:').grid(row = 1, column = 2) 
entry_W = Entry(top_frame).grid(row = 1, column = 1) 
entry_L = Entry(top_frame).grid(row = 1, column = 3) 
#Label(top_frame, text = '').grid(row = 2, column = 2) 

center = Frame(root, bg='gray2', width=50, height=40, padx=3, pady=3).grid(row=1, columnspan=3) 
ctr_left = Frame(center, bg='blue', width=100, height=190).grid(column = 0, row = 1, rowspan = 2) 
ctr_mid = Frame(center, bg='yellow', width=250, height=190, padx=3, pady=3).grid(column = 1, row=1, rowspan=2) 
ctr_right = Frame(center, bg='green', width=100, height=190, padx=3, pady=3).grid(column = 2, row=1, rowspan=2) 

btm_frame = Frame(root, bg='white', width = 450, height = 45, pady=3).grid(row = 3, columnspan = 3) 
btm_frame2 = Frame(root, bg='lavender', width = 450, height = 60, pady=3).grid(row = 4, columnspan = 3) 


root.mainloop() 

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

+0

अगर थोड़ा मदद मिलेगी दो छवियों एक ही रंग योजना का उपयोग करता है, तो आप कह रहे हैं कि नीले खिड़की वास्तव में भी तल पर होना चाहिए जब तक कि वे कर रहे हैं और हालांकि कोड बाईं ओर रखता है। –

उत्तर

14

मैं मान लिया है कि फ्रेम अपने स्वयं के 'ग्रिड अंतरिक्ष'

है शामिल एक सही धारणा।

आप हरे रंग के फ्रेम के दाईं ओर स्थित प्रविष्टि फ़ील्ड में से एक देख सकते हैं। यह वहाँ क्यों जा रहा है?

समस्या यहाँ शुरू होता है:

top_frame = Frame(root, ...).grid(row=0, ...) 

अजगर में, x = y().z() हमेशा .z() के परिणाम के x सेट हो जाएगा। top_frame = Frame(...).grid(...) के मामले में, grid(...) हमेशा None लौटाता है इसलिए top_frameNone होगा। यह हर विजेट का कारण बनता है जो आपको लगता है कि मूल रूप से रूट विंडो में जाने के लिए शीर्ष फ्रेम में जा रहा है।

समाधान अवलोकन

अंगूठे का एक सामान्य नियम के रूप आपको चाहिए कभी नहीं कॉल grid, pack या place एक ही बयान है कि विजेट बनाता है के भाग के रूप। आंशिक रूप से यह इस सटीक व्यवहार के लिए है जिसे आप अनुभव कर रहे हैं, लेकिन यह भी क्योंकि मुझे लगता है कि यह आपके कोड को लिखने में कठिन बनाता है और समय के साथ बनाए रखने में कठिन होता है।

विजेट निर्माण और विजेट लेआउट दो अलग-अलग चीजें हैं।मेरे अनुभव में, लेआउट समस्या काफी जब आप अपने लेआउट कमांड को एक साथ समूहित करते हैं तो डीबग करना आसान होता है।

इसके अलावा, आप लगातार जब ग्रिड का उपयोग कर और हमेशा एक ही क्रम में विकल्प रखें ताकि आप और अधिक आसानी से लेआउट कल्पना कर सकते हैं होना चाहिए। और आखिरकार, grid का उपयोग करते समय आपको sticky विकल्प निर्दिष्ट करने की आदत में होना चाहिए, और हमेशा प्रत्येक पंक्ति में एक पंक्ति और एक कॉलम को गैर-शून्य वजन दें।

समाधान उदाहरण

यहां बताया गया है कि मैं आपका कोड कैसे लिखूंगा। यह बहुत लंबा है, लेकिन समझने में बहुत आसान है।

from Tkinter import * 

root = Tk() 
root.title('Model Definition') 
root.geometry('{}x{}'.format(460, 350)) 

# create all of the main containers 
top_frame = Frame(root, bg='cyan', width=450, height=50, pady=3) 
center = Frame(root, bg='gray2', width=50, height=40, padx=3, pady=3) 
btm_frame = Frame(root, bg='white', width=450, height=45, pady=3) 
btm_frame2 = Frame(root, bg='lavender', width=450, height=60, pady=3) 

# layout all of the main containers 
root.grid_rowconfigure(1, weight=1) 
root.grid_columnconfigure(0, weight=1) 

top_frame.grid(row=0, sticky="ew") 
center.grid(row=1, sticky="nsew") 
btm_frame.grid(row=3, sticky="ew") 
btm_frame2.grid(row=4, sticky="ew") 

# create the widgets for the top frame 
model_label = Label(top_frame, text='Model Dimensions') 
width_label = Label(top_frame, text='Width:') 
length_label = Label(top_frame, text='Length:') 
entry_W = Entry(top_frame, background="pink") 
entry_L = Entry(top_frame, background="orange") 

# layout the widgets in the top frame 
model_label.grid(row=0, columnspan=3) 
width_label.grid(row=1, column=0) 
length_label.grid(row=1, column=2) 
entry_W.grid(row=1, column=1) 
entry_L.grid(row=1, column=3) 

# create the center widgets 
center.grid_rowconfigure(0, weight=1) 
center.grid_columnconfigure(1, weight=1) 

ctr_left = Frame(center, bg='blue', width=100, height=190) 
ctr_mid = Frame(center, bg='yellow', width=250, height=190, padx=3, pady=3) 
ctr_right = Frame(center, bg='green', width=100, height=190, padx=3, pady=3) 

ctr_left.grid(row=0, column=0, sticky="ns") 
ctr_mid.grid(row=0, column=1, sticky="nsew") 
ctr_right.grid(row=0, column=2, sticky="ns") 

root.mainloop() 

परिणाम:

screenshot of running example

+0

वाहू - कई, बहुत धन्यवाद। मैं ध्यान से समीक्षा करूंगा। मैं रंग योजना टिप्पणी के साथ सहमत हूं, मैंने पर्याप्त ध्यान नहीं दिया। – shawn

2

variable = Widget(...).grid() चर को None प्रदान करती है क्योंकि grid()/pack()/place() वापसी None

उपयोग

variable = Widget(...) 
variable.grid() # .pack() .place() 
संबंधित मुद्दे