Как правильно разместить checkbox в Tkinter?
При создании окна чекбокс создается на изначальном окне, а не на вторичном, причем другие виджеты размещаются на нужном окне, можно ли как-то исправить?
код:
import tkinter as tk
from tkinter import Tk, ttk, END, Label, Button, Entry, Text, Checkbutton
class CreateWindow(ttk.Frame):
def __init__(self, master):
super().__init__()
self.master = master
self.start_button = Button(master, width=6, text="START", font="Consolas 10", bg="#22A5F1", fg="#fff", relief="flat",)
self.start_button.pack()
self.open_checkbox = Checkbutton(text="Открыть", onvalue=True, offvalue=False)
self.open_checkbox.pack()
class MainWindow(ttk.Frame):
def __init__(self, master):
super().__init__()
self.master = master
self.create_button = Button(master, width=19, text="Create new", font="Consolas 10", bg="#191E2A", fg="#6EC7F4", relief="flat", command=self.create)
self.create_button.pack()
def create(self):
root_create = tk.Toplevel()
Frame = CreateWindow(root_create)
root = Tk()
Frame = MainWindow(root)
root.mainloop()
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
Чтобы элемент управления размещался в нужном окне, нужно первым параметром передавать родительское окно. В вашем коде для кнопок вы это делаете, а для Checkbox - нет.
Также, чтобы кнопки созданные у вас в классе CreateWindow (унаследованном от Frame) размещались в этом фрейме, нужно в родительский класс CreateWindow передавать master, а для дочерних элементов мастером указывать self:
import tkinter as tk
from tkinter import Tk, ttk, END, Label, Button, Entry, Text, Checkbutton
class CreateWindow(ttk.Frame):
def __init__(self, master):
super().__init__(master)
# Кнопку крепим к фрейму (self), а не к самому окну
# (иначе не понятно, зачем вообще наследовались от Frame):
self.start_button = Button(self, width=6, text="START", font="Consolas 10", bg="#22A5F1", fg="#fff", relief="flat",)
self.start_button.pack()
self.open_checkbox = Checkbutton(self, text="Открыть", onvalue=True, offvalue=False)
self.open_checkbox.pack()
class MainWindow(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.master = master
# Кнопку крепим к фрейму (self), а не к самому окну:
self.create_button = Button(self, width=19, text="Create new", font="Consolas 10", bg="#191E2A", fg="#6EC7F4", relief="flat", command=self.create)
self.create_button.pack()
def create(self):
root_create = tk.Toplevel(self.master)
frame = CreateWindow(root_create)
frame.pack() # Не забываем фрейм разместить в окне
root = Tk()
frame = MainWindow(root)
frame.pack() # не забываем фрейм размещать в окне
root.mainloop()
Также можно немного упростить, и CreateWindow сделать наследником Toplevel:
class CreateWindow(tk.Toplevel):
def __init__(self, master):
super().__init__(master)
self.start_button = Button(self, width=6, text="START", font="Consolas 10", bg="#22A5F1", fg="#fff", relief="flat",)
self.start_button.pack()
self.open_checkbox = Checkbutton(self, text="Открыть", onvalue=True, offvalue=False)
self.open_checkbox.pack()
class MainWindow(ttk.Frame):
...
def create(self):
child_window = CreateWindow(self.master)