gpt4 book ai didi

python - TKinter focus 命令不适用于表单堆栈中第二个调用表单的小部件

转载 作者:行者123 更新时间:2023-11-30 22:53:06 34 4
gpt4 key购买 nike

我使用了 Switch between two frames in tkinter 中的代码(如下)(感谢 Brian Oakley )在我使用 Python3.5 + Tkinter 的第一个试点项目中,在“聚焦” Entry 时遇到问题来自第二种形式( PageOne )的小部件,焦点根本不起作用。

但是,如果我从第一个或起始表单( StartPage )中“聚焦”任何小部件,它就会起作用!如果我先切换调用 PageOne之前StartPage现在,第二种形式的“焦点”就可以发挥作用了。您能否提供一些提示,告诉我如何根据下面的代码对第二种表单 ( 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()

最佳答案

我能够找到这个问题的答案,我从这篇文章中找到了它。 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

关于python - TKinter focus 命令不适用于表单堆栈中第二个调用表单的小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38316892/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com