Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 构建多个框架的容器方法不起作用_Python_Oop_Tkinter - Fatal编程技术网

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

Python 构建多个框架的容器方法不起作用,python,oop,tkinter,Python,Oop,Tkinter,我正在尝试使用tkinter制作一个GUI,它允许添加、删除和更新数据库。我想用它来创建框架。不过,我添加了自己的界面,包括按钮、标签等。我没有得到我想要的GUI,而是得到了一个空白的tkinter窗口。(有些评论只是我的笔记)非常感谢您的帮助。非常感谢。 代码如下: import sqlite3 class mainclass(tk.Tk): def __init__(self, *args,**kwargs): tk.Tk.__init__(self,*args,

我正在尝试使用tkinter制作一个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() 

导入sqlite3 类main类(tk.tk): 定义初始化(self,*args,**kwargs): tk.tk.\uuuuu初始化(self,*args,**kwargs) 容器=tk.框架(自身) self.frames={} #将框架字典打包到容器中 #对于F in(主数据库GUI): frame=maindatabasegui(容器,自身) self.frames[maindatabasegui]=帧 frame.grid(行=0,列=1,粘性='nsew') #召唤另一个班级 self.show_框架(maindatabasegui) def显示画面(自身,续): 帧=自身帧[续] frame.tkraise() 类maindatabasegui(tk.Frame): 定义初始化(自、父、控制器): tk.Frame.\uuuu init\uuuuu(自,父) #自几何(“500x500”) #拟制作的标签清单 self.labels=[('fnamelab',2,'First Name'),('lnamelab',4,'Last Name')\ ('addresslabel',6,'Address'),('citylabel',8,'City')\ (“工作标签”,10,“职业”)] #拟登记的项目清单 self.entrys=[('fnamelabel',2),('lnamelabel',4)\ ('addresslabel',6),('citylabel',8)\ (“工作标签”,10)] 对于self.labels中的组: self.labelmaker(组[0],组[2],组[1]) 对于self.entrys中的组: self.entrymaker(组[0],组[1]) #下拉菜单变量 self.selectedrecord=tk.StringVar() self.addbutton=tk.Button(self,padx=10,pady=10,width=30,relief='raised',command=lambda:self.addrecord()) self.addbutton.config(文本='addrecord') self.addbutton.grid(行=12,列=1,列span=2) self.viewbutton=tk.Button(self,padx=10,pady=10,width=30,relief='raised',command=lambda:self.viewrecord()) self.viewbutton.config(文本=‘查看记录’) self.viewbutton.grid(行=14,列=1,列span=2) self.deletebutton=tk.Button(self,padx=10,pady=10,width=30,relief='raised',command=lambda:self.deleterecord()) self.deletebutton.config(文本='Delete Record') self.deletebutton.grid(行=16,列=1,列span=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,浮雕=‘凸起’) self.statuslabel.grid(行=18,列=1,列span=2) #列表最初没有指定(请注意,您可以只提及变量,而不使用默认值和选项列表) self.addedrecords=tk.OptionMenu(self,self.selectedrecord,self.selectedrecord.set('Select Record'),()) self.addedrecords.grid(行=2,列=3,padx=10) #消息小部件 self.viewspace=tk.Message(self,text='Record Details',relief='sunken') self.viewspace.grid(行=4,列=3,padx=10) #SQL部分 self.conn=sqlite3.connect('addressbookdb.sqlite') self.curs=self.conn.cursor() self.curs.execute(“”)如果不存在,则创建表( id整数非空主键自动递增唯一, 名字文本, 姓氏文本, 地址文本, 城市文本, 作业文本“”) rows=self.curs.execute(“”“从地址“”中选择名字和姓氏”) 如果行不是无: menu=self.addedrecords['menu'] 菜单。删除(0,'end') 对于行中的行: #行是一个元组 名称=行[0]+“”+行[1] menu.add_命令(label=name,command=lambda value=name:self.selectedrecord.set(value)) self.conn.commit() self.conn.close() #不要重复代码,而是创建一个包含元组的列表 #并为对象指定字符串属性名称 #这些属性仍然属于self对象 def labelmaker(self、labelname、textval、rowpos): setattr(self,labelname,tk.Label(self,text=textval,anchor='w',width=10)) getattr(self,labelname).grid(行=rowpos,列=1,pady=10,padx=10) def entrymaker(自身、entryname、rowpos): setattr(self,entryname,tk.Entry(self,width=20,borderwidth=5)) getattr(self,entryname).grid(行=rowpos,列=2,pady=10,padx=10) def添加记录(自我): #从输入框中获取所有字段 firstname=self.fnamelab.get() lastname=self.lnamelab.get() address=self.addresslabel.get() city=self.citylabel.get() job=self.joblabel.get() #创建所有条目的列表,并检查是否有空条目 comparelist=[firstname,lastname,address,city,job] pos=[i表示枚举(比较列表)中的i,f,如果len(f)<1] #如果所有字段都不是空的,则添加数据 #else告诉用户 如果长度(位置)>0: self.statuslabel.grid_-forget() self.statuslabel.config(文本='请填写所有必填字段') self.statuslabel.grid(行=18,列=1,列span=2) 其他: #这仅用于收集要添加的名称 name=str(firstname)+''+str(lastname) #将记录动态添加到下拉菜单中 menu=self.addedrecords['menu'] menu.add_命令(label=name,command=lambda value=name:self.selectedrecord.set(value)) #SQL扇区
class mainclass(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)
        container.pack()
        ...