Доступ к атрибуту в другом классе Tkinter - ООП - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь разработать собственное приложение с графическим интерфейсом для Tkinker и пытаюсь решить следующую проблему:

Я не могу понять, как получить класс EntryDateVaraiable из AddPage, который является частью класса Window, используя функцию из другого класса Database, которая отвечает за работу с базой данных.

Я уже пробовал почти с любой комбинацией app.EntryDateVaraible, app.container.EntryDateVaraible, app.Frame.EntryDateVaraible ...

и всегда получает ошибки типа:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1544, in __call__
    return self.func(*args)
  File "/home/noxiss/Programming/PythonProgramms/GitHub/Budget_GUI/tk_test.py", line 254, in <lambda>
    AddButton = Button(self,text='Add', command=lambda: DB.Add())
  File "/home/noxiss/Programming/PythonProgramms/GitHub/Budget_GUI/tk_test.py", line 28, in Add
    (str(app.container.AddPage.EntryDateVariable.get()), str(Type.get()), str(Category.get()), str(EntryAmount.get()), str(Payment.get())))
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1906, in __getattr__
    return getattr(self.tk, attr)
AttributeError: container

Код:

class Database:

    db = sql.connect('Budget.db')
    c = db.cursor()

    def CreateTable(self):

        self.c.execute('''CREATE TABLE IF NOT EXISTS dane(ID INTEGER PRIMARY KEY, Date DATE,
         Type TEXT, Category TEXT, Amount REAL, Payment TEXT)''')

    def Commit(self):

        self.db.commit()

    def Add(self):


        self.c.execute('INSERT INTO dane(Date, Type, Category, Amount, Payment) VALUES(?,?,?,?,?)',
            (str(app.EntryDateVariable.get()), str(Type.get()), str(Category.get()), str(EntryAmount.get()), str(Payment.get())))

class Window(Tk):

    def __init__(self):
        #creates container for all pages
        Tk.__init__(self)
        container = Frame(self)
        container.pack(side="top", fill="both", expand = "True")

        container.grid_rowconfigure(0,weight=1)
        container.grid_columnconfigure(0,weight=1)

        menubar = MenuBar(container)
        filemenu = Menu(menubar, tearoff=0)
        filemenu.add_command(label='save settings',)
        self.config(menu=menubar)



        #creates dictionary for list of all pages
        self.frames = {}
        #creates the pages from the dictionary
        for F in (StartPage, MainPage, AddPage):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0,sticky='nsew')

        self.show_frame(StartPage)

    def show_frame(self,cont):

        frame = self.frames[cont]
        frame.tkraise()
class AddPage(Frame):


    def __init__(self,parent,controller):
            Frame .__init__(self,parent)

            EntryDateVariable = StringVar()
            EntryDateVariable .set(DateFunctions.CurrentDate)       

            EntryDate = Entry(self,textvariable=EntryDateVariable)
            EntryDate.grid(row=0,column=1)

1 Ответ

0 голосов
/ 11 января 2019

Вопрос : Доступ к атрибуту в другом классе Tkinter

Не идите этим путем, позвольте class Database независимым от GUI.
Вместо этого передайте данные как <data sequence> в DB.Add(....

  1. Изменить def Add(... на

    def Add(self, data_seq):
        self.c.execute('INSERT INTO dane(Date, ...) VALUES(?, ...)', data_seq)
    
  2. Создать переменную экземпляра class Database в class Window == controller

    class Window(Tk):
        def __init__(self):
            ...
            self.db = Database()
    
  3. Сделать EntryDateVariable переменной экземпляра class AddPage

    self.EntryDateVariable = StringVar()
    
  4. Добавьте метод def insert_data(self) к class AddPage

    def insert_data(self):
        data_seq = [self.EntryDateVariable.get(), ...]
        self.controller.db.Add(data_seq)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...