Tkinter- Possibly a basic question

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • joshdw4@gmail.com

    Tkinter- Possibly a basic question

    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.Top level):
    def __init__(self,p arent):
    Tkinter.Topleve l.__init__(self ,parent)
    self.parent = parent
    self.initialize (parent)


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

    self.menu.filem enu = Tkinter.Menu(se lf.menu)
    self.menu.add_c ascade(label="F ile", menu=self.menu. filemenu)
    #for later use
    #self.menu.file menu.add_separa tor()
    self.menu.filem enu.add_command (label="Exit",
    command=self.ki ll)

    self.menu.helpm enu = Tkinter.Menu(se lf.menu)
    self.menu.add_c ascade(label="H elp", menu=self.menu. helpmenu)
    self.menu.helpm enu.add_command (label="About.. .",
    command=self.ca llback)

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

    #status bar
    self.status = StatusBar(self)

    self.resizable( width=Tkinter.F ALSE,height=Tki nter.FALSE)

    def callback(self):
    #calls the function within status bar to set the new text,
    uses a tuple
    self.status.set text("%s %s","This callback","hold s a place for
    now!")
    def kill(self):
    self.parent.qui t()
    self.parent.des troy()

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

    class StatusBar(Tkint er.Frame):
    #initializes and draws
    def __init__(self,p arent):
    Tkinter.Frame._ _init__(self, parent)
    self.parent = parent
    self.label = Tkinter.Label(s elf.parent, bd=1,
    relief=Tkinter. SUNKEN, anchor=Tkinter. W,text='None')
    self.label.pack (fill=Tkinter.X )
    def settext(self, format,*args):
    self.label.conf ig(text=format % args)
    self.label.upda te_idletasks()

    def clear(self):
    self.label.conf ig(text="")
    self.label.upda te_idletasks()

    class SimplePlot(Tkin ter.Frame):
    "Creates a simple plot frame of time<10 and V<5 of pixel size wxh"
    def __init__(self,p arent,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.pac k(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.cre ate_line(i,0,i, self.canvas.h)
    for i in range(100,self. canvas.h,100):
    self.canvas.cre ate_line(0,i,se lf.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.cre ate_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(dat a)

    #loop until destroy
    a.mainloop()



  • Russell Blau

    #2
    Re: Tkinter- Possibly a basic question

    <joshdw4@gmail. comwrote in message
    news:59dee72b-3fb6-414b-ab49-33cab8f9c9e8@26 g2000hsk.google groups.com...
    >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.
    At the risk of overlooking something obvious, why don't you make your
    App class a subclass of Tkinter.Frame instead of Tkinter.Topleve l, and
    just pack it into the root window instead of worrying about how to get rid
    of the root window? Just delete "root.withdraw( )" and then add "a.pack()"
    before "a.mainloop ()".

    Russ



    Comment

    • Guilherme Polo

      #3
      Re: Tkinter- Possibly a basic question

      On Wed, Jul 30, 2008 at 6:33 PM, <joshdw4@gmail. comwrote:
      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(dat a)
      >
      #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.

      --
      -- Guilherme H. Polo Goncalves

      Comment

      • joshdw4@gmail.com

        #4
        Re: Tkinter- Possibly a basic question

        On Jul 30, 6:48 pm, "Guilherme Polo" <ggp...@gmail.c omwrote:
        On Wed, Jul 30, 2008 at 6:33 PM,  <josh...@gmail. comwrote:
        ...
        >
        ...
        >
        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.
        >
        ...
        >
        --
        -- Guilherme H. Polo Goncalves
        Excellent, this one was easy enough for me to understand/implement and
        it worked. Thanks for the help.

        Comment

        Working...