Tkinter- Possibly a basic question

J

joshdw4

I hate to do this, but I've thoroughly exhausted google search. Yes,
it's that pesky root window and I have tried withdraw to no avail. I'm
assuming this is because of the methods I'm using. I guess my question
is two-fold.
1) How do I get rid of that window?
2) Any comments in general? I am just learning python (and coding with
classes), so I'm sure there are things I should pound into my head
before I learn bad habits.

Here's the code. It will eventually be a voltage measurement using an
Arduino board. Just a simple plot for now.

import Tkinter, time


class App(Tkinter.Toplevel):
def __init__(self,parent):
Tkinter.Toplevel.__init__(self,parent)
self.parent = parent
self.initialize(parent)


def initialize(self,parent):
#create a menu
self.menu = Tkinter.Menu(self)
self.config(menu=self.menu)

self.menu.filemenu = Tkinter.Menu(self.menu)
self.menu.add_cascade(label="File", menu=self.menu.filemenu)
#for later use
#self.menu.filemenu.add_separator()
self.menu.filemenu.add_command(label="Exit",
command=self.kill)

self.menu.helpmenu = Tkinter.Menu(self.menu)
self.menu.add_cascade(label="Help", menu=self.menu.helpmenu)
self.menu.helpmenu.add_command(label="About...",
command=self.callback)

#plotting canvas creation
self.axis = SimplePlot(self,1000,500)

#status bar
self.status = StatusBar(self)

self.resizable(width=Tkinter.FALSE,height=Tkinter.FALSE)

def callback(self):
#calls the function within status bar to set the new text,
uses a tuple
self.status.settext("%s %s","This callback","holds a place for
now!")
def kill(self):
self.parent.quit()
self.parent.destroy()

def plot_data(self,data):
self.axis.plot(data)

class StatusBar(Tkinter.Frame):
#initializes and draws
def __init__(self,parent):
Tkinter.Frame.__init__(self, parent)
self.parent = parent
self.label = Tkinter.Label(self.parent, bd=1,
relief=Tkinter.SUNKEN, anchor=Tkinter.W,text='None')
self.label.pack(fill=Tkinter.X)
def settext(self, format,*args):
self.label.config(text=format % args)
self.label.update_idletasks()

def clear(self):
self.label.config(text="")
self.label.update_idletasks()

class SimplePlot(Tkinter.Frame):
"Creates a simple plot frame of time<10 and V<5 of pixel size wxh"
def __init__(self,parent,w,h):
#this line was taken from online... not sure why it works,
#but it allows packing outside of this __init__
Tkinter.Frame.__init__(self, parent)
self.parent = parent
self.canvas = Tkinter.Canvas(parent,width=w,height=h)

#frame height in pixels
self.canvas.h = h

#frame width in pixels
self.canvas.w = w
self.canvas.pack(fill=Tkinter.X)

#draw gridlines
self.gridon()

def gridon(self):
"Draws gridlines on the plot at every 1 unit"
for i in range(100,self.canvas.w,100):
self.canvas.create_line(i,0,i,self.canvas.h)
for i in range(100,self.canvas.h,100):
self.canvas.create_line(0,i,self.canvas.w,i)

def plot(self, data):
"Plots data given as data = [], data.append( (x,y) )"
for x, y in data:
px = int(x/10*self.canvas.w)
py = int(self.canvas.h-y/5*self.canvas.h)
self.canvas.create_rectangle((px-1, py-1, px+1, py+1),
outline="red")


if __name__ == "__main__":
root = Tkinter.Tk()
root.withdraw()

#create main window
a = App(root)
a.title('Plot')

#create a sample data range for testing
#data ranges from x=0, y=0 to x=10, y=5
data = []
for i in range(1000):
data.append( (float(i)/1000*10,float(i)/1000*5) )

a.plot_data(data)

#loop until destroy
a.mainloop()
 
G

Guilherme Polo

I hate to do this, but I've thoroughly exhausted google search. Yes,
it's that pesky root window and I have tried withdraw to no avail. I'm
assuming this is because of the methods I'm using. I guess my question
is two-fold.
1) How do I get rid of that window?

You don't.
2) Any comments in general? I am just learning python (and coding with
classes), so I'm sure there are things I should pound into my head
before I learn bad habits.

Here's the code. It will eventually be a voltage measurement using an
Arduino board. Just a simple plot for now.

import Tkinter, time

...

if __name__ == "__main__":
root = Tkinter.Tk()
root.withdraw()

#create main window
a = App(root)
a.title('Plot')

#create a sample data range for testing
#data ranges from x=0, y=0 to x=10, y=5
data = []
for i in range(1000):
data.append( (float(i)/1000*10,float(i)/1000*5) )

a.plot_data(data)

#loop until destroy
a.mainloop()

Before anything.. root withdraw works here but I wouldn't do it
anyway. There are several solutions to this actually, I will list
some, and none involve withdrawing the root window.

The first thing you could do is change App to not inherit from
Toplevel, instead change it to inherit object at max and pass the root
object to it (to act as the parent for menu and other things). The
drawback here is that you will have to change several lines, those
that involve menu creation for example and this a.title and
a.mainloop.

The second option is to not create the root there, instead, make App
inherit Tk. I rarely see people doing this, but it works too. Here you
won't need to store the parent in an instance attribute, given it is
always accessible through self.master since you are subclassing Tk.

Another option is to make App subclass Frame instead of Toplevel, so
you don't create an unecessary window. But if it is really a window,
it doesn't make much sense to inherit Frame, so we are back at the
first proposed solution.
 
J

joshdw4

...

The second option is to not create the root there, instead, make App
inherit Tk. I rarely see people doing this, but it works too. Here you
won't need to store the parent in an instance attribute, given it is
always accessible through self.master since you are subclassing Tk.

...

Excellent, this one was easy enough for me to understand/implement and
it worked. Thanks for the help.
 

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

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top