我是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()
感谢您提供的光线。
答案 0 :(得分:5)
你走在正确的轨道上。
首先,您应该一次只有一个Tk
个实例。 Tk
是控制tkinter
应用程序的对象,它恰好也显示了一个窗口。每当你想要第二个窗口(第三个,第四个等)时,你应该使用Toplevel
。您可以在使用Tk
时使用它,只需将其传递给root
:
txt = Toplevel(root)
它只是缺少像mainloop
这样的东西。
其次grid
和pack
不返回任何内容。例如:
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的语法可能略有不同,但功能应该相同。