Как закрыть окно Tkinter, когда открывается новое окно Tkinter? - PullRequest
0 голосов
/ 05 марта 2020

Я хотел бы знать, как я могу открыть окно tkinter, используя python, а затем в скрипте оно закрывается, чтобы открыть другое окно tkinter. В windows я планирую просто вставить изображения, чтобы они обновлялись, когда скрипту это тоже нужно. Я делаю текстовую игру, в которой вы выбираете нужное направление go и использую окно tkinter для отображения карты. Если есть какие-то лучшие способы сделать это, это было бы очень полезно, но я рад, что окно tkinter закрывается и открывается при вызове нового окна.

1 Ответ

0 голосов
/ 05 марта 2020

Создать пустое окно и запустить mainl oop () (событие l oop), чтобы оно оставалось открытым

import tkinter as tk

window = tk.Tk()
window.mainloop()

Чтобы закрыть его, вы можете использовать стандартную кнопку [x] в строке заголовка.

Или вам нужно поместить кнопку в окно, которое запускает window.destroy(), чтобы закрыть его.

import tkinter as tk

window = tk.Tk()

button = tk.Button(window, text='CLOSE', command=window.destroy)
button.pack()

window.mainloop()

Кстати: в command= должно быть window.destroy без (). Это "callback" - имя функции, которая будет выполняться при нажатии кнопки.


В этом примере кнопка запускает функцию, которая закрывает первое окно и создает второе окно.

import tkinter as tk

# --- functions ---

def second_window():
    window.destroy()

    second = tk.Tk()

    button = tk.Button(second, text='CLOSE SECOND', command=second.destroy)
    button.pack()

    second.mainloop()

# --- main ---

window = tk.Tk()

button = tk.Button(window, text='CLOSE FIRST', command=second_window)
button.pack()

window.mainloop()

Предыдущая версия открывает второе окно, только если вы используете tk.Button(), но при нажатии [x] этого не происходит. Вам нужно

window.protocol("WM_DELETE_WINDOW", second_window)

для запуска second_window при нажатии [x]

import tkinter as tk

# --- functions ---

def second_window():
    window.destroy()

    second = tk.Tk()

    button = tk.Button(second, text='CLOSE SECOND', command=second.destroy)
    button.pack()

    second.mainloop()

# --- main ---

window = tk.Tk()

button = tk.Button(window, text='CLOSE FIRST', command=second_window)
button.pack()

window.protocol("WM_DELETE_WINDOW", second_window)

window.mainloop()

Вы даже можете запустить код, который закроет и снова создаст то же окно

import tkinter as tk

# --- functions ---

def first_window():
    global window

    if window:
        window.destroy()
        #window = None 

    window = tk.Tk()

    button = tk.Button(window, text='CLOSE FIRST', command=first_window)
    button.pack()

    window.protocol("WM_DELETE_WINDOW", first_window)

    window.mainloop()

# --- main ---

window = None
first_window()

В этом примере я использую window = None, чтобы проверить, существует ли окно, и закройте его. Вы можете использовать этот метод, чтобы закрыть первое окно при создании нового окна.


В этом примере я использую first_window = None и second_window = None, поэтому я могу проверить, открыто ли другое окно, и закрыть его.

import tkinter as tk

# --- functions ---

def open_second_window():
    global first_window
    global second_window

    if first_window:
        first_window.destroy()
        first_window = None

    second_window = tk.Tk()

    button = tk.Button(second_window, text='OPEN FIRST', command=open_first_window)
    button.pack()

    second_window.protocol("WM_DELETE_WINDOW", open_first_window)

    second_window.mainloop()

def open_first_window():
    global first_window
    global second_window

    if second_window:
        second_window.destroy()
        second_window = None

    first_window = tk.Tk()

    button = tk.Button(first_window, text='OPEN SECOND', command=open_second_window)
    button.pack()

    first_window.protocol("WM_DELETE_WINDOW", open_second_window)

    first_window.mainloop()

# --- main ---

first_window = None
second_window = None
open_first_window()

Но я не знаю, зачем вам закрывать одно окно и открывать другое. Вы можете скрыть первое окно, если позже захотите go вернуться к первому окну. Или вы можете оставить виджеты в Frame() и удалить / этот кадр, чтобы показать другой кадр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...