Проблема с окном верхнего уровня

#python #tkinter

#python #tkinter

Вопрос:

У меня есть основной модуль и еще один, который создает Toplevel объект. Когда я пытаюсь вызвать последний из первого модуля, я не вижу Text виджета или Button виджета, но геометрия и заголовок работают:

работает

При попытке вызвать второй модуль в качестве основного я вижу два окна, первое с геометрией и заголовком, а второе с Button , Text и неправильным заголовком (tk).

два окна

Вот мой основной модуль

 import tkinter as tk
from Calendar import show_calendar
from Notes_widget import show_notes_widget

class MainMenu(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self.init_main()

        # Настройка фрейма на главном окне
    def init_main(self):
        self.btn1 = tk.Button(text='Выбрать дату', width=20, height=3, command=show_calendar)
        self.btn2 = tk.Button(text='Ввести задачу', width=20, height=3, command=show_notes_widget)

        self.btn1.pack()
        self.btn2.pack()


if __name__ == '__main__':
    # Создание главного окна
    root = tk.Tk()

    # Создание фрейма на главном окне
    app = MainMenu(root)
    app.pack()

    # Настройка параметров главного окна
    root.title('ИВРО')
    root.width = 180
    root.height = 110
    root.x = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2
    root.y = (root.winfo_screenheight() - root.winfo_reqheight()) / 2
    root.geometry(f'{root.width}x{root.height} {int(root.x - root.width / 2)} {int(root.y - root.height / 2)}')
    root.resizable(False, False)

    root.mainloop()
  

И еще один

 import tkinter as tk

class NotesWidget(tk.Toplevel):
    def __init__(self):
        tk.Toplevel.__init__(self)
        self.init_child()

    def init_child(self):
        self.title("Введите заметку")
        self.btn = tk.Button(text='Hello')
        self.btn.pack()
        self.text = tk.Text(bg="darkgreen", fg='white')
        self.text.pack()
        self.geometry('800x800')
        self.grab_set()
        self.focus_set()


def show_notes_widget(): 
    notes_widget=NotesWidget()
    notes_widget.mainloop()
  

На мой взгляд, проблема здесь

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

Ответ №1:

Для случая 1: это потому, что вы не указали родительский Button Text элемент виджетов and , поэтому они будут дочерними элементами корневого окна, а не Toplevel окна. Вы должны указать родительский элемент при их создании:

 import tkinter as tk

class NotesWidget(tk.Toplevel):
    def __init__(self):
        tk.Toplevel.__init__(self)
        self.init_child()

    def init_child(self):
        self.title("Введите заметку")
        self.btn = tk.Button(self, text='Hello') # specify parent
        self.btn.pack()
        self.text = tk.Text(self, bg="darkgreen", fg='white') # specify parent
        self.text.pack()
        self.geometry('800x800')
        self.grab_set()
        self.focus_set()


def show_notes_widget(): 
    notes_widget=NotesWidget()
    notes_widget.mainloop()
  

Для случая 2: это потому, что при создании Toplevel окна root окно (экземпляр Tk() ) будет создано неявно для вас.