Python 如何将一个类变量传递给另一个类?
我正在做一个条形码发生器。我需要类GUI中的输入由类条形码读取,以便它可以在画布上打印行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() ...
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在原始代码中的错误。这就是全部。