使用 tkinter 和 db 连接的 Python GUI

Posted

技术标签:

【中文标题】使用 tkinter 和 db 连接的 Python GUI【英文标题】:Python GUI using tkinter and db connection 【发布时间】:2015-01-15 18:37:27 【问题描述】:

我无法从以下程序中获得任何输出。我在这里要做的是将员工姓名和薪水存储在数据库中,然后根据姓名和 ID 删除数据库条目。它没有给出错误。我认为这是一个数据库错误。它没有在 db 中插入任何值。请帮忙。谢谢

import Tkinter
import sqlite3
import ttk


def put(*args):
    try:
        e_name = str(i_name)
        e_pay = int(i_pay)
        conn = sqlite3.connect('medha.db')
        c = conn.cursor()
        c.execute('create table if not exists employee(id integer primary key auto increment, name text, salary integer)')
        c.execute('insert into employee(name, salary) values(?,?)',(e_name,e_pay))
        conn.close()
        notice = 'insertion successful'
    except:
        notice ='insert proper values'

def del_id(*args):
    try:
        e_id = int(d_del)
        conn = sqlite3.connect('medha.db')
        c = conn.cursor()
        c.execute('delete from employee where id =?',(e_id))
        notice = 'deleted successfully'
        conn.close()
    except:
        notice = 'insert proper values'

def del_name(*args):
    try:
        e_name = int(d_del)
        conn = sqlite3.connect('medha.db')
        c = conn.cursor()
        c.execute('delete from employee where name = ?',(e_name))
        notice = 'deleted successfully'
        conn.close()
    except:
        notice = 'insert proper values'

root = Tkinter.Tk()
root.title('Python Projet - gui and db')

mainframe = ttk.Frame(root,padding='3 3 12 12' )
mainframe.grid(column=0, row=0)
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight =1)

i_name = str()
i_id = str()
i_pay = str()
notice = str()
d_del = str()

i_name_entry = ttk.Entry(mainframe, width =7, textvariable = i_name)
i_name_entry.grid(column = 1, row = 1)

i_id_entry = ttk.Entry(mainframe, width =7, textvariable = i_id)
i_id_entry.grid(column = 2, row = 1)

i_pay_entry = ttk.Entry(mainframe, width =7, textvariable = i_pay)
i_pay_entry.grid(column = 3, row = 1)

i_del_entry = ttk.Entry(mainframe, width =7, textvariable = d_del)
i_del_entry.grid(column = 1, row =4)

ttk.Label(mainframe, text ='Name of Employee').grid(column = 1, row = 0)
ttk.Label(mainframe, text ='Employee ID').grid(column = 2, row =0)
ttk.Label(mainframe, text ='Employee Pay').grid(column = 3, row=0)
ttk.Label(mainframe, text ='Name/ID of Employee to delete').grid(column = 1, row=3)
ttk.Label(mainframe, text = notice).grid(column = 1, row = 6)

ttk.Button(mainframe, text='Insert', command = put).grid(column=3, row=2)
ttk.Button(mainframe, text='Delete By ID', command = del_id).grid(column =1, row = 5)
ttk.Button(mainframe, text='Delete By Name', command = del_name).grid(column = 3, row=5)

for child in mainframe.winfo_children(): child.grid_configure(padx=5,pady=5)
i_name_entry.focus()

root.mainloop()

感谢任何帮助。

【问题讨论】:

“将员工姓名和薪水存储在数据库中,然后根据姓名和 ID 删除数据库条目” - 您描述的哪一部分不起作用? 我能够获得 GUI,但是在单击按钮时 put() 函数不起作用.. 甚至没有创建数据库。 如果您怀疑发生了错误,删除 try-except 块可能会很有用,因为它们会阻止将任何堆栈跟踪打印到控制台。 @Kevin 你的想法奏效了.. 得到了错误.. 说 int 的文字无效,基数为 10.. 当我将文本从输入字段转换为整数时会发生这种情况 e_pay = int(i_pay)跨度> 啊,那是因为i_pay 始终保持值"",因为当用户输入i_pay_entry 时它不会更新。您也可以将 i_pay 设为 StringVar,然后将 e_pay = int(i_pay.get()) 设为。与所有其他 str() 变量类似。 【参考方案1】:
ttk.Label(mainframe, text = notice).grid(column = 1, row = 6)

更改字符串 notice 的值不会更新此标签中的文本。您需要为此使用StringVar。

notice = Tkinter.StringVar()
ttk.Label(mainframe, textvariable = notice).grid(column = 1, row = 6)

然后,不要在你的函数中使用notice = "whatever",而是使用notice.set("whatever")


或者,根本没有 notice 值。直接重新配置 text 变量即可。

notice_label = ttk.Label(mainframe, text = "")
notice_label.grid(column = 1, row = 6)

(注意:不要尝试在同一行分配notice_label 和做grid,这是行不通的)

然后使用notice_label.config(text = "whatever") 而不是notice = "whatever"

【讨论】:

它说未定义 StringVar()。我是否必须导入任何东西才能使其工作。 StringVar 属于Tkinter 模块,所以你可能需要做notice = Tkinter.StringVar() 使用 Tkinter.StringVar() 为我工作..但代码仍然无法正常工作..在按钮点击它仍然不执行 put() 函数 您是否 100% 确定 put 没有被调用?如果将print "put is being called" 作为put 函数的第一行,会打印该值吗?我试过了,它可以在我的机器上运行。 值没有进入数据库..因为它说值已插入但数据库中没有任何内容【参考方案2】:

首先尝试查看您是否已连接到数据库。使用 postgreSQL,您可以通过 psycopg2 进行连接

import psycopg2

try:    
        conn = psycopg2.connect(database="user", user="postgres", password="silverTip", host="localhost")
        print("connected")
    except:
        print ("I am unable to connect to the database")
    cur =conn.cursor()

所以如果你连接到数据库,它会打印连接, 否则您将收到无法连接到数据库的消息

【讨论】:

以上是关于使用 tkinter 和 db 连接的 Python GUI的主要内容,如果未能解决你的问题,请参考以下文章

实现Pytho连接Mysqln以及应用

tkinter 退出时关闭串行连接

Tkinter无法连接显示“:0”

python连接MySQL数据库问题? cursor( ) 、execute()和fetc

如何在循环中创建多个具有不同名称的 tkinter 小部件?

tkinter:是不是可以将来自不同 tkinter 程序的 GUI 连接在一起并轻松地在它们之间导航?