python - एक टिंकर फ़्रेम से दूसरे में फ़ंक्शन कॉल करना




function class (2)

मेरे पास एक पृष्ठ है जहां मैं कुछ ग्राहकों के विवरण दिखाऊंगा। इसलिए मैंने सभी लेबल के साथ "ग्राहकों का विवरण" नामक एक पेज बनाया, जिसकी मुझे आवश्यकता है और मैं इन लेबल के पाठ को चर के रूप में सेट करता हूं। बहुत बुरा यह काम नहीं करता है। लेबल __init__ विधि में बनाए गए हैं, इसलिए मैं उन्हें "अपडेट" नहीं कर सकता, क्योंकि यह केवल शुरुआत में कहा जाता है। इसलिए मैंने सोचा कि एक नया फ़ंक्शन बनाना है जिसमें सभी लेबल हैं और जब मुझे आवश्यकता हो तो मैं उस फ़ंक्शन को कॉल करूंगा ... यहाँ समस्या है। मैं दूसरे tk.Frame में फ़ंक्शन को कॉल करने में सक्षम नहीं tk.Frame । निम्नलिखित कोड कोड का एक सरलीकृत संस्करण है।

import tkinter as tk
from tkinter import ttk

class Myapp(tk.Tk):

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

        container = ttk.Frame(self, borderwidth=10, relief="sunken", width=200, height=100)
        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 (HomePage, PageOne):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="N,S,E,W")
        self.show_frame(HomePage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()


class HomePage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text="HomePage")
        label.pack()
        button1 = ttk.Button(self, text="Quit",
                            command=lambda: quit())
        button1.pack()
        button2 = ttk.Button(self, text="Call Function in the other page/class to show the label",
                            command=lambda: PageOne.function()) # this is to do it from an other class. I can't do this
        button2.pack()
        button3 = ttk.Button(self, text="Page One",
                            command=lambda: controller.show_frame(PageOne))
        button3.pack()


class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text="PageOne")
        label.pack()
        button1 = ttk.Button(self, text="Quit",
                            command=lambda: quit())
        button1.pack()
        button2 = ttk.Button(self, text="Call Function, in local it works..",
                            command=lambda: self.function())#this is to do it in local
        button2.pack()
        button3 = ttk.Button(self, text="HomePage",
                            command=lambda: controller.show_frame(HomePage))
        button3.pack()

    def function(self):
        label1 = ttk.Label(self, text="It Worked!")
        label1.pack()


app = Myapp()
app.mainloop()

आप GUI के उन क्षेत्रों के संदर्भों को सहेजने पर विचार कर सकते हैं, जिन्हें आपको अपडेट करने की आवश्यकता है, उदाहरण के लिए, आपके MyApp वर्ग में एक तानाशाही। इस तरह से आप कक्षा में कहीं से भी उन तक पहुँच सकते हैं, भले ही वास्तविक GUI तत्व को रखा जाए।

जीयूआई प्रोग्रामिंग आमतौर पर काफी गन्दा कक्षाएं पैदा करती है, तत्वों का ट्रैक रखने के लिए एक तानाशाह का उपयोग करने से गंदगी कम हो जाती है। दूसरों को बाद में उपयोग करने की आवश्यकता वाले प्रत्येक तत्व के लिए अलग-अलग वर्ग की विशेषताओं को रखना पसंद है।


किसी अन्य ऑब्जेक्ट पर एक विधि को कॉल करने के लिए, आपको ऑब्जेक्ट के संदर्भ की आवश्यकता है। विभिन्न पृष्ठों को प्रबंधित करने के लिए आपके द्वारा कॉपी किया गया कोड इस आसान को बनाने के लिए डिज़ाइन किया गया है, लेकिन यह पृष्ठ के उदाहरण को प्राप्त करने के लिए एक फ़ंक्शन को याद कर रहा है।

इसलिए, आपको लगता है कि नियंत्रक पर एक get_page विधि जोड़ने की जरूरत है:

class Myapp(tk.Tk):
    ...
    def get_page(self, page_class):
        return self.frames[page_class]

इसके साथ, आप पेज इंस्टेंस प्राप्त कर सकते हैं, और पेज इंस्टेंस के साथ आप विधि को कॉल कर सकते हैं।

अगला, आपको नियंत्रक को एक संदर्भ रखने की आवश्यकता है ताकि आप इसे अन्य कार्यों से बुला सकें:

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        self.controller = controller
        ...

अंत में, अब आप पृष्ठ प्राप्त करने के लिए नियंत्रक का उपयोग कर सकते हैं, और पृष्ठ के साथ आप फ़ंक्शन को कॉल कर सकते हैं।

मेरी सिफारिश है कि जब तक आपको इसकी पूरी आवश्यकता न हो, lambda उपयोग न करें और इस मामले में आप नहीं। जब आप lambda बजाय उचित कार्यों का उपयोग करते हैं तो अपने कोड को लिखना और डिबग करना बहुत आसान है।

उदाहरण के लिए:

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        ...
        button2 = ttk.Button(..., command=self.do_button)
        ...

    def do_button(self):
        page = self.controller.get_page(PageOne)
        page.function()






frame