Виджет Tkinter Entry в Python не редактируется

Когда я запускаю этот код, появляется средство выбора файлов, а затем, когда я заканчиваю с ним, я не могу ввести виджет ввода, пока не сосредоточусь на другом окне, а затем вернусь. Почему это происходит?

import tkinter as tk
from tkinter.filedialog import askopenfilename


location = ''
start = tk.Tk()

tk.Label(text='What is the name of your table?').pack()
box = tk.Entry(start, exportselection=0, state=tk.DISABLED)
box.pack()
button = tk.Button(start, text='OK', command=lambda e: None)
button.pack()
location = askopenfilename(defaultextension='.db', 
                           title="Choose your database", 
                           filetypes=[('Database Files', '.db'), ('All files', '*')])
box.config(state=tk.NORMAL)

start.mainloop()

person ddsnowboard    schedule 03.08.2014    source источник
comment
Вы используете это на OSX?   -  person Bryan Oakley    schedule 03.08.2014
comment
Я понятия не имею, почему, но я полагаю, вы могли бы сначала выполнить askopenfilename, а затем запустить mainloop...   -  person W1ll1amvl    schedule 04.08.2014
comment
Я не на OSX, я на Windows 7 и 8.1. И как сделать, чтобы mainloop не запускался, пока не закроется окно askopenfilename?   -  person ddsnowboard    schedule 04.08.2014
comment
Не запускать основной цикл до тех пор, пока не будет закрыто имя askopenfilename, почти невозможно, так как ему всегда требуется корневое или основное окно, поэтому вы можете создать временное окно и выполнить root.withdraw()   -  person Dan Alexander    schedule 21.09.2014
comment
Виджет входа может быть ошибкой в ​​​​Python 2, поэтому я бы подумал об обновлении до Python 3 и использовании там этого tkinter.   -  person Dan Alexander    schedule 21.09.2014
comment
@ddsnowboard, вы нашли решение вышеуказанной проблемы? В настоящее время я работаю над чем-то подобным, и здесь я застрял.   -  person saurav    schedule 07.08.2018


Ответы (2)


Просто напишите box.focus_force() под box.pack(), и это сработает за вас.

person saurav    schedule 09.08.2018

Это должно исправить это

import tkinter as tk
from tkinter.filedialog import askopenfilename
location = ''
root = tk.Tk()
root.withdraw()
location = askopenfilename(defaultextension='.db', title="Choose your database", filetypes=[('Database Files', '.db'), ('All files', '*')])
start = tk.Tk()
tk.Label(start, text='What is the name of your table?').pack()
box = tk.Entry(start, exportselection=0, state=tk.DISABLED)
box.pack()
start.focus_set()
box.focus_set()
start.focus_force()
button = tk.Button(start, text='OK', command=lambda e: None)
button.pack()
box.config(state=tk.NORMAL)
start.mainloop()

Запустив сначала askopenfilename, вы можете избежать этой проблемы.

При этом вам нужно сделать root окно и убрать его, иначе вы получите два окна.

Используя focus_set и focus_force, вы можете сразу же подготовить коробку к использованию.

person Kyrubas    schedule 21.09.2014
comment
Это не решило проблему. Я работаю над чем-то подобным, и это все еще вызывает проблемы. У вас есть другая идея? - person saurav; 07.08.2018