Tkinter- Possibly a basic question

joshdw4 at gmail.com joshdw4 at gmail.com
Wed Jul 30 17:33:37 EDT 2008


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()






More information about the Python-list mailing list