【问题标题】:Is it bad practice to use tkinter variable classes as class attributes?使用 tkinter 变量类作为类属性是不好的做法吗?
【发布时间】:2017-05-26 02:24:19
【问题描述】:

正如您从我的代码中看到的那样,我将 tk.Frame 子类化为 tkinter gui 创建自定义小部件。我将在主 gui 中实例化此类,并且需要定期更改其中标签的值。如果我使用 tkinter 变量类 StringVar() 我将需要使用它的 .set() 方法来更改引用它们的标签的值。

这是不好的做法吗?我的意思是,如果我以外的其他人要使用这个自定义小部件,他们必须知道使用 .set() 方法来传递一个新值。我觉得这件事有些不对劲……也许我想多了。谢谢。

import tkinter as tk

class CurrentTempFrame(tk.Frame):
    def __init__(self, parent, width=200, height=120,
                 background_color='black',
                 font_color='white',
                 font = 'Roboto'):

    # Call the constructor from the inherited class
    tk.Frame.__init__(self, parent, width=width, height=height,
                      bg=background_color)

    # Class variables - content
    self.temperature_type = tk.StringVar()
    self.temperature_type.set('Temperature')
    self.temperature_value = tk.StringVar()
    self.temperature_value.set('-15')
    self.temperature_units = tk.StringVar()
    self.temperature_units.set('°F')


    self.grid_propagate(False)           # disables resizing of frame
    #self.columnconfigure(0, weight=1)
    #self.rowconfigure(0, weight=1)

    title_label = tk.Label(self,
                           textvariable=self.temperature_type,
                           font=(font, -20),
                           bg=background_color,
                           fg=font_color)

    value_label = tk.Label(self,
                           textvariable=self.temperature_value,
                           font=(font, -80),
                           bg=background_color,
                           fg=font_color)

    units_label = tk.Label(self,
                           textvariable=self.temperature_units,
                           font=(font, -50),
                           bg=background_color,
                           fg=font_color)

    title_label.grid(row=0, column=0)
    value_label.grid(row=1, column=0)
    units_label.grid(row=1, column=1, sticky='N')


if __name__ == "__main__":
    root = tk.Tk()
    current_temp = CurrentTempFrame(root, font_color='blue')
    current_temp.temperature_value.set('100')
    current_temp.grid(column=0, row=0, sticky='NW')
    root.mainloop()

【问题讨论】:

    标签: python python-3.x user-interface tkinter


    【解决方案1】:

    这是不好的做法吗?我的意思是,如果我以外的其他人要使用这个自定义小部件,他们必须知道使用 .set() 方法来传递一个新值。 [...]。

    你的做法是不错的做法。将一个类的实例变量作为另一个类的实例是完全可以接受的。类实例来自tkinter 没有区别。

    然而,如果其他人将使用您的课程,您应该记录它。给类及其所有公共方法文档字符串。在类中,清楚地记录每个实例变量的类型,以及它们的用途。对方法做同样的事情。记录该方法的用途和正确用法。

    换句话说,记录您的类 API。确保它清晰简洁,并且可以被其他人理解。这样您就可以确保您的课程的未来用户(包括您自己)能够理解您的课程的用途以及应该如何使用它。

    【讨论】:

    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2016-09-19
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多