这里是第一个问题,但我已经回答了几个问题,所以希望这里有足够的信息供有人为我指明正确的方向。
我有以下代码,它们将构成我正在构建的应用程序的一部分。我希望用户能够输入他们的名字并评估一些图像,使用 slider 对其进行评分。为了定义图像的来源,我想使用 filedialog.askdirectory
选择一个文件夹,以便用户可以验证包含图像的正确文件夹。
我删除了记录数据的按钮和功能以简化此操作。
所以,我遇到的问题是,当弹出窗口时,会出现文件对话框并允许我选择文件夹。但在我选择之后,无法选择 Entry
字段来允许用户输入其姓名。如果我通过 Alt-tab 导航离开窗口或单击另一个窗口然后返回,我可以定位光标并正常继续 - 显然,这对于我的最终用户来说并不理想。
这里显示的是文件对话框弹出窗口:
第二个窗口不会自动获得焦点:
import tkinter as tk
from tkinter import filedialog
import numpy as np
class Model:
def __init__(self):
self.scores = []
self.position = 0
self.first_name = ""
self.last_name = ""
class WelcomeWindow:
def __init__(self, master):
button_width=25
button_height=10
self.master = master
self.frame = tk.Frame(self.master)
#self.file_dialog = tk.Frame(self.master)
self.directory = filedialog.askdirectory(parent=self.master)
self.canvas = tk.Canvas(self.frame,
height=600,
width=800
)
self.model = Model()
self.first_name_entry = tk.Entry(self.frame)
self.last_name_entry = tk.Entry(self.frame)
self.slider = tk.Scale(self.frame,
length=button_width * 20,
width=button_width * 2,
sliderlength=150,
showvalue=False,
from_=-3.00,
to=3.00,
orient="horizontal",
tickinterval=1,
label="Here is a slider",
resolution=0.01
)
self.frame.pack()
self.first_name_entry.pack()
self.last_name_entry.pack()
self.canvas.pack()
self.slider.pack()
def main():
root = tk.Tk()
win = WelcomeWindow(root)
root.mainloop()
main()
我尝试将 frame
和 first_name_entry
字段的 takefocus
选项设置为 True
没有成功。我还尝试将 self.directory
的父级调整为 self.frame
,这完全消除了我与主窗口交互的能力。
如果我遗漏了什么,请发表评论,我会尽力提供
最佳答案
Windows 系统上存在一个已知问题,即在主循环之前使用 filedialog 有机会第一次完全循环,从而导致此类焦点问题。
最初,我使用 after()
解决了此类问题,安排 filedialog 在第一个循环完成后的某个时间发生,但感谢 fhdrsdg's评论有一个更简单的方法可以使用 update_idletasks()
来修复此问题。
这是您重新编写的代码,以解决焦点问题和一些常规清理。
import tkinter as tk
from tkinter import filedialog
class Model:
def __init__(self):
self.scores = []
self.position = 0
self.first_name = ""
self.last_name = ""
class WelcomeWindow(tk.Tk):
def __init__(self):
super().__init__()
button_width = 25
button_height = 10
self.frame = tk.Frame(self)
self.directory = ''
self.canvas = tk.Canvas(self.frame, height=600, width=800)
self.model = Model()
self.first_name_entry = tk.Entry(self.frame)
self.last_name_entry = tk.Entry(self.frame)
self.slider = tk.Scale(self.frame, length=button_width * 20, width=button_width * 2, sliderlength=150, showvalue=False,
from_=-3.00, to=3.00, orient="horizontal", tickinterval=1, label="Here is a slider", resolution=0.01)
self.frame.pack()
self.first_name_entry.pack()
self.last_name_entry.pack()
self.canvas.pack()
self.slider.pack()
self.update_idletasks() # adding this here fixes the focus issue
self.directory = filedialog.askdirectory()
def main():
WelcomeWindow().mainloop()
if __name__ == "__main__":
main()
关于Tkinter filedialog 正在窃取焦点,并且在 Python 3.4.1 中没有 "Alt-tab"时不会返回焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53763079/