在 class 框架内创建多个小部件
Creating multiple widgets within a class frame
在简单地尝试组织我的代码时,我在网上发现最好在需要时将大部分代码放入 classes。所以在这样做的时候,我想我会尝试用 create_labels
和 create_buttons
方法创建一个 frame class
。
我的目标是能够创建 2 个或更多风格相似的独立框架(因此我发现最好制作一个框架 class)。然后,使用方法创建标签、按钮和其他小部件,并允许它们在各自的框架内轻松移动。
所以这是我的代码:
import tkinter as tk
window = tk.Tk()
class MyFrame(tk.Frame):
def __init__(self, parent, **kwargs):
tk.Frame.__init__(self, parent)
self.parent = parent
self.layout(**kwargs)
def labels(self, text, **kwargs):
tk.Label.__init__(self, text=text)
self.layout(**kwargs)
def buttons(self, text, command, **kwargs):
tk.Button.__init__(self, text=text, command=command)
self.layout(**kwargs)
def layout(self, row=0, column=0, columnspan=None, row_weight=None, column_weight=None, color=None, sticky=None, ipadx=None, padx=None, ipady=None, pady=None):
self.grid(row=row, column=column, columnspan=columnspan, sticky=sticky, ipadx=ipadx, padx=padx, ipady=ipady, pady=pady)
self.grid_rowconfigure(row, weight=row_weight)
self.grid_columnconfigure(column, weight=column_weight)
self.config(bg=color)
frame_1 = MyFrame(window, row=0, column=0, sticky="news", color="pink")
frame_1.buttons("Btn_1/Frme_1", quit, row=0, column=0)
frame_1.buttons("Btn_2/Frme_1", quit, row=0, column=1)
frame_2 = MyFrame(window, row=1, column=0, sticky="news", color="green")
frame_2.buttons("Btn_1/Frme_2", quit, row=0, column=0)
frame_2.buttons("Btn_2/Frme_2", quit, row=0, column=1)
window.grid_columnconfigure(0, weight=1)
window.grid_columnconfigure(1, weight=1)
window.grid_rowconfigure(1, weight=1)
window.grid_rowconfigure(0, weight=1)
window.mainloop()
现在我认为我的问题是在 __init__ method
期间,因为每帧应该有 2 个框架和 2 个按钮。然而,没有错误使得更难确定,这就是为什么只存在最新的按钮和框架。我什至不认为这是一个框架或另一个小部件 'covering' 的情况。我认为第二个 frame/widgets 似乎是 覆盖 第一个 frame/widgets.
感谢任何帮助。
问题在于您的 layout
函数。两个框架都在 row=0
和 column=0
上被 grid
ed,因为您没有将任何特定的行和列传递给函数。因此,可以看到帧的覆盖。
您的代码中的另一个问题(可能)是 frame_1
和 frame_2
按钮不属于 Frame
小部件,但是到根 window
在简单地尝试组织我的代码时,我在网上发现最好在需要时将大部分代码放入 classes。所以在这样做的时候,我想我会尝试用 create_labels
和 create_buttons
方法创建一个 frame class
。
我的目标是能够创建 2 个或更多风格相似的独立框架(因此我发现最好制作一个框架 class)。然后,使用方法创建标签、按钮和其他小部件,并允许它们在各自的框架内轻松移动。
所以这是我的代码:
import tkinter as tk
window = tk.Tk()
class MyFrame(tk.Frame):
def __init__(self, parent, **kwargs):
tk.Frame.__init__(self, parent)
self.parent = parent
self.layout(**kwargs)
def labels(self, text, **kwargs):
tk.Label.__init__(self, text=text)
self.layout(**kwargs)
def buttons(self, text, command, **kwargs):
tk.Button.__init__(self, text=text, command=command)
self.layout(**kwargs)
def layout(self, row=0, column=0, columnspan=None, row_weight=None, column_weight=None, color=None, sticky=None, ipadx=None, padx=None, ipady=None, pady=None):
self.grid(row=row, column=column, columnspan=columnspan, sticky=sticky, ipadx=ipadx, padx=padx, ipady=ipady, pady=pady)
self.grid_rowconfigure(row, weight=row_weight)
self.grid_columnconfigure(column, weight=column_weight)
self.config(bg=color)
frame_1 = MyFrame(window, row=0, column=0, sticky="news", color="pink")
frame_1.buttons("Btn_1/Frme_1", quit, row=0, column=0)
frame_1.buttons("Btn_2/Frme_1", quit, row=0, column=1)
frame_2 = MyFrame(window, row=1, column=0, sticky="news", color="green")
frame_2.buttons("Btn_1/Frme_2", quit, row=0, column=0)
frame_2.buttons("Btn_2/Frme_2", quit, row=0, column=1)
window.grid_columnconfigure(0, weight=1)
window.grid_columnconfigure(1, weight=1)
window.grid_rowconfigure(1, weight=1)
window.grid_rowconfigure(0, weight=1)
window.mainloop()
现在我认为我的问题是在 __init__ method
期间,因为每帧应该有 2 个框架和 2 个按钮。然而,没有错误使得更难确定,这就是为什么只存在最新的按钮和框架。我什至不认为这是一个框架或另一个小部件 'covering' 的情况。我认为第二个 frame/widgets 似乎是 覆盖 第一个 frame/widgets.
感谢任何帮助。
问题在于您的 layout
函数。两个框架都在 row=0
和 column=0
上被 grid
ed,因为您没有将任何特定的行和列传递给函数。因此,可以看到帧的覆盖。
您的代码中的另一个问题(可能)是 frame_1
和 frame_2
按钮不属于 Frame
小部件,但是到根 window