Tkinter filedialog正在窃取焦点,并且在Python 3.4.1中没有“ Alt-tab”的情况下不会返回它

时间:2018-12-13 13:34:34

标签: tkinter python-3.4

这里的第一个问题,但是我已经回答了几个,所以希望这里有足够的信息供某人向我提供正确方向的指点。

我有以下代码,这些代码将构成我正在构建的应用程序的一部分。我希望用户能够输入其名称并评估一些图像,并使用滑块对其评分。为了定义图像的来源,我想使用filedialog.askdirectory选择一个文件夹,以便用户可以验证包含图像的正确文件夹。

我已经删除了用于记录数据的按钮和功能,以简化此操作。

所以,我的问题是,当窗口弹出时,出现文件对话框,并允许我选择文件夹。不过,在选择之后,Entry字段将无法选择以允许用户键入他们的姓名。如果通过Alt-tab或单击另一个窗口并返回来离开该窗口,则可以定位光标并照常进行-显然,这对于最终用户而言并不理想。

这是此处显示的文件对话框弹出窗口:

<code>filedialog</code> popup

第二个窗口不会自动聚焦:

Second (main application) Window

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

我尝试将takefocusframe字段的first_name_entry选项设置为True,但没有成功。我还尝试将self.directory的父级调整为self.frame,这完全消除了我与主窗口进行交互的能力。

如果我遗漏了任何内容,请发表评论,我会提供一切

1 个答案:

答案 0 :(得分:3)

在Windows系统上存在一个已知问题,即在mainloop第一次有机会完全循环之前就使用filedialog引起这种焦点问题。

最初,我使用after()解决了此类问题,计划将文件对话安排在第一个循环完成后的某个时间发生,但是感谢fhdrsdg's评论,有一种更简单的方法可以使用{{1 }}。

在这里,您的代码经过了重新设计以解决焦点问题和一些常规清理工作。

update_idletasks()