Re: Trouble calling method from one class to another class
john fabiani <[email protected]> Sun, 25 Apr 2021 20:01:34 -0700
| Newsgroups | gmane.comp.python.wxpython |
|---|---|
| Message-ID | <[email protected]> |
Does "frame.add_tab_page" require a passed parameter? Before you read on please look at the method. Hope you now realize your error? If you still can't figure it out here is the answer: you wrote: frame.add_tab_page(self.tab_num) should be frame.add_tab_page() I'm not sure why you are getting the error because you defined the instance "frame" in __main__. That said, you are talking about scope. You have designed the program that 'frame' is in the scope. You need to read up on scope in python. example: def run(): print(var) if __name__ == '__main__': var = 'yes' run() 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/d9bbca1a-779e-11e7-5f72-a1d3b95dbff0%40gmail.com.