我想要呈现左侧自定义小部件3次。左,中,右。
我试图关注并混合我找到的一些例子,但我只提供了一个小部件。
我添加了colout以获得一些线索,但我无法找到我做错的事。
这是代码:
import sys
import tkinter as tk
#import tkinter.ttk, Font, Label, Frame as tk
#import tkinter.ttk as tk
#https://stackoverflow.com/questions/27614037/python-3-tkinter-create-text-widget-covering-100-width-with-grid?rq=1
# https://stackoverflow.com/questions/7591294/how-to-create-a-self-resizing-grid-of-buttons-in-tkinter
# http://effbot.org/tkinterbook/grid.htm
# 02. Pruebo cambiando llamada de funcion de clase a metodo de instancia
class Cuadro(tk.Frame):
def __init__(self, parent, *args, **kargs):
# super().__init__(root)
tk.Frame.__init__(self, parent, *args, **kargs)
#Create & Configure frame
frame = tk.Frame(parent)
frame.grid(row=0, column=0, sticky="NSEW")
#Create a 3x3 (rows x columns) grid of labels inside the frame
for row_index in range(3):
#tk.Grid.rowconfigure(frame, row_index, weight=1) # version 02
frame.rowconfigure(row_index, weight=1) # version 02
for col_index in range(3):
#tk.Grid.columnconfigure(frame, col_index, weight=1) # version 02
frame.columnconfigure(col_index, weight=1) # version 02
lbl = tk.Label(frame, text = str((row_index *3) + col_index + 1)) #create a button inside frame
#lbl.grid(row=row_index, column=col_index, sticky=N+S+E+W)
lbl.grid(row=row_index, column=col_index, sticky="NSEW")
#Create & Configure root
class Application(tk.Frame):
def __init__(self, parent):
tk.Grid.rowconfigure (parent, 0, weight=1)
tk.Grid.columnconfigure(parent, 0, weight=1)
tk.Grid.columnconfigure(parent, 1, weight=1)
tk.Grid.columnconfigure(parent, 2, weight=1)
self.cuadro1 = Cuadro(parent)
self.cuadro1.config(background="red")
self.cuadro1.grid(row=0, column=0, sticky="NSEW")
self.cuadro2 = Cuadro(parent)
self.cuadro2.config(bg="green")
self.cuadro2.grid(row=0, column=1, sticky="NSEW")
self.cuadro3 = Cuadro(parent)
self.cuadro3.config(bg="blue")
self.cuadro3.grid(row=0, column=2, sticky="NSEW")
def main():
root = tk.Tk()
root.title(sys.argv[0]) # version 02
myapp = Application(root)
root.mainloop()
if __name__ == '__main__':
main()
这就是结果:
有什么问题?
答案 0 :(得分:0)
你的三个Cuadro对象根本没有内容 - 它们是有效的帧,因为你继承自tk.Frame并且调用了超类__init__()
,但你对它们完全没有做任何事情。相反,每个人都创建了一个完全独立的框架,没有连接到Cuadro本身,并将其放置在父视图中的row = 0,column = 0。这些中的每一个都覆盖了前一个,并且最初放置在行= 0,列= 0的红色Cuadro,因此您最终获得了3x3网格的单个可见副本,并且没有红色区域。
你在应用程序中犯了同样的错误 - 它是一个有效的框架,但你没有添加任何内容,而是你创建了每个Cuadro作为应用程序父代的直接子代(Tk根窗口)。
只有像这样创建小部件的类是完全有效的,但如果你不打算将它们用作小部件本身,它们不应该从Tk小部件类派生。