Big*_*pie 2 python focus tkinter
我是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()
Run Code Online (Sandbox Code Playgroud)
谢谢你能发光的任何光芒.
小智 5
你走在正确的轨道上.
首先,你应该一次只有一个实例Tk. Tk是控制tkinter应用程序的对象,它恰好也显示了一个窗口.每当你想要第二个窗口(第三个,第四个等)时你应该使用Toplevel.您可以使用它Tk,只需传递它root:
txt = Toplevel(root)
Run Code Online (Sandbox Code Playgroud)
它只是缺少类似的东西mainloop.
其次grid,pack不要退货.例如:
okButton = ttk.Button(txtFrame, text = "OK", command = lambda: close(txt)).grid(column=2, row=2)
Run Code Online (Sandbox Code Playgroud)
应该:
okButton = ttk.Button(txtFrame, text = "OK", command = lambda: close(txt))
okButton.grid(column=2, row=2)
Run Code Online (Sandbox Code Playgroud)
但如果这导致您出现问题,您应该会收到错误.
所以要回答你的主要问题,就像你Entry在底部做的那样,你只需要调用focus适当的小部件. focus_set完全相同,事实上,如果你查看,Tkinter.py你会发现focus_set是方法的名称,focus只是一个别名.
这将在应用程序具有焦点时为窗口小部件提供焦点.如果应用程序不在焦点上,有办法强制它进入焦点,但它被认为是不礼貌的,你应该让窗口管理器控制它.