如何将一个类变量传递给另一个类?

时间:2018-11-30 09:02:43

标签: python oop tkinter

我正在制作条形码生成器。我需要类Barcode读取类GUI中的输入,以便它可以在画布上打印线条。

from tkinter import *
class GUI(Frame):
    def __init__(self, master=None):
    ...
        self.code_input = Entry(master)
        self.code_input.pack()
        self.code = self.code_input.get()
    ...
        self.barcode = Barcode(master, height=250, width=200)
        self.barcode.pack()
        self.barcode.draw()
    ....

class Barcode(Canvas):
    def draw(self):
        self.ean = GUI.code

如果我像上面这样直接引用,它会显示AttributeError: type object 'GUI' has no attribute 'code'

如果我使用继承方法(基于https://stackoverflow.com/a/19993844/10618936),class Barcode(Canvas, GUI)表示与以前相同

如果我使用setter和getter方法:

class GUI(Frame)
    def __init__(self, master=None):
    ...
        @property
        def code(self):
            return self.__code

        @code.setter
        def code(self, code):
            self.__code = code

然后self.ean = GUI.code,它将不会运行程序并说 改为TypeError: 'property' object is not subscriptable

如何解决此问题?我的程序的结构真的不好吗?我真的一点也不擅长编程……我只是想将GUI中的变量转移到Barcode类,以便它可以计算并将结果返回给GUI以显示条形码

2 个答案:

答案 0 :(得分:2)

您需要创建GUI的实例,否则,您只是引用未为其定义code的静态类。您可以像本例一样访问它

class A():
    def __init__(self):
        self.code = "A"

class B():
    def __init__(self):
        self.code = "B"
    def foo(self):
        print(self.code + A().code)

b = B()
b.foo() # Outputs "BA"

否则,要像在类中访问静态变量一样访问它,您需要在类根级别内对其进行定义

class A():
    code = "C"
    def __init__(self):
        self.code = "A"

class B():
    def __init__(self):
        self.code = "B"
    def foo(self):
        print(self.code + A.code)

b = B()
b.foo() # Outputs "BC"

答案 1 :(得分:1)

您应该将GUI对象传递给Barcode类,此时创建Barcode实例的实例是self。如果您希望Barcode位于GUI框架内,则也可以将其直接用作Canvas母版。
要注意的另一件事是,现在使用self.code并将其保留为空字符串,因为只有在创建Entry小部件之后才定义它,此时它是空的。您当时想对内容进行某些操作时,应在条目上使用get

from tkinter import *

class GUI(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.code_input = Entry(self)
        self.code_input.pack()

        self.barcode = Barcode(self, height=250, width=200)
        self.barcode.pack()

        Button(self, text="Update Barcode", command=self.barcode.draw).pack()


class Barcode(Canvas):
    def __init__(self, master, height, width):
        Canvas.__init__(self, master, height=height, width=width)
        self.master = master
        self.text = self.create_text((100,100))

    def draw(self):
        self.itemconfig(self.text, text=self.master.code_input.get())        

root = Tk()
gui = GUI(root)
gui.pack()
root.mainloop()

出于说明目的,我在画布上创建一个文本对象,并用Button单击时的Entry的当前值对其进行更新。