Tkinter дает мне второе окно

#python-3.x #user-interface #tkinter

#python-3.x #пользовательский интерфейс #tkinter

Вопрос:

Я пишу код для графического интерфейса tkinter с использованием класса, однако я замечаю, что при запуске появляется второе окно, помимо основного, которое я создал. Я пробовал несколько вещей, но они либо нарушают код, либо окно становится черным. Смотрите код ниже.

 import tkinter as gui

class loginWindow(gui.Frame):
    def __init__(self):
        super(loginWindow, self).__init__()
        self.logUI()


def logUI(self):
    self.mainWindow = gui.Tk()
    self.mainWindow.title("GLSC IT Inventory")
    self.mainWindow.minsize(400, 150)
    self.mainWindow.maxsize(400, 150)
    self.mainWindow.geometry("400x150")

    self.greet_label = gui.Label(self.mainWindow, text="Welcome!!!")
    self.greet_label.place(x=180, y=5)

    self.uname_label = gui.Label(self.mainWindow, text="Username:")
    self.uname_label.place(x=10, y=24)

    self.uname_input = gui.StringVar()
    self.uname_field = gui.Entry(self.mainWindow, bd=4, textvariable=self.uname_input)
    self.uname_field.place(x=80, y=25, width=160)

    self.pwd_label = gui.Label(self.mainWindow, text="Password:")
    self.pwd_label.place(x=10, y=54)

    self.pwd_input = gui.StringVar()
    self.pwd_field = gui.Entry(self.mainWindow, bd=4, textvariable=self.pwd_input, show="u2022")
    self.pwd_field.place(x=80, y=55, width=160)

    self.login_button = gui.Button(self.mainWindow, text="Login", command=None)
    self.login_button.place(x=180, y=95)
 

my_app = loginWindow()
my_app.mainloop()

Комментарии:

1. Пожалуйста, исправьте форматирование кода. logUI кажется, у него неверный отступ, а последние пару строк кода имеют неправильное форматирование.

2. Извините, это из-за некоторых проблем, с которыми я вставлял код здесь, это правильно в моей IDE.

3. Мы можем видеть только код, который вы публикуете.

4. Я знаю, я хочу сказать, что я допустил ошибку при публикации кода, поэтому он не выровнен правильно. Тем не менее @acw1668 ответил на вопрос, так что все хорошо.

Ответ №1:

Когда вы создаете экземпляр loginWindow() , требуется экземпляр Tk() , но его нет, поэтому он будет создан неявно для вас.

Затем Tk() внутри создается другой экземпляр logUI() . Итак, есть два экземпляра Tk() .

Один из способов исправить это loginWindow не наследуется от Frame :

 class loginWindow:
    def __init__(self):
        self.logUI()

    def logUI(self):
        ...

    # add for calling tkinter.mainloop()
    def mainloop(self):
        self.mainWindow.mainloop()
 

Комментарии:

1. Спасибо! Это сработало, также объяснение очень ценится, я буду знать, как избежать в будущем.