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

Python 如何将一个类变量传递给另一个类?,python,oop,tkinter,Python,Oop,Tkinter,我正在做一个条形码发生器。我需要类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() ...

我正在做一个条形码发生器。我需要类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对象“GUI”没有属性“code”

如果我使用继承方法(基于),
类条形码(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”对象不是可下标的


如何解决此问题?我的程序结构真的很糟糕吗?我真的一点也不擅长编程。。。我只想将GUI中的变量传输到类Barcode,这样它就可以计算并将结果返回到GUI以显示条形码。您需要创建一个
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"

您应该将
GUI
对象传递给
Barcode
类,在创建
Barcode
实例时,该类是
self
。如果希望
条形码
位于
GUI
框架内,也可以直接将其用作
画布
主控形状。
另一件需要注意的事情是,按照您现在的方式,
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()

出于演示目的,我在画布上创建了一个文本对象,并在单击按钮时使用条目的当前值对其进行更新。

更新:现在我正在尝试另一种结构,类条形码将消失,其功能将移到类GUI中。我对OOP标准的评分可能会下降,但很好。我只需要让程序运行。但是我仍然想知道在另一个类中使用类变量的各种方法,这比我预期的要困难得多。
.code
是一个成员变量,如果不先创建
GUI
对象,就无法访问它。(旁注:我不使用tkinter)用几个简单的例子来解释各种相关概念,看看我的答案,在第一个例子中,每次都创建一个新对象,在第二个例子中都有一个静态代码,这都不是预期的行为。OP似乎对如何在第一个地方做到这一点感到困惑,不管这里的测试用例如何。我希望OP首先了解基本情况,这样她/他就可以根据需要解决的具体案例推断基本情况。在我看来,这是OP的双赢。我理解,但在这种情况下,您仍然没有包括我认为最符合逻辑的选项,即创建类a的实例并将对该类的引用作为参数传递给类B。我并不反对。有很多方法可以通过它,你的是另一个。尽管如此,我的示例还是解决了OP在原始代码中的错误。这就是全部。