2012-12-18 10 views
6

मैं ttk/tkinter का उपयोग कर एक मूल जीयूआई बनाने की कोशिश कर रहा हूं।पायथन और टीटीके लेबल का उपयोग फ्रेम फ्रेम को साफ करने के लिए फ्रेम

मैं एक एक बुनियादी जीयूआई सही बुनियादी घटक है कि बाहर की साजिश रची है, लेकिन जब मैं कोशिश करते हैं और/यह अंतरिक्ष बाहर यह सुंदर बनाना है, मैं अच्छी तरह से खेलने के लिए टीटीके कंटेनर होने का मेरी सीमा ... तक पहुँचने हूँ

उदाहरण:

from Tkinter import * 
import ttk 

class MakeGUI(object): 
    def __init__(self,root): 
     self.root = root 
     self.root.title("Text Comparitor") 
     ## build frame 
     self.mainframe = ttk.Frame(self.root, padding="3 3 12 12") 
     self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
     self.mainframe.columnconfigure(0, weight=1) 
     self.mainframe.rowconfigure(0, weight=1) 
     self.mainframe.pack() 
     ## text labels 
     ttk.Label(self.mainframe, text="Conversion Truth Tester", font=("Helvetica", 32)).grid(column=1, row=1, sticky=E) 
     self.mainframe.pack(side="bottom", fill=BOTH, expand=True) 
     self.mainframe.grid() 
     ttk.Label(self.mainframe, text="Source Filename:").grid(column=1, row=2, sticky=W) 
     ttk.Label(self.mainframe, text="Source Text:").grid(column=1, row=3, sticky=W) 
     ttk.Label(self.mainframe, text="Converted Text:").grid(column=1, row=4, sticky=W) 
     ttk.Label(self.mainframe, text="Cleaned Source:").grid(column=1, row=5, sticky=W) 
     ttk.Label(self.mainframe, text="Cleaned Converted:").grid(column=1, row=6, sticky=W) 
     ttk.Label(self.mainframe, text="Details:").grid(column=1, row=7, sticky=W) 
     ## buttons 
     self.close = ttk.Button(self.mainframe, text="Close",command=self.closeFrame).grid(column=1, row=9, sticky=SE) 
     self.next = ttk.Button(self.mainframe, text="Next",command=self.nextPara).grid(column=1, row=9, sticky=S) 
     self.next = ttk.Button(self.mainframe, text="Prev",command=self.prevPara).grid(column=1, row=9, sticky=SW) 

    def closeFrame(self): 
     self.root.destroy() 

    def nextPara(self): 
     pass 

    def prevPara(self): 
     pass 

def main(): 
    root = Tk() 
    makeGUI = MakeGUI(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

कौन सा में परिणाम: http://imgur.com/a/CwpCU#0

मैं एक 2 कंटेनर वस्तु, पाठ लेबल वस्तुओं धारण करने के लिए एक लेबल फ्रेम, जो बटन आगे बढ़ने में परिणाम जोड़ने की कोशिश कर रहा है (और इसलिए मुझे लगता है कि मैं खुद को संदर्भित नहीं कर रहा हूं ग्रिड ठीक से में टहनी:

from Tkinter import * 
import ttk 

class MakeGUI(object): 
    def __init__(self,root): 
     self.root = root 
     self.root.title("Text Comparitor") 
     ## build frame 
     self.mainframe = ttk.Frame(self.root, padding="3 3 12 12") 
     self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
     self.mainframe.columnconfigure(0, weight=1) 
     self.mainframe.rowconfigure(0, weight=1) 
     self.mainframe.pack() 
     ## text labels 
     ttk.Label(self.mainframe, text="Conversion Truth Tester", font=("Helvetica", 32)).grid(column=1, row=1, sticky=E) 
     self.lfdata = ttk.Labelframe(self.root, labelwidget=self.mainframe, text='Label')# 
     self.lfdata.grid() 
     ttk.Label(self.lfdata, text="Source Filename:").grid(column=1, row=2, sticky=W) 
     ttk.Label(self.lfdata, text="Source Text:").grid(column=1, row=3, sticky=W) 
     ttk.Label(self.lfdata, text="Converted Text:").grid(column=1, row=4, sticky=W) 
     ttk.Label(self.lfdata, text="Cleaned Source:").grid(column=1, row=5, sticky=W) 
     ttk.Label(self.lfdata, text="Cleaned Converted:").grid(column=1, row=6, sticky=W) 
     ttk.Label(self.lfdata, text="Details:").grid(column=1, row=7, sticky=W) 

     ## buttons 
     self.close = ttk.Button(self.mainframe, text="Close",command=self.closeFrame).grid(column=1, row=9, sticky=SE) 
     self.next = ttk.Button(self.mainframe, text="Next",command=self.nextPara).grid(column=1, row=9, sticky=S) 
     self.next = ttk.Button(self.mainframe, text="Prev",command=self.prevPara).grid(column=1, row=9, sticky=SW) 

    def closeFrame(self): 
     self.root.destroy() 

    def nextPara(self): 
     pass 

    def prevPara(self): 
     pass 

def main(): 
    root = Tk() 
    makeGUI = MakeGUI(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

कौन सा में परिणाम: http://imgur.com/a/CwpCU#1 नोट बटन अब्द लेबल के बीच पदों की अदला-बदली, और labelframe के बारे में दिखाई पहलुओं।

मैं दूसरे संस्करण को 'लुक' करने के लिए पहले के एक सुंदर संस्करण की तरह कोशिश कर रहा हूं।

कोई भी पॉइंटर्स - मैं विभिन्न संसाधनों/दस्तावेज़ों के आसपास पढ़ रहा हूं, और मेरे उदाहरण को फिट करने वाली कुछ भी नहीं मिल सकती है (सबसे अधिक संभावना है - मैं कुछ मूर्खतापूर्ण कर रहा हूं ...) और मैंने जो कुछ भी कोशिश नहीं की है अभी तक काम किया - pack(), grid() और अन्य संबंधित उदाहरणों में मुझे मिले अन्य स्निपेट्स सहित।

+0

यह ग्रिड का उपयोग नहीं करने के लिए बेहतर है और एक खिड़की में पैक करें। मैं ग्रिड पसंद करते हैं। इसके अलावा मुझे लगता है कि बटन चर (डिफ़ॉल्ट ग्रिड के साथ) आप जो अपेक्षा करते हैं उसे स्टोर नहीं करेंगे। जहां तक ​​मुझे याद है, ग्रिड वस्तु के संदर्भ को वापस नहीं लौटाता है। – Gonzo

+0

@ फ़ेलिक्स _Tkinter_ विजेट एक ही विंडो के भीतर विभिन्न ज्यामिति प्रबंधकों का उपयोग कर सकते हैं ** जब तक वे एक ही माता-पिता ** साझा नहीं करते हैं। _pack_ कम कोड वाले कुछ चीजें पूरा कर सकता है; इसलिए मैं केवल _grid_ का उपयोग करने की अनुशंसा नहीं करता। –

उत्तर

10

ऐसे कई स्थान हैं जिन्हें समायोजन की आवश्यकता है, हम उन पर टिप्पणी करें (मैं शायद कुछ भूल जाऊंगा, इसलिए नीचे कोड को जांचना सुनिश्चित करें)।

सबसे पहले, अकेले फ्रेम में कॉलम/पंक्तियों के वजन को लागू करने से आप खिड़की का आकार बदलने के साथ विस्तार नहीं कर पाएंगे। आपको root में ऐसा करने की आवश्यकता है। इसके बाद आप आकार बदलने के बाद लेआउट के बारे में अपनी अपेक्षाओं से मेल खाने के लिए फ्रेम में ऐसा करना चाहेंगे। आपके मामले में, प्रत्येक कॉलम में वही वज़न कम करने के लिए सबसे अधिक समझदारी होती है> 0 और केवल दूसरी पंक्ति को वजन> 0 बनाना है। कॉलम के लिए तर्क यह है कि आपके पास 3 बटन हैं, और आप चाहते हैं कि वे सभी विस्तार करें उसी तरह से मुक्त जगह। दूसरे भाग के लिए, यह एक प्रत्यक्ष अवलोकन है कि आपके पास दूसरी पंक्ति पर Labelframe है। किसी अन्य पंक्ति के लिए वजन> 0 देना आपको एक बहुत ही अजीब लेआउट देने जा रहा है। वजन घटाने के मुद्दों।

अगली बात मैंने देखा एक बड़ा फ़ॉन्ट वाला आपका शीर्ष लेबल था। आप निश्चित रूप से इसे 3 कॉलम तक फैलाना चाहते हैं (फिर से, यह संख्या 3 बाद में बनाए गए बटनों की पंक्ति से संबंधित है)। आप इन 3 कॉलम में टेक्स्ट को केंद्रित भी कर सकते हैं (मुझे आपकी वरीयताओं के बारे में निश्चित नहीं है)।

अब Labelframe आप बनाते हैं। यह सिर्फ गलत है, labelwidget विकल्प का मतलब यह नहीं है कि आप क्या सोचते हैं। यह इस लेबल फ्रेम के लिए लेबल के रूप में कार्य करने के लिए Label विजेट निर्दिष्ट करता है। इस प्रकार, इस पैरामीटर के लिए अपना मुख्य फ्रेम निर्दिष्ट करना कोई समझ नहीं आता है। हो सकता है कि आप लेबल फ्रेम में किसी निश्चित स्थिति पर दिखाई देने के लिए कुछ टेक्स्ट निर्दिष्ट करना चाहते हैं। साथ ही, इस लेबल फ्रेम को 3 के कॉलमैन के साथ भी वर्गीकृत किया जाना चाहिए।

सामान्य रूप से "gridding" के लिए मैं in_ विकल्प निर्दिष्ट करने की अनुशंसा करता हूं, ताकि आप "ग्रिंग" के विजेट के संबंध में स्पष्ट कर सकें। इसके साथ ही, जब भी आप अपने विजेट पेरेंटिंग स्तर को गहरा करते हैं, तो column=0, row=0 पर शुरू होना स्पष्ट हो जाता है।

यहाँ कैसे मैं अपने कोड समायोजित है:

import Tkinter 
import ttk 

class MakeGUI(object): 
    def __init__(self,root): 
     self.root = root 
     self.root.title(u"Title") 
     ## build frame 
     self.mainframe = ttk.Frame(self.root, padding=(6, 6, 12, 12)) 
     self.mainframe.grid(sticky='nwse') 
     for column in range(3): 
      self.mainframe.columnconfigure(column, weight=1) 
     self.mainframe.rowconfigure(1, weight=1) 

     ## text labels 
     ttk.Label(self.mainframe, text=u"Label Title", anchor='center', 
       font=("Helvetica", 32)).grid(in_=self.mainframe, 
         column=0, row=0, columnspan=3, sticky="ew") 

     self.lfdata = ttk.Labelframe(self.mainframe, padding=(6, 6, 12, 12), 
       text='Labelframe') 
     self.lfdata.grid(column=0, columnspan=3, row=1, sticky='nsew') 
     info = (u"Source Filename", u"Source Text", u"Converted Text", 
       u"Cleaned Source", u"Cleaned Converted", u"Details") 
     for i, item in enumerate(info): 
      ttk.Label(self.lfdata, text=u"%s:" % item).grid(in_=self.lfdata, 
        column=0, row=i, sticky='w') 

     ## buttons 
     btn = (u"Close", u"Next", u"Prev") 
     for i, item in enumerate(btn): 
      ttk.Button(self.mainframe, text=item).grid(in_=self.mainframe, 
        column=i, row=3) 

def main(): 
    root = Tkinter.Tk() 
    root.columnconfigure(0, weight=1) 
    root.rowconfigure(0, weight=1) 
    makeGUI = MakeGUI(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

यहाँ यह कैसा दिखाई देता है जब कार्यक्रम शुरू होता है और कुछ का आकार बदलने के बाद:

enter image description hereenter image description here

+1

वाह। यह करने के लिए आपका बहुत धन्यवाद। मैं इस पर पोकिंग कर रहा हूं, और मेरी कुछ त्रुटियों को समझ लिया है, लेकिन आपने वास्तव में यह समझने में मेरी मदद की है कि यह कैसे काम करता है। मैं सच में आपके समय की सराहना करता हूँ। –