将tkinter变量类用作类属性是不好的做法吗?

时间:2017-05-26 02:24:20

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

从我的代码中可以看出,我正在为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()

1 个答案:

答案 0 :(得分:2)

  

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

你做的不是坏事。创建类的实例变量,是另一个类的实例是完全可以接受的。类实例来自tkinter

没有区别

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

换句话说,记录您的类API。确保它清晰简洁,并且可以被其他人理解。这就是为什么你可以确定你班级的未来用户 - 包括你自己 - 能够理解你的班级是什么,以及如何使用它。