gpt4 book ai didi

Python tkinter 8.5 - 如何将焦点从主窗口更改为弹出窗口?

转载 作者:行者123 更新时间:2023-11-28 20:22:22 33 4
gpt4 key购买 nike

我是 tkinter 的新手,有一个相当简单的问题。我想将焦点从第一个窗口 root 转移到弹出后的 txt 窗口。我也希望“确定”按钮也能集中注意力。当然,这个想法是让用户在看到这个错误时能够按回车键。在对 focus()、focus_set() 和 takefocus 进行了各种尝试后,我感到非常困惑。我没有发现这方面的文档特别有用。

下面是我的代码:

from tkinter import *
from tkinter import ttk

def close(self):
self.destroy()

def browse(*args):
fileName = filedialog.askopenfilename()
guiInputFile_entry.insert(0, fileName)
return fileName

def formatInput(*args):
if guiInputFile.get()[-4:] != ".txt": #checks for correct file extension (.txt)


txt = Tk()
txt.title("Error")

txtFrame = ttk.Frame(txt, padding="30 30 30 30")
txtFrame.grid(column=0, row=0, sticky=(N,W,E,S))
txtFrame.columnconfigure(0, weight=1)
txtFrame.rowconfigure(0, weight=1)

ttk.Label(txtFrame, text = "Please enter a .txt file.\n").grid(column=2, row=1)
okButton = ttk.Button(txtFrame, text = "OK", command = lambda: close(txt)).grid(column=2, row=2)
return

root = Tk()
root.title("Cost Load Formatter")

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N,W,E,S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

guiInputFile = StringVar()

guiInputFile_entry = ttk.Entry(mainframe, width=100, textvariable=guiInputFile)
guiInputFile_entry.grid(column=1, row=2, stick=(W,E))

ttk.Label(mainframe, text="Please enter the full filepath of the .txt file you wish to format:").grid(column=1, row=1)
browseButton = ttk.Button(mainframe, text="Browse...", underline=0, command=browse).grid(column=2, row=2, sticky=W)
formatButton = ttk.Button(mainframe, text="Format", underline=0, command= lambda: formatInput(guiInputFile)).grid(column=1, row=3)

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)

guiInputFile_entry.focus()

root.mainloop()

感谢您提供的任何光亮。

最佳答案

你走在正确的轨道上。

首先,您一次只能拥有一个 Tk 实例。 Tk 是控制tkinter 应用程序的对象,正好它也显示了一个窗口。每当您需要第二个窗口(第三个、第四个等)时,您应该使用 Toplevel。你可以像使用Tk一样使用它,只需将它传递给root:

txt = Toplevel(root)

它只是缺少像 mainloop 这样的东西。

其次,gridpack 不返回任何内容。例如:

okButton = ttk.Button(txtFrame, text = "OK", command = lambda: close(txt)).grid(column=2, row=2)

应该是:

okButton = ttk.Button(txtFrame, text = "OK", command = lambda: close(txt))
okButton.grid(column=2, row=2)

但如果这导致您出现问题,您应该得到一个错误。

因此,要回答您的主要问题,就像您对底部的 Entry 所做的那样,您只需在适当的小部件上调用 focusfocus_set 做的完全一样,事实上如果你查看 Tkinter.py 你会发现 focus_set 是方法的名称,而 focus 只是一个别名。

这将在应用程序获得焦点时为小部件提供焦点。如果应用程序不在焦点上,有办法强制它进入焦点,但这被认为是不礼貌的,你应该让窗口管理器控制它。

关于Python tkinter 8.5 - 如何将焦点从主窗口更改为弹出窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23919947/

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