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

时间:2014-05-28 19:09:10

标签: python tkinter focus

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

感谢您提供的光线。

2 个答案:

答案 0 :(得分:5)

你走在正确的轨道上。

首先,您应该一次只有一个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一样,您只需在相应的小部件上调用focus即可。 focus_set完全相同,事实上如果您查看Tkinter.py,您会发现focus_set是方法的名称,focus只是别名。

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

答案 1 :(得分:3)

您可以使用内置的tkmessagebox而不是单独的Tk窗口。这将使窗口和OK按钮立即开启。

这样的事情:

tkMessageBox.showinfo("Warning","Please enter a .txt file.")

http://www.tutorialspoint.com/python/tk_messagebox.htm

另外,请注意我在Python 2.7中编写的内容,Python 3的语法可能略有不同,但功能应该相同。