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.