confused about classes and tkinter object design

M

marc wyburn

Hi,

I've created my first Tkinter GUI class which consists of some buttons
that trigger functions. I have also created a
tkFileDialog.askdirectory control to local a root folder for log
files.

I have several file paths that depend on the value of
tkFileDialog.askdirectory should I create an object that inherits this
value or can I point functions at the GUI class?

I am creating the tkinter GUI instance using;

if __name__ == "__main__":
GUI = AuditorGUI()
GUI.mainloop()

class AuditorGUI(Frame):
def __init__(self):
Frame.__init__(self)
self.pack(expand = YES, fill = BOTH)

## Create GUI objects

self.currentdir = StringVar()
self.currentdir.set(os.getcwd())

self.logdir = Button(self, text="Choose Data
directory",command=self.choose_dir)
self.logdir.grid(row=1,column=0,sticky='nsew',pady=20,padx=20)

self.labeldirpath = Label(self, textvariable=self.currentdir)

def choose_dir(self):
dirname = tkFileDialog.askdirectory
(parent=self,initialdir=self.currentdir.get(),title='Please select a
directory')
if len(dirname ) > 0:
self.currentdir.set(dirname)

I think I have created an instance of the AuditorGUI class called GUI
so should be able to access the path using GUI.currentdir but this
doesn't work.

I'm still struggling with classes so not sure whether my problem is
tkinter related or not.

Thanks, MW
 
R

r

Hi,

I've created my first Tkinter GUI class which consists of some buttons
that trigger functions.  I have also created a
tkFileDialog.askdirectory control to local a root folder for log
files.

I have several file paths that depend on the value of
tkFileDialog.askdirectory should I create an object that inherits this
value or can I point functions at the GUI class?

I am creating the tkinter GUI instance using;

if __name__ == "__main__":
    GUI = AuditorGUI()
    GUI.mainloop()

class AuditorGUI(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.pack(expand = YES, fill = BOTH)

##      Create GUI objects

        self.currentdir = StringVar()
        self.currentdir.set(os.getcwd())

        self.logdir = Button(self, text="Choose Data
directory",command=self.choose_dir)
        self.logdir.grid(row=1,column=0,sticky='nsew',pady=20,padx=20)

        self.labeldirpath = Label(self, textvariable=self.currentdir)

    def choose_dir(self):
        dirname = tkFileDialog.askdirectory
(parent=self,initialdir=self.currentdir.get(),title='Please select a
directory')
        if len(dirname ) > 0:
            self.currentdir.set(dirname)

I think I have created an instance of the AuditorGUI class called GUI
so should be able to access the path using GUI.currentdir but this
doesn't work.

I'm still struggling with classes so not sure whether my problem is
tkinter related or not.

Thanks, MW
 
R

r

Hi,

I've created my first Tkinter GUI class which consists of some buttons
that trigger functions.  I have also created a
tkFileDialog.askdirectory control to local a root folder for log
files.

I have several file paths that depend on the value of
tkFileDialog.askdirectory should I create an object that inherits this
value or can I point functions at the GUI class?

I am creating the tkinter GUI instance using;

if __name__ == "__main__":
    GUI = AuditorGUI()
    GUI.mainloop()

class AuditorGUI(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.pack(expand = YES, fill = BOTH)

##      Create GUI objects

        self.currentdir = StringVar()
        self.currentdir.set(os.getcwd())

        self.logdir = Button(self, text="Choose Data
directory",command=self.choose_dir)
        self.logdir.grid(row=1,column=0,sticky='nsew',pady=20,padx=20)

        self.labeldirpath = Label(self, textvariable=self.currentdir)

    def choose_dir(self):
        dirname = tkFileDialog.askdirectory
(parent=self,initialdir=self.currentdir.get(),title='Please select a
directory')
        if len(dirname ) > 0:
            self.currentdir.set(dirname)

I think I have created an instance of the AuditorGUI class called GUI
so should be able to access the path using GUI.currentdir but this
doesn't work.

I'm still struggling with classes so not sure whether my problem is
tkinter related or not.

Thanks, MW

first off i would use a different instance variable besides "GUI".
Could be AG or auditorgui.
Also the conditional "if len(dirname ) > 0:" could simply be "if
dirname:"
When you ask for the attribute currentdir are you asking as
"GUI.currentdir.get()" or "GUI.currentdir"???
only the second will work with a TKVAR, but there is really no need to
use a TKVAR here. I would simply do:

self.currentdir = None

then you could say:
if GUI.currentdir:
do this()
 
R

r

first off i would use a different instance variable besides "GUI".
Could be AG or auditorgui.
Also the conditional "if len(dirname ) > 0:" could simply be "if
dirname:"
When you ask for the attribute currentdir are you asking as
"GUI.currentdir.get()" or "GUI.currentdir"???
only the second will work with a TKVAR, but there is really no need to
use a TKVAR here. I would simply do:

self.currentdir = None

then you could say:
if GUI.currentdir:
    do this()
When you ask for the attribute currentdir are you asking as
"GUI.currentdir.get()" or "GUI.currentdir"???
only the second will work with a TKVAR

correction:
only GUI.currentdir.get() will work with TKVAR
my bad:(
 
B

Bruno Desthuilliers

marc wyburn a écrit :
Hi,

I've created my first Tkinter GUI class which consists of some buttons
that trigger functions. I have also created a
tkFileDialog.askdirectory control to local a root folder for log
files.

I have several file paths that depend on the value of
tkFileDialog.askdirectory should I create an object that inherits this
value or can I point functions at the GUI class?

I am creating the tkinter GUI instance using;

if __name__ == "__main__":
GUI = AuditorGUI()

Note that at this point, the AuditorGUI class is not yet defined, so you
should get a NameError.
GUI.mainloop()
>
class AuditorGUI(Frame):

I assume you have all necessary imports in your real code...
def __init__(self):
Frame.__init__(self)
self.pack(expand = YES, fill = BOTH)

## Create GUI objects

self.currentdir = StringVar()
self.currentdir.set(os.getcwd())

self.logdir = Button(self, text="Choose Data
directory",command=self.choose_dir)
self.logdir.grid(row=1,column=0,sticky='nsew',pady=20,padx=20)

self.labeldirpath = Label(self, textvariable=self.currentdir)

def choose_dir(self):
dirname = tkFileDialog.askdirectory
(parent=self,initialdir=self.currentdir.get(),title='Please select a
directory')
if len(dirname ) > 0:
self.currentdir.set(dirname)

I think I have created an instance of the AuditorGUI class called GUI
so should be able to access the path using GUI.currentdir but this
doesn't work.

"does not work" is (almost) the less possible usefull description of a
problem. What happens exactly ? Do you have a traceback ? If so, please
post the full traceback and error message. Else, please explain what
result you get. And if possible, post minimal *working* code reproducing
the problem.
I'm still struggling with classes so not sure whether my problem is
tkinter related or not.

Minus the couple problems above (ie: trying to instanciate a
non-yet-existing class, and lack of necessary imports), it seems correct
- at least wrt/ class definition and instanciation.
 
M

marc wyburn

marc wyburn a écrit :






Note that at this point, the AuditorGUI class is not yet defined, so you
should get a NameError.





I assume you have all necessary imports in your real code...












"does not work" is (almost) the less possible usefull description of a
problem. What happens exactly ? Do you have a traceback ? If so, please
post the full traceback and error message. Else, please explain what
result you get. And if possible, post minimal *working* code reproducing
the problem.


Minus the couple problems above (ie: trying to instanciate a
non-yet-existing class, and lack of necessary imports), it seems correct
- at least wrt/ class definition and instanciation.- Hide quoted text -

- Show quoted text -

thanks for your help. I'm not creating the instances properly.
Everything works as expected if I merge everything into the class.
Time to get the manual out again. Thanks for pointing me in the right
direction. MW
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,022
Latest member
MaybelleMa

Latest Threads

Top