Как передать переменную класса другому классу? - PullRequest
0 голосов
/ 30 ноября 2018

Я делаю генератор штрих-кода.Мне нужно, чтобы входные данные в классе GUI были прочитаны классом Barcode, чтобы он мог печатать строки на холсте.

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 Штрих-код (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, чтобы она могла вычислятьи вернуть результат обратно в графический интерфейс для отображения штрих-кода

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Вы должны передать объект GUI в класс Barcode, который в момент создания экземпляра Barcode равен self.Если вы хотите, чтобы Barcode находился внутри фрейма GUI, вы также можете напрямую использовать его как мастер Canvas.
Еще одна вещь, на которую стоит обратить внимание, это то, что у вас сейчас, self.code будетбыть и оставаться пустой строкой, так как вы определяете ее только после того, как создали виджет Entry, и в этот момент он пуст.Вы должны использовать get в Entry в то время, когда вы хотите что-то сделать с содержимым в этой точке.

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()

В целях иллюстрации я создаю текстовый объект на холсте и обновляю его, используя текущийзначение ввода по нажатию кнопки.

0 голосов
/ 30 ноября 2018

Вам необходимо создать экземпляр 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...