Tkinter: Можете ли вы поместить рамку или сетку внутри сетки?

#python #tkinter

Вопрос:

Я пытаюсь создать программу периодической таблицы, и я хочу иметь сетку, подобную настройке, с помощью сетки

Вот изображение эффекта

Возможно ли это и если да, то как. Спасибо.

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

1. Посмотрите на .grid неофициальную документацию здесь .

2. короткий ответ: да, вы можете поместить рамку внутри рамки с помощью сетки. это также довольно просто. просто создайте рамку (или используйте окно в качестве родителя), затем создайте, скажем, еще два кадра и установите родителя в качестве первого кадра и создайте сетку из этих кадров, затем вы можете создать еще несколько кадров, установив их родителей в качестве двух только что упомянутых кадров, а также их сетку, и это будет похоже на кадр внутри кадра, внутри кадра.

Ответ №1:

Да, вы можете, просто дайте вторичным кадрам родительский кадр в качестве аргумента, как и в любом другом виджете в tkinter:

 variable = tk.Widget(parent, widget, specifics)
 

в вашем случае, когда вы в основном хотите отображать одну и ту же информацию для всех элементов, я бы создал подкласс, унаследованный от tk.Frame класса и передающий ему всю соответствующую информацию, таким образом, вам нужно только один раз организовать свои небольшие фреймы.

Возможно, вы захотите начать с чего-то вроде этого:

 import tkinter as tk

class Application(tk.Tk):
    
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        
        self.mainframe = tk.Frame(self)
        self.mainframe.pack(fill="both", expand = True)
        
        
        # note how we're now not calling for the tk.Frame class anymore,
        # since we have our own custom one
        # when calling our class we can now pass information to it
        # right now only the name
        self.vanadium = ElementFrame(self.mainframe, "Vanadium")
        #placing in the main frame
        self.vanadium.grid(row = 0, column = 0)
        
        self.chromium = ElementFrame(self.mainframe, "Chromium")
        #placing in the main frame
        self.chromium.grid(row = 0, column = 1)
        
        self.niobium = ElementFrame(self.mainframe, "Niobium")
        #placing in the main frame
        self.niobium.grid(row = 1, column = 0)
        
        self.molybdenum = ElementFrame(self.mainframe, "Molybdenum")
        #placing in the main frame
        self.molybdenum.grid(row = 1, column = 1)
        
        
class ElementFrame(tk.Frame):
    
    # here we are defining what variables need to be passed for a successful call
    def __init__(self, parent, element):
        tk.Frame.__init__(self, parent)
        
        #pass variables through, like abbreviation, number, etc.
        self.element = element
        #organize your elements frame
        self.elementlabel = tk.Label(self, text = element)
        self.elementlabel.grid(row = 0, column = 0)
        
        
        
app = Application()
app.mainloop()