--
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 wxpython-user...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/wxpython-users/8280ba78-37fb-e0a2-20f7-a9f4942eda0e%40schwertberger.de.
I did test it. I use PyCharm IDE and it runs fine (until I try to create a new tab page, then I get the error I'm trying to resolve).
It seems that your IDE does run something other than your programs.
pxCore.py tries to instantiate a control with a sizer as parent which does not work:
self.tree = MyTreeCtrl(vbox, tID, size=wx.Size(240, 400), style=wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_HAS_BUTTONS | wx.TR_NO_LINES)
File "D:\Python\wxpython\bugs_etc\2021-04-24_Calling\pxCore.py", line 6, in __init__
wx.TreeCtrl.__init__(self, parent, id, size, style)
pxCore2.py calls ...traverse_directory_tree... before
self.tab_num is defined. This also does not work.
Even if this worked, you have a hard coded path which will fail on
any machine except yours.
Regards,
Dietmar
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
--
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 wxpython-user...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/wxpython-users/d1e36c62-125a-425c-947e-7bb5820e0184n%40googlegroups.com.
--
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 wxpython-user...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/wxpython-users/6bcc96f1-cff3-b1ee-4790-fe05395d6a70%40schwertberger.de.
To view this discussion on the web visit https://groups.google.com/d/msgid/wxpython-users/de54d97a-1794-a4ab-45fd-78c96b356c96%40gmail.com.
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
To view this discussion on the web visit https://groups.google.com/d/msgid/wxpython-users/CAGgoqdiLSjJTOwi0hVNho%3DkwGbFHE5kn%3D3hQXy%3DL4pkYYraGOA%40mail.gmail.com.
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
To view this discussion on the web visit https://groups.google.com/d/msgid/wxpython-users/648c0562-5ad6-44d5-9747-ed753ecd5ae7n%40googlegroups.com.
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
To view this discussion on the web visit https://groups.google.com/d/msgid/wxpython-users/1d44340d-6022-4764-b269-de6670d9e0e1n%40googlegroups.com.
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
To view this discussion on the web visit https://groups.google.com/d/msgid/wxpython-users/1d44340d-6022-4764-b269-de6670d9e0e1n%40googlegroups.com.