Tkinter filedialog крадет фокус и не возвращает его без «Alt-tab» в Python 3.4.1 - PullRequest
0 голосов
/ 13 декабря 2018

Первый вопрос здесь, но я ответил на несколько, так что, надеюсь, здесь будет достаточно информации, чтобы кто-нибудь дал мне указатель в правильном направлении.

У меня есть следующий код, который будет формироватьсячасть приложения, которое я создаю.Я хочу, чтобы пользователи могли вводить свое имя и оценивать некоторые изображения, оценивая их с помощью ползунка.Чтобы определить источник изображений, я хочу выбрать папку, используя filedialog.askdirectory, чтобы пользователь мог проверить правильную папку, содержащую изображения.

Я удалил кнопки и функции, которые записываютданные, чтобы упростить это.

Итак, у меня проблема в том, что когда всплывает окно, появляется файл диалога и позволяет мне выбрать папку.После того как я выбрал, поля Entry не могут быть выбраны, чтобы позволить пользователю вводить свое имя.Если я отхожу от окна с помощью Alt-tab или щелкаю другое окно и возвращаюсь назад, я могу расположить курсор и продолжить как обычно - очевидно, это не идеально для моих конечных пользователей.

Вот всплывающее окно filedialog, показанное здесь:

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

Я пытался установить параметр takefocus для frame и для поля first_name_entry на True безуспех.Я также попытался настроить родительский элемент self.directory на self.frame, и это полностью лишает меня возможности взаимодействовать с главным окном.

Если я что-то пропустил, пожалуйста, оставьте комментарий, и я 'предоставлю все что смогу

1 Ответ

0 голосов
/ 13 декабря 2018

Известны проблемы в системах Windows, где при использовании filedialog до того, как mainloop впервые выпал полный цикл, вызывая проблему с фокусом такого типа.

Изначально я решил эту проблему, используя after() чтобы запланировать диалог filedial когда-нибудь после завершения первого цикла, но благодаря комментарию fhdrsdg есть более простой способ исправить это, используя 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()
...