2015-12-15 6 views
5

मैं अपने स्वयं को सिखाने की कोशिश कर रहा हूं कि टिंकर का उपयोग कैसे करें और मुझे यूट्यूब के माध्यम से एक उपयोगी कोड मिला है कि मैं वास्तव में पूरी तरह से समझ नहीं पा रहा हूं। अगर मैं इसे समझने में मदद कर सकता हूं तो इसकी सराहना करेंगे। बातें मैं के साथ समझ में नहीं आया **टिंकर! फ्रेम को स्विच करने के तरीके को समझना

import tkinter as tk # why not from tkinter import? ** 

class SampleApp(tk.Tk): tk.TK** 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     # the container is where we'll stack a bunch of frames 
     # on top of each other, then the one we want visible 
     # will be raised above the others 

     container = tk.Frame(self) * 
     container.pack(side="top", fill="both", expand=True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 
     for F in (StartPage, PageOne, PageTwo): 
      page_name = F.__name__ 
      frame = F(container, self) ** 
      self.frames[page_name] = frame ** 

      # put all of the pages in the same location; 
      # the one on the top of the stacking order 
      # will be the one that is visible. 
      frame.grid(row=0, column=0, sticky="nsew") 

     self.show_frame("StartPage") 

    def show_frame(self, page_name): 
     '''Show a frame for the given page name''' 
     frame = self.frames[page_name] 
     frame.tkraise() ** 


class StartPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) ** 
     self.controller = controller ** 
     label = tk.Label(self, text="This is the start page", 
         font=TITLE_FONT) 
     label.pack(side="top", fill="x", pady=10) 

     button1 = tk.Button(self, text="Go to Page One", 
          command=lambda: controller.show_frame("PageOne")) 
     button2 = tk.Button(self, text="Go to Page Two", 
          command=lambda: controller.show_frame("PageTwo")) 
     button1.pack() 
     button2.pack() 
+0

क्या आप यूट्यूब लिंक साझा कर सकते हैं? –

+0

@ ब्रायन ओकले यदि आप अभी भी देख रहे थे, तो मैंने [यह] (https://www.youtube.com/watch?v=jBUpjijYtCk) ट्यूटोरियल देखा है जो [मूल प्रश्न] से आपके कोड का उपयोग करता है (http: // stackoverflow.com/a/7557028/3826759), हालांकि वह कहता है कि यह कहां से आया था। यह भी है [यह] (https://pythonprogramming.net/plotting-live-bitcoin-price-data-tkinter-matplotlib/)। –

+0

@double_j: हाँ, मैंने इसे थोड़ी देर पहले पाया, लेकिन धन्यवाद। मैंने आपके द्वारा प्रदान किया गया अन्य लिंक नहीं देखा था। मैंने मूल उत्तर में सुधार किया ताकि मैं बता सकूं कि मेरे कोड के साथ किसने शुरुआत की और उस वीडियो ट्यूटोरियल के साथ किसने शुरुआत की। उस कोड ने अपने जीवन पर लिया है, यह कई नौसिखिया प्रश्नों में दिखाई देता है। –

उत्तर

13
import tkinter as tk # why not from tkinter import? ** 

क्यों from tkinter import * नहीं चिह्नित? क्योंकि ऐसा करने का गलत तरीका है। Global imports are bad। टिंकर ट्यूटोरियल कुछ कारणों से गलत तरीके से ऐसा करते हैं जिन्हें मैं समझ नहीं पा रहा हूं।

as tk भाग का कारण यह है कि आप Tkinter.Frame के बजाय tk.Frame कर सकते हैं, जिससे कोड टाइप करने में थोड़ा आसान हो और थोड़ा आसान पढ़ने के लिए। यह पूरी तरह से वैकल्पिक है।

class SampleApp(tk.Tk): 

टीके आयात किए गए टिंकर मॉड्यूल का नाम है। Tk उस मॉड्यूल में एक वर्ग का नाम है जो रूट विंडो का प्रतिनिधित्व करता है। प्रत्येक tkinter अनुप्रयोग में एक ही रूट खिड़की होना चाहिए। इसे SampleApp के अंदर रखकर, यह इस विजेट का उप-वर्ग बनाता है - एक प्रति जिसमें अतिरिक्त सुविधाएं हैं।

tk.Tk से प्राप्त करना आवश्यक नहीं है। आप tk.Frame, किसी भी अन्य टिंकर विजेट, या यहां तक ​​कि object से प्राप्त कर सकते हैं। यह एक व्यक्तिगत वरीयता है। पसंद कुछ चीजों को आसान बनाता है, कुछ चीजें कठिन होती हैं।

container = tk.Frame(self) 

ऊपर एक Frame विजेट है, जो अन्य "पृष्ठ" के लिए एक कंटेनर के रूप में इस्तेमाल किया जाएगा का एक उदाहरण बनाता है। इन "पृष्ठों" को इस कंटेनर में एक दूसरे के शीर्ष पर रखा जाएगा।

frame = F(container, self) 

F लूप चर है। लूप कक्षाओं की एक सूची पर फिर से चल रहा है, इसलिए प्रत्येक बार लूप F के माध्यम से एक वर्ग का प्रतिनिधित्व किया जाएगा। F(...) कक्षा का एक उदाहरण बनाता है। इन कक्षाओं (StartPage, PageOne, PageTwo) सभी दो पैरामीटर की आवश्यकता होती है: एक विजेट है कि इस वर्ग के माता पिता हो जाएगा, और एक वस्तु है कि होगा एक नियंत्रक (एक शब्द यूआई गपशप मॉडल/देखें/नियंत्रक से उधार के रूप में सर्वर)।

कोड की रेखा कक्षा का एक उदाहरण बनाता है (जो स्वयं Frame विजेट का उप-वर्ग है), और अस्थायी रूप से स्थानीय चर frame पर फ्रेम असाइन करता है।

दूसरे ("नियंत्रक") पैरामीटर के रूप में self पास करके, ये नए वर्ग के उदाहरण SampleApp क्लास ऑब्जेक्ट में विधियों को कॉल करने में सक्षम होंगे।

self.frames[page_name] = frame 

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

इस प्रकार show_frame विधि कक्षा के नाम से वास्तविक पृष्ठ विजेट निर्धारित कर सकती है।

frame.tkraise() 

लगभग सभी जीयूआई उपकरणकिटें में - tkinter शामिल - एक "stacking आदेश" की धारणा है: जिस क्रम में बातें खड़ी दिखती हैं। कुछ टूलकिट इसे ज़ेड-ऑर्डर कह सकते हैं। यदि दो या दो से अधिक विगेट्स एक-दूसरे के शीर्ष पर खड़े होते हैं (जो यह कोड सभी पृष्ठों को एक ही पंक्ति और कॉलम में डालकर करता है), स्टैक के शीर्ष पर मौजूद विजेट वह विजेट है जो आम तौर पर दिखाई देगा।

tkraiseFrame ऑब्जेक्ट का एक तरीका है जो फ्रेम को स्टैकिंग ऑर्डर के शीर्ष पर बढ़ाएगा। कोड की इस पंक्ति में, frame पृष्ठों में से एक के एक विशेष उदाहरण को संदर्भित करता है।

tk.Frame.__init__(self, parent) 

क्योंकि प्रत्येक पेज एक tk.Frame वर्ग का एक उपवर्ग है, यह माता पिता के वर्ग के निर्माता कहते हैं। वास्तविक फ्रेम विजेट बनाने वाली सभी आंतरिक संरचनाओं को आरंभ करना आवश्यक है। हालांकि Frame कई विकल्प ले सकते हैं, यह कोड केवल एक में भेजने का विकल्प चुनता है - एक अन्य विजेट का संदर्भ जो इस नए विजेट के माता-पिता के रूप में कार्य करना है।

self.controller = controller 

ऊपर कोड बस controller चर जिसमें पारित किया गया था का मान "याद" है। इस मामले में, controller अनुप्रयोग है। इसे सहेजकर, यह कक्षा SampleApp ऑब्जेक्ट पर विधियों को कॉल कर सकती है।


नोट: https://stackoverflow.com/a/7557028/7432: प्रश्न में कोड एक ट्यूटोरियल है कि इस सवाल का जवाब से कोड कॉपी से आया है। मैं उस मूल कोड का लेखक हूं, लेकिन ट्यूटोरियल के लेखक नहीं हूं। उस मूल उत्तर में इस कोड से संबंधित अन्य प्रश्नों के लिंक हैं।

+0

आपको बहुत बहुत धन्यवाद! आप नहीं जानते कि इससे मुझे कितना मदद मिली! – Baller

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