这好像是tkraise()
扰乱了焦点。因此,您需要在将页面提升到视图中后调用它。我会更新您的框架,以便始终在 tkraise 之后调用某些方法,如下所示:
import tkinter as tk
from tkinter import *
from tkinter import ttk
class DIS(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.iconbitmap(self, default="")
tk.Tk.wm_title(self, "program")
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, contactQues):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row = 0, column = 0, sticky = "nsew")
self.show_frame(startPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
frame.postupdate()
class startPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
button2 = ttk.Button(self, text = "Here's a Button",
command=lambda: controller.show_frame(contactQues))
button2.pack()
def postupdate(self):
pass
class contactQues(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.entry = Entry(self)
self.entry.pack()
def postupdate(self):
self.entry.focus()
app = DIS()
app.mainloop()
如果您想避免postupdate()
如果不需要它,您可以在尝试运行它之前检查类中是否存在该方法。就像这样:
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
try:
frame.postupdate()
except AttributeError:
pass