无法在 TKinter 中显示数据库中的数据

Posted

技术标签:

【中文标题】无法在 TKinter 中显示数据库中的数据【英文标题】:Trouble displaying data from a database in TKinter 【发布时间】:2017-07-22 01:41:42 【问题描述】:

我正在使用 sqlite3 和 tkinter 在 python 中创建一个数据库。这是我第一次做这样的事情,所以我一直在使用互联网上的示例来帮助构建它。这在大多数情况下都有效,但是现在我需要能够在表中显示数据库中的数据,而我使用的示例似乎不适用于我。我已尝试查找其他解决方案,但似乎没有任何帮助。

问题是当我去打开表时,它没有被创建。该程序只是打开一个新窗口并将其保留在该窗口中。没有错误,所以我不知道到底是什么问题。

这是我到目前为止创建的全部代码:

from tkinter import *
import sqlite3

con = sqlite3.connect('test.db')
cur = con.cursor()

class Welcome():
    def __init__(self,master):
        self.master = master
        self.master.geometry('170x110+100+200')
        self.master.title('Welcome!')
        self.label1=Label(self.master,text='Test Database Main Menu',fg='red').grid(row=0,column=1)
        self.button1=Button(self.master,text="Enter Data",fg='green',command=self.gotodataentry).grid(row=1,column=1)
        self.button2=Button(self.master,text="Data Records",fg='blue',command=self.gotorecords).grid(row=2,column=1)
        self.button3=Button(self.master,text="Exit",fg='red',command=self.exit).grid(row=3,column=1)

    def exit(self):
        self.master.destroy()

    def gotodataentry(self):    
        root2=Toplevel(self.master)
        myGUI=DataEntry(root2)

    def gotorecords(self):
        root2=Toplevel(self.master)
        mygui=Records(root2)

class DataEntry():
    def __init__(self,master):
        self.master = master
        self.master.geometry('250x200+100+200')
        self.master.title('Data Entry')

        self.label2=Label(self.master,text='Welcome to the data entry menu',fg='red').grid(row=0,column=0)
        self.label3=Label(self.master,text='Please enter some text',fg='black').grid(row=3,column=0)
        self.label4=Label(self.master,text='Please enter a number',fg='black').grid(row=4,column=0)

        self.text1=StringVar()
        self.text_entry=Entry(self.master,textvariable=self.text1).grid(row=3,column=1)
        self.int1=IntVar()
        self.int_entry=Entry(self.master,textvariable=self.int1).grid(row=4,column=1)
        self.button4=Button(self.master,text="Save",fg='red',command=lambda: self.savedata(self.text1.get(), self.int1.get())).grid(row=7,column=0)
        self.button5=Button(self.master,text="Exit",fg='red',command=self.exit).grid(row=9,column=0)

    def exit(self):
        self.master.destroy()

    def savedata(self, text1, int1):
        con = sqlite3.connect('test.db')
        cur = con.cursor()
        cur.execute('INSERT INTO Data (t1, i1) VALUES (?,?)', (text1, int1))
        con.commit()
        print('Record inserted in Data')

def Records(self):
    def __init__(self, master):
        self.master = master
        self.master.geometry('250x200+100+200')
        self.master.title('Records')
        self.connection = sqlite3.connect('test.db')
        self.cur = self.connection.cursor()
        self.textLabel = Label(self.master, text="Text", width=10)
        self.textLabel.grid(row=0, column=0)
        self.intLabel = Label(self.master, text="Number", width=10)
        self.intLabel.grid(row=0, column=1)
        self.showallrecords()

    def showallrecords(self):
        Data = self.readfromdatabase()
        for index, dat in enumerate(Data):
            Label(self.master, text=dat[0]).grid(row=index+1, column=0)
            Label(self.master, text=dat[1]).grid(row=index+1, column=1)

    def readfromdatabase(self):
        self.cur.execute("SELECT * FROM Data")
        return self.cur.fetchall()

def main():
     root=Tk()
     myGUIWelcome=Welcome(root)
     root.mainloop()

if __name__ == '__main__':
     main()

这是我正在努力解决的部分:

def Records(self):
        def __init__(self, master):
            self.master = master
            self.master.geometry('250x200+100+200')
            self.master.title('Records')
            self.connection = sqlite3.connect('test.db')
            self.cur = self.connection.cursor()
            self.textLabel = Label(self.master, text="Text", width=10)
            self.textLabel.grid(row=0, column=0)
            self.intLabel = Label(self.master, text="Number", width=10)
            self.intLabel.grid(row=0, column=1)
            self.showallrecords()

        def showallrecords(self):
            Data = self.readfromdatabase()
            for index, dat in enumerate(Data):
                Label(self.master, text=dat[0]).grid(row=index+1, column=0)
                Label(self.master, text=dat[1]).grid(row=index+1, column=1)

        def readfromdatabase(self):
            self.cur.execute("SELECT * FROM Data")
            return self.cur.fetchall()

有人可以帮我找出问题所在吗?抱歉,如果解决方案非常简单,就像我说的,这是我第一次做这样的事情。

【问题讨论】:

【参考方案1】:

你说得对,解决方案非常简单:D

改变

def Records(self):

class Records:

代码完美运行

【讨论】:

没问题! (如果你按下绿色勾号,它会标记为正确)

以上是关于无法在 TKinter 中显示数据库中的数据的主要内容,如果未能解决你的问题,请参考以下文章

Tkinter 错误:无法识别图像文件中的数据

无法使用 tkinter 将我的数据添加到 mysql

如何通过在数据库中的两个表中使用卷号提及来获取所有详细信息并在 Tkinter GUI 中显示?

列表框在tkinter中显示数据库中的表

Tkinter - 无法理解为什么在两个输入框中同时输入数据。

无法将图像添加到 tkinter 中的类