#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()
) будет создано неявно для вас.