Toplevel в tkinter создает еще одно пустое окно сбоку - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в python.

Я пытался написать код с помощью tkinter. При нажатии кнопки он должен открывать другое окно и закрывать предыдущее окно. Код правильно закрывает предыдущее окно.

Но проблема в том, что он также открывает еще одно пустое окно сбоку на экране.

Вот мой код:

# The first part got no problem

from tkinter import *
import time


class Start:
    def __init__(self):

        self.first_screen = Tk()

        self.win_width = 500
        self.win_height = 500

        self.screen_width = self.first_screen.winfo_screenwidth()
        self.screen_height = self.first_screen.winfo_screenheight()

        self.x_position = (self.screen_width / 2) - (self.win_width / 2)
        self.y_position = (self.screen_height / 2) - (self.win_height / 2)

        self.first_screen.title("Number game")
        self.first_screen.config(bg="#ffff00")
        self.first_screen.geometry("%dx%d+%d+%d" % (self.win_width, self.win_height, self.x_position, self.y_position))

        self.btn_play = Button(self.first_screen, text="Start", command=self.btn_play_click_action, width="10")
        self.btn_play.pack(side="top")
        self.btn_play.place(height=40, width=200, x=150, y=200)

        self.first_screen.mainloop()

        # This is where the problem happened
    def btn_play_click_action(self):
        time.sleep(1)
        self.first_screen.destroy()
        self.second_screen = Toplevel()
        self.second_screen.geometry("%dx%d+%d+%d" % (self.win_width, self.win_height, self.x_position, self.y_position))
        self.second_screen.title("Number game")
        self.second_screen.config(bg="#eeee00")
        self.label1 = Label(self.second_screen, width=50, bg="#000000")

        self.label1.pack(side="top")
        self.second_screen.mainloop()



Start()

Edit:

Когда я удаляю строку «self.first_screen.destroy ()», проблем нет.

Возможно, это потому, что Toplevel нужно родительское окно. Но мне нужно закрыть предыдущее окно. Что делать в таком случае?

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Вы не можете уничтожить root окно программы, которая называется self.first_screen = Tk (). Кроме того, вам не нужен mainl oop для окна Toplevel. Вы можете использовать метод .withdraw (), чтобы скрыть окно root вместо .destroy ()

Вот ваш обновленный код -

from tkinter import *
import time


class Start:
    def __init__(self):

        self.first_screen = Tk()

        self.win_width = 500
        self.win_height = 500

        self.screen_width = self.first_screen.winfo_screenwidth()
        self.screen_height = self.first_screen.winfo_screenheight()

        self.x_position = (self.screen_width / 2) - (self.win_width / 2)
        self.y_position = (self.screen_height / 2) - (self.win_height / 2)

        self.first_screen.title("Number game")
        self.first_screen.config(bg="#ffff00")
        self.first_screen.geometry("%dx%d+%d+%d" % (self.win_width, self.win_height, self.x_position, self.y_position))

        self.btn_play = Button(self.first_screen, text="Start", command=self.btn_play_click_action, width="10")
        self.btn_play.pack(side="top")
        self.btn_play.place(height=40, width=200, x=150, y=200)

        self.first_screen.mainloop()

        # This is where the problem happened
    def btn_play_click_action(self):
        time.sleep(1)
        self.first_screen.withdraw()
        self.second_screen = Toplevel()
        self.second_screen.geometry("%dx%d+%d+%d" % (self.win_width, self.win_height, self.x_position, self.y_position))
        self.second_screen.title("Number game")
        self.second_screen.config(bg="#eeee00")
        self.label1 = Label(self.second_screen, width=50, bg="#000000")

        self.label1.pack(side="top")
0 голосов
/ 19 июня 2020

Нет необходимости делать еще одно окно в Toplevel(). Вы можете сделать это проще → Вместо self.second_screen = Toplevel() вы можете набрать self.second_screen = Tk().

...