Re: Trouble calling method from one class to another class

RF <[email protected]> Mon, 26 Apr 2021 03:09:43 -0700 (PDT)
Newsgroups gmane.comp.python.wxpython
Message-ID <[email protected]>
So if you can run the app (in Linux) without getting that 'frame' error, 
that must mean 'frame' is a global variable once it is created in __main__?

Thank you for all your help John. I've enrolled in Udemy for an OOP online 
course. I hope that will help me to better understand how to structure my 
app.

On Sunday, April 25, 2021 at 8:31:30 PM UTC-7 johnf wrote:

> 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 (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 
> <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/83f15f07-6c6e-4698-867c-617f2dc7c828n%40googlegroups.com.