Tkinter - 通过类

时间:2017-08-10 18:27:43

标签: python variables tkinter parameters

我开始学习OOP,而且我一直在努力学习一些基本的东西。

在下面的代码中,我创建了一个类Scales(),我想用它创建2个非常相似的比例,只有variable选项不同。

当我致电Scales()并将它们都设为DoubleVar类型时,如何将这些变量的名称作为参数传递?

from tkinter import *
from tkinter import ttk
from PIL import Image, ImageTk
import numpy as np

class Scales(Frame):
    def __init__(self, parent, variable_name, label_text, initial_value,
                 final_value):

        self.parent        = parent
        self.bar_length    = 200
        self.variable_name = variable_name
        self.label_text    = label_text
        self.initial_value = initial_value
        self.final_value   = final_value

        # self.variable_name = DoubleVar()

        self.scale_name = Scale(self.parent, variable=self.variable_name,
                                orient=HORIZONTAL,
                                from_=self.initial_value,
                                to=self.final_value,
                                length=self.bar_length, cursor="hand",
                                label=self.label_text)


class MainApplication(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.slice_number_scale = Scales(self.parent, slice_number,
                                         "Slice Number", 1, 24)


if __name__ == '__main__':
    root = Tk()
    root.geometry("800x600")
    MainApplication(root)
    root.mainloop()

2 个答案:

答案 0 :(得分:2)

如果变量将作为Scales类的实例变量存在,那么绝对没有理由给它们单独的名称;对它们的每一个引用都将在某个特定实例的上下文中。为方便班级用户,您可能希望定义一个类似get()的{​​{1}}方法。

如果变量住在课外的某个地方,那么return self.variable.get()就不应该关心他们的名字了;将变量本身作为参数传递给类构造函数,并将其作为Scales选项传递给variable=

答案 1 :(得分:1)

只需在创建的每个Scale类实例中创建变量,然后通过实例的名称访问它们。这就是我的意思:

from tkinter import *
#from tkinter import ttk
#from PIL import Image, ImageTk
#import numpy as np

class Scale(Frame):
    """ Dummy version of class for testing and illustration. """
    def __init__(self, parent, orient=None, from_=None, to=None, length=None,
                 cursor=None, label=None):
        Frame.__init__(self, parent)  # initialize base class
        self.variable = DoubleVar()  # create variable and make attribute


class Scales(Frame):
    def __init__(self, parent, label_text, initial_value,
                 final_value):

        self.parent        = parent
        self.bar_length    = 200
#        self.variable_name = variable_name
        self.label_text    = label_text
        self.initial_value = initial_value
        self.final_value   = final_value

#        self.variable_name = DoubleVar()

        self.scale1 = Scale(self.parent,
#                            variable=self.variable_name,
                            orient=HORIZONTAL,
                            from_=self.initial_value,
                            to=self.final_value,
                            length=self.bar_length,
                            cursor="hand",
                            label=self.label_text)

        self.scale1.pack()


class MainApplication(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        slice_number = 42
        self.slice_number_scale = Scales(self.parent, slice_number, 1, 24)

root = Tk()
app = MainApplication(root)
app.mainloop()

执行此操作后,您可以将Scale实例中的每个Scales实例的变量视为self.scale1.variable(并在添加后self.scale2.variable)。在MainApplication个实例中,他们可以称为self.slice_number_scale.scale1.variable(和self.slice_number_scale2.variable)。

对于后者,您可能希望向类MainApplication添加方法,以使此类引用更简洁,例如:

class MainApplication(Frame):
       ....
    def get_scale_var1(self):
        return self.slice_number_scale.scale1.variable.get()