Сделайте Tkinter Toplevel активным
Я пытаюсь сделать Toplevel
виджет, который является активным окном на экране (я хочу, чтобы, если вы нажмете Enter, он вышел из окна. У меня уже есть ключ, связанный с виджетом, но я не могу заставить окно быть главным окном на моем компьютере. Я запускаю свою программу с помощью Notepad++ (у меня есть ярлык для этой конкретной программы, так как я буду часто его использовать).
Вот мой код:
def main():
root = Tk(className = ' Module Opener')
app = GetFileName(root)
root.rowconfigure(0, weight = 1)
root.columnconfigure(0, weight = 1)
root.bind('<Return>', (lambda e, b=app.goButton: b.invoke()))
root.mainloop()
f, pythonType = app.fileName, app.pythonType
if f[-3:] != '.py': f += '.py'
moduleFile = getFilePath(f, pythonType)
if not moduleFile is None:
subprocess.call([r"C:\Program Files\Notepad++\notepad++.exe", moduleFile])
else:
root.withdraw()
finalRoot = Toplevel(root)
finalRoot.grab_set() # I thought this would make it active
finalApp = FileNotExist(finalRoot, f)
finalRoot.rowconfigure(0, weight = 1)
finalRoot.columnconfigure(0, weight = 1)
finalRoot.bind('<Return>', (lambda e, b=finalApp.okButton: b.invoke()))
finalRoot.mainloop()
Я хочу, чтобы при открытии, если я нажимаю Enter, он выполняет мою команду; однако сначала нужно щелкнуть окно, чтобы оно стало активным, а затем оно работает.
Я пробовал разные вещи, такие как finalRoot.lift()
, finalRoot.focus_set()
, finalRoot.grab_set()
/finalRoot.grab_set_global()
(Я видел эти методы из другого вопроса), и finalRoot.focus()
,
Первое окно Tk()
активен при запуске программы. Тем не менее Toplevel()
не является. Я также попытался сделать два Tk()
х (уничтожая root
а затем создание finalRoot
как новый Tk()
например), но это не сработало. Как я могу это сделать? Спасибо!
7 ответов
... однако я должен сначала щелкнуть в окне, чтобы оно стало активным, а затем оно работает.
Я только что столкнулся с этой проблемой, и пока я искал решение, я нашел эту ветку. Я использую Windows 7 Professional. Все, что я сделал, это позвонил обоим grab_set()
а также focus()
и это решило проблему для меня. У тебя уже есть finalRoot.grab_set()
, просто добавь:
finalRoot.focus()
Это сработало в моем случае.
Я попробовал вышеуказанные решения и обнаружил, что focus_force()
один работал на Windows Vista/Python 3.3. Также это может помочь включить takefocus=True
метод при создании вашего окна Toplevel.
Ни одно из приведенных выше предложений не помогло мне в Mac OS El Capitan, но это:
class Window(Tk.Toplevel):
...
def setActive(self):
self.lift()
self.focus_force()
self.grab_set()
self.grab_release()
...
У меня была такая же проблема, и я попробовал все, что мог найти. К сожалению, ответ таков: это зависит от вашей ОС. Мое окно автоматически сфокусировано на моем старом Mac, но не на OSX Lion. Некоторые из перечисленных вами команд также зависят от ОС.
root.call('wm', 'attributes', '.', '-topmost', True)
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False)
root.focus_force()
Вот код, который работал у меня
root= tk.Tk()
root.title("Main Window")
top = tk.Toplevel()
top.title("Topelevel Window")
top.grab_set() #for disable main window
top.attributes('-topmost',True) #for focus on toplevel
root.mainloop()
Я здесь слишком поздно, но если кому-то интересно решение для
python 3.9
просто
focus()
будет работать.
так,
top_window_name.focus()
это оно.