2016-07-11 5 views
1

Python3.5 + TKinterを使用した私の最初のパイロットプロジェクトでSwitch between two frames in tkinterBrian Oakleyありがとう) 2番目のフォーム(PageOne)から「Entry」ウィジェットに「フォーカス」を合わせると、フォーカスがまったく機能しません。TKinterフォーカスコマンドがフォームのスタックから2番目の呼び出されたフォームのウィジェットで動作しない

ただし、最初のフォームまたは開始フォーム(StartPage)から任意のウィジェットで「フォーカス」を行うと機能します。私が最初の "PageOne"を "StartPage"の前に呼び出すと、2番目のフォームの "focus"が動作するようになりました。以下のコードに基づいて、2番目のフォーム(PageOne)のウィジェットのいずれかで「フォーカス」を処理する方法についていくつかのヒントを教えてください。

ありがとうございます。

 

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


答えて

2

私はこの問題の答えを見つけることができました。私はこの記事から見つけました。その説明は何がDISのinitメソッドでやっていることは基本的に互いの上に、すべてのページを描画することですanderswb

によって与えられ、その後、あなたがする必要がある1つを引っ張ってtkraiseを使用しましたフロントはtkraise()を使用しています。なんらかの理由でこれは焦点をはねつけるように見えるので、前面に引っ張ってからフォーカスを設定する必要があります。そのため、私はあなたがすべてのページを上げた後で呼び出される余分なメソッドを追加しました。 - 午前19時27

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

でanderswb 10月20日'15
関連する問題