Re: Trouble calling method from one class to another class
RF <[email protected]> Sun, 25 Apr 2021 19:02:10 -0700 (PDT)
| Newsgroups | gmane.comp.python.wxpython |
|---|---|
| Message-ID | <[email protected]> |
(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 (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/ >> >> 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]. To view this discussion on the web visit https://groups.google.com/d/msgid/wxpython-users/1d44340d-6022-4764-b269-de6670d9e0e1n%40googlegroups.com.
pxCore4.3.py.zip
(application/x-zip, 1.4 KB) - not displayed