Сделайте 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()

это оно.

Другие вопросы по тегам