1

I used the codes (below) from Switch between two frames in tkinter (thanks to Brian Oakley) on my first pilot project using Python3.5 + Tkinter and was having issue doing a "focus" on an Entry widget from the second form (PageOne), the focus is not working at all.

However, if I do the "focus" on any widget from the first or starting form (StartPage) it works! And if I switch calling first PageOne before StartPage the "focus" on the second form would now work. Can you please provide some tips on how I would handle doing a "focus" on any of the widget on the second form (PageOne) based on the code below?

import tkinter as tk
TITLE_FONT = ("Helvetica", 18, "bold")

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
       tk.Tk.__init__(self, *args, **kwargs)

       # the container is where we'll stack a bunch of frames
       # on top of each other, then the one we want visible
       # will be raised above the others
       container = tk.Frame(self)
       container.pack(side="top", fill="both", expand=True)
       container.grid_rowconfigure(0, weight=1)
       container.grid_columnconfigure(0, weight=1)

       self.frames = {}
       for F in (StartPage, PageOne, PageTwo):
           page_name = F.__name__
           frame = F(parent=container, controller=self)
           self.frames[page_name] = frame

           # put all of the pages in the same location;
           # the one on the top of the stacking order
           # will be the one that is visible.
           frame.grid(row=0, column=0, sticky="nsew")

       self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is the start page", font=TITLE_FONT)
        label.pack(side="top", fill="x", pady=10)

        button1 = tk.Button(self, text="Go to Page One",
                            command=lambda: controller.show_frame("PageOne"))
        button2 = tk.Button(self, text="Go to Page Two",
                            command=lambda: controller.show_frame("PageTwo"))
        button1.pack()
        button2.pack()


class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is page 1", font=TITLE_FONT)
        label.pack(side="top", fill="x", pady=10)
        button = tk.Button(self, text="Go to the start page",
                           command=lambda: controller.show_frame("StartPage"))
        button.pack()


class PageTwo(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is page 2", font=TITLE_FONT)
        label.pack(side="top", fill="x", pady=10)
        button = tk.Button(self, text="Go to the start page",
                           command=lambda: controller.show_frame("StartPage"))
        button.pack()

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()
martineau
  • 119,623
  • 25
  • 170
  • 301
allan
  • 131
  • 10

1 Answers1

3

I was able to find an answer to this issue, I found it from this post. And the explanation was given by anderswb

What you are doing in the init method of DIS is to draw all of the pages, basically on top of each other, and then you use tkraise to pull the one you need to the front using tkraise(). For some reason this seems to mess up the focus, so you need to set the focus after you've pulled it to the front. That is why I've added an extra method which will be called on all of you pages after it has been raised. – anderswb Oct 20 '15 at 19:27

tkinter-focus-set-and-focus-force-not-working-as-expected

Community
  • 1
  • 1
allan
  • 131
  • 10