簡體   English   中英

Tkinter-通過類給比例的變量選項名稱

[英]Tkinter - Give name of variable option of a Scale through a class

我開始學習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()

完成此操作后,您可以將Scales實例中每個Scale實例的變量作為self.scale1.variable (以及self.scale2.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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM