【问题标题】:Unable to enter input in Entry box on first loading after initializing Database?初始化数据库后首次加载时无法在输入框中输入输入?
【发布时间】:2019-01-31 08:04:33
【问题描述】:

我用 tkinker 编写了一个 Python GUI 程序,可以将文本文件中的行读入数据库。用户可以通过在 GUI 输入框中输入详细信息并按下按钮来在数据库中添加或删除条目。但是,当我运行代码时,我无法在第一次尝试的输入框中键入任何内容,即该框是实心的,无法键入任何内容。

import tkinter as tk
import tkinter.ttk as ttk
from tkinter import StringVar
from tkinter import messagebox
import sqlite3
import os

window = tk.Tk() 

#Food Name label
labelName=ttk.Label(window,text="Name")
txtName=StringVar()
textName=ttk.Entry(window,textvariable=txtName)

#Food Category label
labelCategory=ttk.Label(window,text="Category")
txtCategory=StringVar()
textCategory=ttk.Entry(window,textvariable=txtCategory)

#Initialize Database
def initDatabase():
    file=open("foodList.txt")
    lines=file.readlines()

    conn=sqlite3.connect('foodDatabase.db')
    sql="create table food(name text primary key, category text)"
    conn.execute(sql)
    conn.commit()

    for line in lines:
        line=line.replace("\n","")
        cols=line.split(",")
        name=cols[0]
        category=cols[1]
        sql="insert into food(name,category) values(?,?)"
        conn.execute(sql,(name,category))

    conn.commit()
    conn.close()
    messagebox.showinfo("Success", "Database Initialized!")

if not os.path.exists("foodDatabase.db"): 
    initDatabase()

#Buttons for Insert & Delete
def insertData():
    conn=sqlite3.connect('foodDatabase.db')
    sql="insert into food(name,category) values(?,?)"
    conn.execute(sql,(txtName.get(),txtCategory.get()))
    conn.commit()
    conn.close()
    messagebox.showinfo("Success", "Insert Successful!")

def deleteData(name):
    conn=sqlite3.connect('foodDatabase.db')
    sql="delete from food where name=?"
    conn.execute(sql,(txtName.get(),))
    conn.commit()
    conn.close()
    messagebox.showinfo("Success","Delete Successful!")

#Insert BUtton
buttonInsert=ttk.Button(window,text='Insert',command=insertData)

#Delete Button
buttonDelete=ttk.Button(window,text='Delete',command=deleteData)

window.mainloop()

【问题讨论】:

  • 评论是为其他人提问以获取更多详细信息等,如果您犯了错误或希望添加更多内容等,请按问题下方的编辑按钮。
  • 另外,你有什么错误吗?如果是,请将它们也包含在您的问题中。
  • @Lafexlos 您好,我在我的问题中编辑了我的代码。不,我没有收到任何错误,只是在初始化数据库时无法在输入框中输入任何内容。如果数据库文件已经在文件夹中,我不会遇到任何问题。
  • 最重要的是,您没有使用任何几何管理器(包、网格或位置)。你现在怎么看你的小部件?您使用的是哪个 IDE?
  • @Lafexlos 我认为我放置“messagebox.showinfo”代码的位置有问题..但我无法让它工作。 .txt 很简单,如“123、xyz(下一行)234、abc(下一行)”等

标签: python sql python-3.x sqlite tkinter


【解决方案1】:

ttk.Label 应该是 tk.Label。

我提供了一个基于你的工作示例:

from tkinter import *
from tkinter.messagebox import showinfo
import sqlite3
import os


#Initialize Database
def initDatabase():
    file=open("foodList.txt")
    lines=file.readlines()

    conn=sqlite3.connect('foodDatabase.db')
    sql="create table food(name text primary key, category text)"
    conn.execute(sql)
    conn.commit()

    for line in lines:
        line=line.replace("\n","")
        cols=line.split(",")
        name=cols[0]
        category=cols[1]
        sql="insert into food(name,category) values('{0}','{1}')".format(name,category)
        conn.execute(sql)

    conn.commit()
    conn.close()
    showinfo("Success", "Database Initialized!")

def main():
    window = Tk() 

    window.title("Welcome to test app")
    # window.geometry('350x200')

    if not os.path.exists("foodDatabase.db"): 
        initDatabase()

    #Food Name label
    nombre = StringVar()
    labelName=Label(window,text="Name").grid(row=0)
    textName=Entry(window,textvariable=nombre).grid(row=0, column=1)

    #Food Category label
    categoria = StringVar()
    labelCategory=Label(window,text="Category").grid(row=1)
    textCategory=Entry(window, textvariable=categoria).grid(row=1, column=1)

    res_name = StringVar()
    res_category = StringVar()
    textRes_name = Label(window, textvariable=res_name).grid(row=5,column=0)
    textRes_category = Label(window, textvariable=res_category).grid(row=5,column=1)


    #Buttons for Insert & Delete
    def insertData():
        conn=sqlite3.connect('foodDatabase.db')
        sql="insert into food(name,category) values('{0}','{1}')".format(nombre.get(),categoria.get())
        conn.execute(sql)
        conn.commit()
        conn.close()
        showinfo("Success", "Insert Successful!")
        nombre.set('')
        categoria.set('')
        showData()

    def deleteData():
        conn=sqlite3.connect('foodDatabase.db')
        sql="delete from food where name='{0}'".format(nombre.get())
        conn.execute(sql)
        conn.commit()
        conn.close()
        showinfo("Success","Delete Successful!")
        nombre.set('')
        categoria.set('')
        showData()

    def showData():
        conn=sqlite3.connect('foodDatabase.db')
        sql="select * from food"
        q = conn.execute(sql)
        rows = q.fetchall()

        result_name = ["name"]
        result_category = ["category"]
        for row in rows:
            result_name.append(row[0])
            result_category.append(row[1])

        res_name.set("\n".join(result_name))
        res_category.set("\n".join(result_category))


        conn.commit()
        conn.close()

    #Insert Button
    buttonInsert = Button(window,text='Insert',command=insertData).grid(row=3, column=0, pady=4)

    #Delete Button
    buttonDelete = Button(window,text='Delete',command=deleteData).grid(row=3, column=1, pady=4)

    #Show list Button
    # buttonShow = Button(window,text='Show',command=showData).grid(row=3, column=2, pady=4)
    showData()
    window.mainloop()

if __name__ == '__main__':
    main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2017-12-07
    • 2023-03-29
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多