Python3 tkinter - пустое новое окно с классом + содержимое нового окна в исходном окне - PullRequest
0 голосов
/ 16 мая 2018

Я ломаю голову над возможностями tkinter сделать простое приложение, которое при запуске показывает маленькое окно «Введите пароль».Но самое странное поведение начало происходить ...

mainWindow.py

import tkinter as tk
import password

class mainWindow(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)

        self.title("mainWindow")
        self.geometry("{0}x{1}+20+20".format(50,50))

if __name__ == "__main__":
    mainW = mainWindow()

    passW = password.passwordWindow()
    passW.resizable(False, False)
    passW.attributes("-topmost", True)
    passW.mainloop()

password.py

importtkinter as tk import mainWindow

class passwordWindow(tk.Tk):
    def __init__(self):

        tk.Tk.__init__(self)
        self.title("Password")

        self.frame = tk.Frame(height=2, bd=1, relief=tk.SUNKEN)
        self.frame.pack(fill=tk.X, padx=5, pady=5)

        self.label = tk.Label(self.frame, text="This Label is packed\nin the Password's Frame.")
        self.label.pack(fill=tk.BOTH, expand=1)

Результат: uhhhh...

Излишне говорить, что это нежелательный эффект.Часть «Метка» должна быть в окне пароля!Любая подсказка, почему я получаю этот результат?Заранее спасибо !!

1 Ответ

0 голосов
/ 16 мая 2018

Первая проблема, которую я вижу, это то, что вы дважды используете Tk() здесь.Вместо использования Tk() для нового окна используйте Toplevel().Toplevel предназначен для создания новых окон после генерации главного окна.

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

Короче говоря, ваш код должен выглядеть следующим образом:

mainWindow.py

import tkinter as tk
import password

class mainWindow(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)

        self.title("mainWindow")
        self.geometry("{0}x{1}+20+20".format(50,50))

if __name__ == "__main__":
    mainW = mainWindow()
    passW = password.passwordWindow(mainW)
    passW.resizable(False, False)
    passW.attributes("-topmost", True)
    mainW.mainloop()

password.py

import tkinter as tk
import mainWindow

class passwordWindow(tk.Toplevel):

    def __init__(self, controller):
        tk.Toplevel.__init__(self, controller)
        self.title("Password")

        self.frame = tk.Frame(self, height=2, bd=1, relief=tk.SUNKEN)
        self.frame.pack(fill=tk.X, padx=5, pady=5)

        self.label = tk.Label(self, text="This Label is packed\nin the Password's Frame.")
        self.label.pack(fill=tk.BOTH, expand=1)

Результаты:

enter image description here

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