构建多个框架的容器方法不起作用



我正在尝试使用tkinter制作一个GUI,该GUI允许添加、删除和更新数据库。我想使用这里提到的在帧之间切换的方法来创建帧。然而,我添加了我自己的界面,包括按钮、标签等。我没有得到我想要的GUI,相反,我得到了一个空白的tkinter窗口。(有些评论只是我的笔记(非常感谢您的帮助。非常感谢。代码如下:

import sqlite3
class mainclass(tk.Tk):
def __init__(self, *args,**kwargs):
tk.Tk.__init__(self,*args,**kwargs)
container = tk.Frame(self)
self.frames = {}
#pack the dictionary of frames into the container
#for F in (maindatabasegui):
frame = maindatabasegui(container, self)
self.frames[maindatabasegui] = frame
frame.grid(row = 0,column = 1,sticky = 'nsew')
#calling upon another class
self.show_frame(maindatabasegui)
def show_frame(self,cont):
frame = self.frames[cont]
frame.tkraise()

class maindatabasegui(tk.Frame):
def __init__(self, parent,controller):
tk.Frame.__init__(self, parent)
#self.geometry("500x500")

#list of labels to be made
self.labels = [('fnamelabel',2,'First Name'),('lnamelabel',4,'Last Name'), 
('addresslabel',6,'Address'),('citylabel',8,'City'),
('joblabel',10,'Occupation')]
#list of entry to be made
self.entrys = [('fnamelabel',2),('lnamelabel',4), 
('addresslabel',6),('citylabel',8),
('joblabel',10)]
for group in self.labels:
self.labelmaker(group[0],group[2],group[1])
for group in self.entrys:
self.entrymaker(group[0],group[1])
#variable for dropdown menu
self.selectedrecord = tk.StringVar()
self.addbutton = tk.Button(self, padx = 10, pady = 10, width = 30, relief = 'raised', command = lambda: self.addrecord())
self.addbutton.config(text = 'Add Record')
self.addbutton.grid(row = 12, column = 1, columnspan = 2)
self.viewbutton = tk.Button(self, padx = 10, pady = 10, width = 30, relief = 'raised',command = lambda:self.viewrecord())
self.viewbutton.config(text = 'View Record')
self.viewbutton.grid(row = 14, column = 1, columnspan = 2)
self.deletebutton = tk.Button(self,padx = 10,  pady = 10, width = 30, relief = 'raised', command = lambda: self.deleterecord())
self.deletebutton.config(text = 'Delete Record')
self.deletebutton.grid(row = 16, column = 1, columnspan = 2)
#self.editbutton = tk.Button(self,padx = 10, pady = 10, width = 30, relief = 'raised', command = lambda)
self.statuslabel = tk.Label(self,  padx = 10, pady = 10, width = 30, relief = 'raised')
self.statuslabel.grid(row = 18, column = 1, columnspan = 2)
#list is not specified initially(notice that you can just mention the variable, without the default and list of options)
self.addedrecords =  tk.OptionMenu(self, self.selectedrecord,self.selectedrecord.set('Select Record'),())
self.addedrecords.grid(row = 2, column = 3, padx = 10)
#message widget
self.viewspace = tk.Message(self,text = 'Record Details',relief = 'sunken') 
self.viewspace.grid(row = 4, column = 3, padx = 10)            
#SQL Section
self.conn = sqlite3.connect('addressbookdb.sqlite')
self.curs = self.conn.cursor()
self.curs.execute('''CREATE TABLE IF NOT EXISTS Addresses (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
first_name TEXT,
last_name TEXT, 
address TEXT,
city TEXT, 
job TEXT)''')
rows = self.curs.execute('''SELECT first_name, last_name FROM Addresses''')
if rows is not None:
menu = self.addedrecords['menu']
menu.delete(0,'end')
for row in rows:
#row is a tuple
name = row[0] + ' ' + row[1]
menu.add_command(label = name , command = lambda value = name: self.selectedrecord.set(value))

self.conn.commit()
self.conn.close()

#instead of repeating the code, create a list with tuples
#and assigned the string attribute name with the object
#these attributes still belong to the self object
def labelmaker(self,labelname,textval, rowpos):
setattr(self,labelname,tk.Label(self, text = textval,anchor = 'w',width = 10))
getattr(self,labelname).grid(row = rowpos, column = 1, pady = 10, padx = 10)
def entrymaker(self,entryname,rowpos):
setattr(self, entryname,tk.Entry(self,width = 20, borderwidth = 5))
getattr(self,entryname).grid(row = rowpos, column = 2, pady = 10, padx = 10)
def addrecord(self):
#gets all the fields from the entry boxes
firstname = self.fnamelabel.get()
lastname = self.lnamelabel.get()
address = self.addresslabel.get()
city = self.citylabel.get()
job = self.joblabel.get()
#creates a list of all the entries and checks if any are empty
comparelist = [firstname, lastname, address, city, job]
pos = [i for i, f in enumerate(comparelist) if len(f) < 1]
#adds data if all fields are not empty
#else tells user
if len(pos) > 0 :
self.statuslabel.grid_forget()
self.statuslabel.config(text = 'Please fill in all the required fields')
self.statuslabel.grid(row = 18, column = 1, columnspan = 2)
else:
#this is only used to collect the names to be added
name = str(firstname) + ' ' + str(lastname)
#dynamically adding the records into the dropdown menu
menu = self.addedrecords['menu']
menu.add_command(label = name, command = lambda value = name: self.selectedrecord.set(value))
#SQL section    
self.conn = sqlite3.connect('addressbookdb.sqlite')
self.curs = self.conn.cursor()
self.curs.execute('''INSERT INTO Addresses 
(first_name, last_name, address,city,job) 
VALUES (?,?,?,?,?)''',(firstname,lastname,address,city,job))
self.statuslabel.grid_forget()
self.statuslabel.config(text = 'Record Loaded')
self.statuslabel.grid(row = 18, column = 1, columnspan = 2)
self.conn.commit()
self.conn.close()
def deleterecord(self):
self.conn = sqlite3.connect('addressbookdb.sqlite')
self.curs = self.conn.cursor()
self.curs.execute('''DELETE FROM Addresses WHERE 
first_name = ? AND last_name = ?''',(self.selectedrecord.get().split()[0],self.selectedrecord.get().split()[1]))
menu = self.addedrecords['menu']
menu.delete(self.selectedrecord.get())
self.selectedrecord.set('Select Record')
self.statuslabel.grid_forget()
self.statuslabel.config(text = 'Record Deleted')
self.statuslabel.grid(row = 18, column = 1, columnspan = 2)
self.conn.commit()
self.conn.close()
self.viewspace.config(text = 'Record Details')
#clearing the view space after deleting
def viewrecord(self):
self.conn = sqlite3.connect('addressbookdb.sqlite')
self.curs = self.conn.cursor()
row = self.curs.execute('''SELECT * FROM Addresses WHERE first_name = ? AND last_name = ?''',(self.selectedrecord.get().split()[0],self.selectedrecord.get().split()[1]))
element = row.fetchone()
self.viewspace.config(text = 'Record Details: n ID = {} n First Name = {} n Last Name = {} n Address = {} n City = {} n Occupation = {}'.format(
element[0],element[1],element[2],element[3],element[4],element[5]))
self.conn.commit()
self.conn.close()
#class EditPage()





root = mainclass()
root.mainloop() 

容器本身必须放置在主窗口中。

class mainclass(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack()
...

最新更新