【问题标题】:Creating multiple widgets within a class frame在类框架中创建多个小部件
【发布时间】:2020-03-10 10:14:31
【问题描述】:

在简单地尝试组织我的代码时,我在网上发现最好在需要时将大部分代码放入类中。所以在这样做时,我想我会尝试使用create_labelscreate_buttons 方法创建一个frame class

我的目标是能够创建 2 个或更多风格相似的单独框架(因此我发现最好创建一个框架类)。然后,使用方法,创建标签、按钮和其他小部件,并允许它们在各自的框架内轻松移动。

这是我的代码:

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 个按钮。但是,没有错误,这使得很难确定这就是为什么只存在最新的按钮和框架。我什至不认为这是一个框架或小部件“覆盖”另一个的情况。我认为第二帧/小部件似乎覆盖第一帧/小部件。

感谢任何帮助。

【问题讨论】:

  • 确实应该将大部分代码放到类中。但是,您放入其中的方式和内容决定了未来的易用性。对于 tkinter,创建类是有意义的,如图所示 here

标签: python class tkinter frame code-organization


【解决方案1】:

问题在于您的layout 函数。两个框架都在row=0column=0 上进行grided,因为您没有将任何特定的行和列传递给函数。因此,可以看到帧的覆盖

您的代码中的另一个问题(可能)是 frame_1frame_2 按钮不属于 Frame 小部件,而是属于根 window

【讨论】:

  • 哦,我认为窗口可以被视为另一个“容器”,就像框架一样。此外,我重写了代码以指定帧的位置,但它似乎仍然被覆盖。
  • 如果我将分配 frame_1 和 frame_2 的行中的 'window' 替换为 tk.Frame,我会收到此错误:AttributeError: type object 'Frame' has no attribute 'tk'
  • 考虑到您的第一个问题,现在框架不会彼此重叠。这可以看作是用 pinkgreen 标记的清晰区域
  • 我的错误。我的意思是说按钮似乎仍然会覆盖。当我调用按钮方法时创建按钮。父母填写为自我。由于 self 被分配给特定的框架,我认为这会起作用。
  • self 在您的情况下是 .frame 对象。您没有将self 作为master 传递给Button.__init__。此外,Button.__init__ 需要一个自己的 Button 实例。所以,目前您对__init__ 的调用如下:(.frame, master=window, text=text, command=command)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2016-11-05
  • 2014-02-26
  • 2015-02-06
  • 2015-01-27
  • 2021-05-29
  • 2017-03-12
相关资源
最近更新 更多