Tkinter filedialog 正在窃取焦点,并且在 Python 3.4.1 中没有 "Alt-tab"时不会返回焦点

标签 tkinter python-3.4

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

我有以下代码,它们将构成我正在构建的应用程序的一部分。我希望用户能够输入他们的名字并评估一些图像,使用 slider 对其进行评分。为了定义图像的来源,我想使用 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()

我尝试将 framefirst_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/

相关文章:

python - Tkinter 中的顶级小部件

python - 尝试使用 Tkinter 将下拉列表放在代码上

Ubuntu 上的 Python3 在 help() 命令上出现错误

Python 线程 self._stop() 'Event' 对象不可调用

python - 使用请求访问 url 时处理 Windows 身份验证

python - 如何处理每个单独条目的事件

python - 接受用户输入来加载程序

python - 无法使用 tkinter 取消绑定(bind)函数

python - 如何修复 Python 3 中字典处理的顺序?

python - cx_Freeze exe 在运行时导致 psycopg2 出现 sqlalchemy.exc.NoSuchmoduleError