GUI

2010-11-01 15 views
15

में पाइथन टिंकर एम्बेड मैटलप्लिपिब मैं पाइथन में कोडित मेरे टिंकर जीयूआई में एक साजिश एम्बेड करने की कोशिश कर रहा हूं। मेरा मानना ​​है कि नीचे दिया गया कोड बस एक कैनवास में ग्राफ डालने में सफल होता है, लेकिन मेरे पास जीयूआई ग्रिड के भीतर कैनवास स्थान का कोई नियंत्रण नहीं है। मैं अपने जीयूआई का उपखंड होना चाहता हूं साजिश ... पूरी तरह से नहीं। मैं इस कैनवास विजेट को कैसे स्थापित कर सकता हूं?GUI

#!/usr/apps/Python/bin/python 
import matplotlib, sys 
matplotlib.use('TkAgg') 
from numpy import arange, sin, pi 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 
from Tkinter import * 

master = Tk() 
master.title("Hello World!") 
#------------------------------------------------------------------------------- 

f = Figure(figsize=(5,4), dpi=100) 
a = f.add_subplot(111) 
t = arange(0.0,3.0,0.01) 
s = sin(2*pi*t) 
a.plot(t,s) 


dataPlot = FigureCanvasTkAgg(f, master=master) 
dataPlot.show() 
dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1) 
#------------------------------------------------------------------------------- 
master.mainloop() 
+2

पूरी तरह से असंबंधित नोट पर आपकी पोस्ट 'matplotlib.figure.Figure' को लागू करने के तरीके को सीखने के लिए मेरे प्रोग्राम को काम करने के लिए बहुत उपयोगी थी। धन्यवाद। – deadstump

उत्तर

21

आपके पास कोई अन्य विजेट नहीं है इसलिए यह जानना मुश्किल है कि आप अन्य विजेट कहां चाहते हैं। यहां मैं आपको बता सकता हूं कि: dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1) करके आप टिंकर को साजिश के साथ स्क्रीन भरने के लिए कह रहे हैं। यह, क्योंकि आप इसे सभी दिशाओं (fill=BOTH) भरने के लिए कहते हैं और किसी अतिरिक्त स्थान को भरने के लिए विस्तारित करते हैं (expand=1)।

हालांकि, आप अभी भी अन्य विजेट जोड़ सकते हैं। pack एक कंटेनर के एक तरफ विजेट डालने से काम करता है। आपका कंटेनर, master, हमेशा चार पक्ष होते हैं। तो, उदाहरण के लिए, यदि आप एक उपकरण पट्टी आप की तरह कुछ करना होगा बनाना चाहता था:

toolbar = tk.Frame(master) 
button = tk.Button(toolbar, text="Push me") 
button.pack(side="left") # left side of parent, the toolbar frame 
toolbar.pack(side=TOP, fill="x") # top of parent, the master window 

सूचना है कि यदि आप कोड के बाद इस कोड डाल जहां pack साजिश, उपकरण पट्टी ऊपर तल पर पता चलता ! ऐसा इसलिए है क्योंकि TOP, BOTTOM, आदि किसी अन्य विजेट द्वारा छोड़े गए स्थान का संदर्भ लें जो पहले से ही pack ed है। साजिश ऊपर ले जाती है, नीचे की जगह नीचे की जगह है। इसलिए जब आप TOP निर्दिष्ट करते हैं तो इसका अर्थ यह है कि "जो भी पहले से ऊपर है, नीचे दिए गए क्षेत्र के शीर्ष पर"।

तो, आपके पास कुछ विकल्प हैं। सबसे अच्छा विकल्प है कि आप अपने विजेट को उस क्रम में बनाना चाहते हैं, जिसे आप दिखाना चाहते हैं। यदि आप packpack प्लॉट से पहले शीर्ष पर टूलबार हैं, तो यह टूलबार होगा जो बहुत ऊपर दिखाई देता है। इसके अलावा, आप शीर्ष के बजाय साजिश को नीचे रख सकते हैं और इससे भी समस्या हल हो जाएगी।

वैसे, मैं आम तौर पर एक ब्लॉक में अपने विजेट बना देता हूं, फिर उन्हें एक अलग ब्लॉक में रखता हूं। मुझे लगता है कि यह कोड को बनाए रखने में आसान बनाता है।

एक अन्य विकल्प है जो आपके मानसिक मॉडल बेहतर फिट हो सकता grid बजाय pack है। grid के साथ आप विजेट (पंक्तियों) और स्तंभ (ओं) चुन सकते हैं जो विजेट पर कब्जा करते हैं। यह चीजों को ग्रिड में रखना आसान बनाता है, लेकिन थोड़ा और कोड उपयोग करने के खर्च पर।

उदाहरण के लिए, सबसे ऊपर टूलबार और साजिश नीचे डाल करने के लिए नीचे दिए गए आप क्या कर सकते हैं:

toolbar.grid(row=1, column=1, sticky="ew") 
dataPlot.get_tk_widget().grid(row=1, column=1, sticky="nsew") 
master.grid_rowconfigure(0, weight=0) 
master.grid_rowconfigure(1, weight=1) 
master.grid_columnconfigure(0, weight=1) 

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

अधिक जानकारी के लिए this page on grid, और this page on pack देखें।