Tkinter语言 - 通过类给出缩放的变量选项的名称



我开始学习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()

如果变量将作为Scales类的实例变量存在,那么绝对没有理由给它们单独命名;对它们的每个引用都将在某个特定实例的上下文中。 您可能希望定义一个get()方法来执行类似return self.variable.get()的操作,以方便类的用户。

如果变量位于类之外的某个地方,那么Scales不应该关心它们的名称是什么;将变量本身作为参数传递给类构造函数,并将其作为variable=选项传递给Scale()

只需在创建的每个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()

完成此操作后,您可以self.scale1.variable访问Scales实例中每个Scale实例的变量(并在添加后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()

最新更新