我正在制作条形码生成器。我需要类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以显示条形码
答案 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的当前值对其进行更新。