Re: Trouble calling method from one class to another class
john fabiani <[email protected]> Sun, 25 Apr 2021 20:31:25 -0700
| Newsgroups | gmane.comp.python.wxpython |
|---|---|
| Message-ID | <[email protected]> |
I decided to see why you are getting the error - so I ran the program on windows 10 python 3.8. And sure enough the error appeared but it did not stop the program from running. I'm going to make a wild guess and suggest that because the program is not structured well that is causing some issues with python on windows. The error does NOT appear on my Linux box. That said, everything I said still applies. Johnf On 4/25/21 7:02 PM, RF wrote: > (1) I added os.getcwd() > > (2) I modified self.tab_num per my understanding of your explanation. > > (3) I added: frame.add_tab_page() but it gives the error: NameError: > name 'frame' is not defined. > How would class MyTreeCtrl know about 'frame'? Do I have to pass it in > as a parameter? > > (4) zip file attached as v4.3 > > Thank you... > > On Sunday, April 25, 2021 at 1:58:34 PM UTC-7 johnf wrote: > > I guess I confused you. The self.tab_num within the class > constructor/def is just fine. Recall I would not do that. I would > have initialized a counter outside of my class. > > CoreFrame is a class constructor or a definition of some object. > It is NOT the object! You defined the var within the class > constructor and it will work. Therefore any instance of the class > CoreFrame will contain the var tab_num and the start value is one > (1). The only instance of CoreFrame is named "frame" in your > code. 'frame' is the object and it contains a var tab_num. This > happens when you do: > > frame = CoreFrame() frame is now an object as described by the > class constructor CoreFrame. You did that in "__main__". > > An easy fix to your current code "tab_num" issue would be to use > > self.tab_num = 1 in the CoreFrame->__init__ > > and in your class MyTreeCtrl to use > > frame.add_tab_page() and NOT CoreFrame.add_tab_page(CoreFrame) in > the on_tree_single_click method. > > Just because it is an easy fix does mean it is good code - I don't > think it is. > > Also make it easier for others to test your code by at least not > hard coding a path to some file structure on your computer - maybe > use os.getcwd() > > Johnf > > > > > > > On 4/25/21 11:32 AM, RF wrote: >> Thank you John for your comments. One at a time if I may. >> >> > The "tab_num" has some logic issues ... >> >> Well, I changed line 67: self.tab_num = 1 >> to >> frame.tab_num = 1 >> and got: NameError: name 'frame' is not defined. >> >> I'm thinking about this one...I must not have understood you >> correctly...the instance was created in line 95 and must not be >> 'global' since line 67 is complaining about it. >> >> I'm attaching my current pyCore4.py file as pyCore4.2.py >> <http://pyCore4.2.py> (zipped). Line 67 is the only change: >> frame.tab_num = 1 >> >> On Saturday, April 24, 2021 at 5:36:19 PM UTC-7 johnf wrote: >> >> Python code has default values. In this case you don't have >> to pass any parameters to init the class for it to create an >> instance of the class. Of course at some point those values >> will be needed. That said, your code is needs the parameters: >> >> super().__init__(parent, id = id, pos= position, size = size, >> style=style) >> >> You are subclassing the wx.TreeCtrl class and you need to >> pass those parameters. In the case of the Geeksforgeeks code >> they created an instance of the wx.TreeCtrl class directly >> (you could have also done the same). They passed the >> parameters that were needed for their project and wxPython >> defaulted the rest. BTW I'm not sure but I bet the >> underlining c++ code has multi-def of the code to allow >> passing all the parameters - all, some or none. >> >> The "tab_num" has some logic issues. In the instance of the >> CoreFrame you create a var "self.tab_num" with the value of >> one (1). But what is the name of the CoreFrame instance? >> You named it "frame". Therefore, any time you want to >> determine value of "tab_num" you would NOT use the following: >> >> CoreFrame.tab_num >> >> you would use >> >> frame.tab_num. >> >> Why" Because the class name is CoreFrame and it is not the >> instance of the class. The instance of the class is 'frame". >> >> BTW in general I never do as you did above. Adding the var >> and allowing it to increment within the instance will only >> apply to the one instance in this case "frame". The moment >> you create a second instance of CoreFrame the value of >> "tab_num" will start over. Of course maybe that is what you >> wanted. >> >> Also in your "add_tab_page" method you set yourself to fail. >> It only works the first time. When you call from outside the >> instance there is no self.tab_num. >> >> I'll let you think about how to fix that - there several ways! >> >> Johnf >> >> >> >> >> >> On 4/24/21 4:32 PM, RF wrote: >>> John, thank you for those comments. I've looked at the >>> __init__ docs and have adjusted accordingly. >>> >>> One comment re the TreeCtrl __init__: I see in some examples >>> I have looked at that they don't include all the parameters >>> and their code runs without giving any errors. For example, >>> this website: >>> https://www.geeksforgeeks.org/wxpython-treectrl/ >>> <https://www.geeksforgeeks.org/wxpython-treectrl/> >>> >>> I don't understand why their codding example runs without >>> error as they have omitted the style, validator and name. In >>> any event, I followed your advice and patterned my __init__ >>> after the options shown in the docs. However, I did make one >>> exception: I omitted the TreeCtrl validator argument as I >>> don't think I need it in the __init__. The line seems to >>> execute OK without and I still am not sure it's optional as >>> the __init__ docs show it in there. So I guess it is >>> optional? Geeksforgeeks omitted three of the arguments and I >>> didn't get any errors when I ran their example code. >>> >>> I'm attaching pyCode4.py as the update with my changes >>> (based on your comments). >>> >>> > At this point I stopped because the GUI opened and I'm not >>> sure what you are trying to d. >>> At this point, I am just trying to execute the file without >>> getting the error: AttributeError: type object 'CoreFrame' >>> has no attribute 'tab_num' on line 78. >>> Then I want to click on any tree node just to fire the >>> add_tab_page() method and see that a new tab page is created. >>> >>> >>> On Sat, Apr 24, 2021 at 3:43 PM john fabiani >>> <[email protected]> wrote: >>> >>> Take my advise with a smile because I am NOT the best >>> programmer. But, I have to say this is some very >>> confusing code pxCore2.py. I believe you do not have a >>> handle on how OOP works within python. Also you copied >>> code directly out of the wxPython demo but lacked the >>> understanding of what was being presented. And I bet >>> this is causing confusion and is also not allowing you >>> to move forward. >>> >>> When you define a class, you don't normally create an >>> instance of the class within the definition of the class. >>> >>> self._MyTreeCtrl = MyTreeCtrl is in the __init__ method >>> of MyTreeCtrl. >>> >>> so comment out "self._MyTreeCtrl = MyTreeCtrl" >>> >>> I believe with wxPython 4.x the super() is used. >>> >>> so >>> >>> wx.TreeCtrl.__init__(self, parent, id, position, size, >>> style) >>> >>> is now >>> >>> super().__init__(parent, id = id, pos= position, size = >>> size, style=style) >>> >>> You can review the what is needed to init wx.TreeCtrl by >>> looking at the method in the source code. In this case >>> there are two signatures: >>> >>> TreeCtrl() >>> >>> or TreeCtrl(parent, id=ID_ANY, pos=DefaultPosition, >>> size=DefaultSize, style=TR_DEFAULT_STYLE, >>> validator=DefaultValidator, name=TreeCtrlNameStr) >>> >>> Therefore, depending on your needs you could just use: >>> >>> super().__init__() >>> >>> At this point I stopped because the GUI opened and I'm >>> not sure what you are trying to do. If it is to list a >>> directory there is a widget called 'FileDialog'. >>> >>> Johnf >>> >>> >>> >>> >>> >>> On 4/24/21 10:01 AM, RF wrote: >>>> >>>> I'm attaching my small demo test app. I'm having a heck >>>> of a time figuring out how to call add_tab_page() from >>>> the MyTreeCtrl class. This should happen when I just >>>> click on a tree node. While this doesn't seem to make >>>> any sense, what I plan to do with this action is open a >>>> new notebook tab and load in the filename into the new >>>> tab. But I have to get past this first: being able to >>>> call the add_tab_page() from the MyTreeCtrl class. >>>> >>>> I'm fairly sure I'm missing something small here. >>>> >>>> Thank you for any help. >>>> -- >>>> You received this message because you are subscribed to >>>> the Google Groups "wxPython-users" group. >>>> To unsubscribe from this group and stop receiving >>>> emails from it, send an email to >>>> [email protected]. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/wxpython-users/d1e36c62-125a-425c-947e-7bb5820e0184n%40googlegroups.com >>>> <https://groups.google.com/d/msgid/wxpython-users/d1e36c62-125a-425c-947e-7bb5820e0184n%40googlegroups.com?utm_medium=email&utm_source=footer>. >>> -- >>> You received this message because you are subscribed to >>> the Google Groups "wxPython-users" group. >>> To unsubscribe from this group and stop receiving emails >>> from it, send an email to [email protected]. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/wxpython-users/de54d97a-1794-a4ab-45fd-78c96b356c96%40gmail.com >>> <https://groups.google.com/d/msgid/wxpython-users/de54d97a-1794-a4ab-45fd-78c96b356c96%40gmail.com?utm_medium=email&utm_source=footer>. >>> >>> >>> >>> -- >>> Ralph Freshour >>> -- >>> You received this message because you are subscribed to the >>> Google Groups "wxPython-users" group. >>> To unsubscribe from this group and stop receiving emails >>> from it, send an email to [email protected]. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/wxpython-users/CAGgoqdiLSjJTOwi0hVNho%3DkwGbFHE5kn%3D3hQXy%3DL4pkYYraGOA%40mail.gmail.com >>> <https://groups.google.com/d/msgid/wxpython-users/CAGgoqdiLSjJTOwi0hVNho%3DkwGbFHE5kn%3D3hQXy%3DL4pkYYraGOA%40mail.gmail.com?utm_medium=email&utm_source=footer>. >> >> -- >> You received this message because you are subscribed to the >> Google Groups "wxPython-users" group. >> To unsubscribe from this group and stop receiving emails from it, >> send an email to [email protected]. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/wxpython-users/648c0562-5ad6-44d5-9747-ed753ecd5ae7n%40googlegroups.com >> <https://groups.google.com/d/msgid/wxpython-users/648c0562-5ad6-44d5-9747-ed753ecd5ae7n%40googlegroups.com?utm_medium=email&utm_source=footer>. > > -- > You received this message because you are subscribed to the Google > Groups "wxPython-users" group. > To unsubscribe from this group and stop receiving emails from it, send > an email to [email protected] > <mailto:[email protected]>. > To view this discussion on the web visit > https://groups.google.com/d/msgid/wxpython-users/1d44340d-6022-4764-b269-de6670d9e0e1n%40googlegroups.com > <https://groups.google.com/d/msgid/wxpython-users/1d44340d-6022-4764-b269-de6670d9e0e1n%40googlegroups.com?utm_medium=email&utm_source=footer>. -- You received this message because you are subscribed to the Google Groups "wxPython-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/wxpython-users/0182eece-177a-2f12-b5c3-39cf6a201c09%40gmail.com.