【发布时间】:2019-06-05 18:03:24
【问题描述】:
我正在尝试使用 Tkinker 开发我自己的 GUI 应用程序并努力解决以下问题:
我不知道如何使用另一个类数据库中负责使用 db 的函数从属于 Window 类的 AddPage 类中获取 EntryDateVaraiable。
我已经尝试过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)
【问题讨论】:
-
您还没有在
DataBase的上下文中指定app是什么,为什么您期望app.containter等会起作用? -
假设
app是您在main()期间实例化的东西,例如app=Window(),这不是正确的OOP 方法,因为您的DataBase类依赖于在对象本身之外创建的东西。在大多数情况下,对象应该是自包含的,如果在类之外有外部引用,则应该是传入的对象,而不是隐含地期望在您的全局范围内已经存在。 -
@Idlehands 所以你建议创建另一个主类,其中将包含应用程序的其余部分,然后我应该能够引用其他子类中的适当属性?
-
正如@stovfl 提到的,这些类应该是独立的。您只需要弄清楚类之间的关系以及如何在它们之间传递所需的信息而不依赖于特定的对象。例如。在您的
.Add()方法中,不要直接从 main 中创建的app对象(DataBase不应该自己知道)读取一堆str,而是传入 @ 987654339@ 对象本身作为def Add(self, entry_var, type_var, ...)之类的参数,并使用DB.Add(str(app.container...), ...)调用它,您可以直接访问app。