मेरे एमवीसी-एप्लिकेशन में मैं एक एक्सएमएल फ़ाइल से डेटा लोड करना चाहता हूं और इसे एक पैन विंडो में दो अलग-अलग दृश्यों में दिखाना चाहता हूं। बाएँ फलक में मैं डेटा को tk.ttk.Treeview में प्रदर्शित करना चाहता हूँ। दाएँ फलक में मैं डेटा को tk.tkk.Canvas में प्रदर्शित करना चाहता हूँ।

मुख्य आवेदन:

from lscController import Controller

if __name__ == '__main__':
    c = Controller()
    c.run()

नियंत्रक:

try:
    import Tkinter as Tk # python 2
except ModuleNotFoundError:
    import tkinter as Tk # python 3

from lscView import LSCGUI

class Controller:
    def __init__(self):
        self.root = Tk.Tk()
        self.model = LSCDocument('name')
        self.view = LSCGUI(self.root, self.model)

    def run(self):
        self.root.title("MVC Charts")
        self.root.deiconify()
        self.root.mainloop(

फ़ाइल lscTreeView.py:

class LSCTree():
    def __init__(self, window,model):
        super().__init__()
        frame = tk.Frame(window)
        frame.pack()

मैं lscView.py फ़ाइल में PanedWindow के बाएं फलक में दृश्य जोड़ना चाहता हूं:

class LSCGUI():
    def __init__(self, window, model):
        super().__init__()
        self.window = window
        self.window.title("Model")
        self.model = model
        ''' Full Screen Or not '''
        self.window.attributes('-fullscreen',False)
        self.window.geometry('800x600')


        ''' ________Frame as paned windows (left / right)________ '''
        pwstyle = tk.ttk.Style()
        pwstyle.configure('TPanedwindow ', foreground='green')
        self.frame = tk.ttk.PanedWindow(style='TPanedwindow',orient=tk.VERTICAL)
        self.frame.pack(fill=tk.BOTH, expand=True)
        self.treeview=TREE.LSCTree(self.frame,model)
        self.frame.add(self.treeview)

और यह त्रुटि प्राप्त करें:

_tkinter.TclError: bad window path name "<lscTreeView.LSCTree object at 0x00000222D62B5910>"

वीएस कोड कहता है कि त्रुटि यहाँ है: self.frame.add(self.treeview)

1
aeb 26 सितंबर 2020, 17:44

1 उत्तर

सबसे बढ़िया उत्तर

यहां, आप एक फ़ंक्शन के लिए self.treeview पास कर रहे हैं जिसके लिए एक तर्क के रूप में एक विजेट की आवश्यकता होती है:

self.frame.add(self.treeview)

यह वह जगह है जहाँ आप self.treeview को परिभाषित करते हैं:

self.treeview=TREE.LSCTree(self.frame,model)

यह LSCTree की परिभाषा है:

class LSCTree():
    def __init__(self, window,model):
        ...

LSCTree स्पष्ट रूप से एक विजेट नहीं है। आप पैन्डविंडो में गैर-विजेट नहीं जोड़ सकते।

सबसे अच्छा समाधान यह होगा कि LSCTree को Frame से इनहेरिट किया जाए ताकि इसे एक फ्रेम के रूप में LSCTree की विशेषता के रूप में उपयोग करने के बजाय एक विजेट के रूप में माना जा सके।

class LSCTree(tk.Frame):
    def __init__(self, window,model):
        super().__init__(window)
        ...
        self.tree = ttk.Treeview(self, ...)
        ...
0
Bryan Oakley 26 सितंबर 2020, 18:57