【问题标题】:Adding to database and displaying in multi list box添加到数据库并在多列表框中显示
【发布时间】:2015-05-28 20:39:31
【问题描述】:

大家好,我正在尝试制作一个应用程序,该应用程序从一些 tkinter 输入框中获取数据,并将它们添加到数据库中,并将它们显示在 tktreectrl 的多列表框中。我尝试用来向数据库添加内容的代码是基于各种在线教程,但是所做的只是在数据库的最后一列中添加一个 0。即使我使用 DB Browser 将值放入数据库,它们仍然不会显示在多列表框中。 (这里是完整代码)

#Import Modules
import tkinter
import TkTreectrl
import sqlite3
#Database
db = sqlite3.connect("marks.db")
cursor=db.cursor()
print("Opened Database")
db.execute("CREATE TABLE IF NOT EXISTS marks (Firstname, Surname, Mark)")
print("Table created")
#Variables
Surname = str()
Firstname = str()
Mark = int()
#Define Buttons
def addentry() :
   db.execute('INSERT INTO marks VALUES (?,?,?);', (Firstname,Surname,Mark))
   db.commit()
   print ("Entry Added To Database")

def deleteentry() :
   selected=listbox.get(ACTIVE)
   name=selected[0]
   db.execute('DELETE FROM marks where Firstname =?', (name))
   print ("Entry Deleted")
#Window
window = tkinter.Tk()
window.title("marks")
window.geometry("875x500")
#Labels
lbl_surname = tkinter.Label(window, text="Surname:", font="Arial 12 bold")
lbl_first = tkinter.Label(window, text="First-Name:", font="Arial 12 bold")
lbl_mark = tkinter.Label(window, text="Mark (Percentage):", font="Arial 12 bold")
#Entry
txt_surname = tkinter.Entry(window, textvariable=Surname)
txt_first = tkinter.Entry(window, textvariable=Firstname)
txt_mark = tkinter.Entry(window, textvariable=Mark)
#Button
but_save = tkinter.Button(window, text="Save", command= addentry, width=10)
but_delete = tkinter.Button(window, text="Delete", command=deleteentry, width=10)
#List
listbox = TkTreectrl.MultiListbox(window)
listbox.config(columns=('Firstname', 'Surname', ' Mark'))
cursor.execute('SELECT * from marks')
for row in cursor.fetchall():
    listbox.insert('end',*map(unicode,row))
#Grid
lbl_surname.grid(row=0, column=1, padx=100)
lbl_first.grid(row=0, column=0)
lbl_mark.grid(row=0, column=2)
txt_surname.grid(row=1, column=1, padx=110)
txt_first.grid(row=1, column=0, padx=10)
txt_mark.grid(row=1, column=2)
but_save.grid(row=0, column=3)
but_delete.grid(row=1, column=3)
listbox.grid(row=2)
#Render
window.mainloop()

任何想法 关于我做错了什么

谢谢克里斯

【问题讨论】:

  • 您是否验证了FirstnameSurnameMark 在您进行提交时实际上具有值?您是否已验证 fetchall() 实际上返回的是非空结果?
  • Firstname 等似乎没有值。那么我将如何去做,所以我认为你可以使用条目小部件的文本变量,但是为了检索输入框的内容,我还需要做些什么吗?
  • 是的,您可以使用 text 变量。如果没有看到你的代码,我不可能猜到你做错了什么。
  • 条目小部件的代码是: txt_surname = tkinter.Entry(window, textvariable=Surname) 这对于其他条目也是一样的,显然只是文本变量不同。
  • 华夫饼,那是额外的一行代码根本没有帮助。如果您想添加更多代码,请编辑问题并添加完整的工作程序(也称为 MCVE:stackoverflow.com/help/mcve

标签: python-3.x sqlite tkinter


【解决方案1】:

你用错了textvariable。该值需要是一个特殊的 Tkinter 变量,例如 StringVar。第二个是你必须对这些变量使用get 方法来获取值。例如:

firstNameVar = tkinter.StringVar()
...
txt_first = tkinter.Entry(..., textvariable=firstNameVar)
...
Firstname = firstNameVar.get()
...

【讨论】:

  • 我现在收到错误:文件“E:/Python/Competition/Competition.py”,第 16 行,在 FirstnameVar = tkinter.StringVar() 文件“E:\Programs \Miniconda3\lib\tkinter_init_.py",第 287 行,在 init 变量.__init__(self, master, value, name) 文件“E:\Programs\Miniconda3 \lib\tkinter_init_.py",第 215 行,在 init self._tk = master.tk AttributeError: 'NoneType' object has no attribute 'tk'
  • @TheEpicWaffle:您必须在创建变量之前创建根窗口。已在此站点上询问并回答了此问题。 stackoverflow.com/q/8762747/7432
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
相关资源
最近更新 更多