【问题标题】:Python Gui not responding to databasePython Gui没有响应数据库
【发布时间】:2015-10-28 07:15:36
【问题描述】:

这篇文章的目的是确定代码中的错误,我花了无数个小时试图更改代码以查看错误是什么。我正在尝试通过 python GUI(tkinter)将员工添加到数据库中。目前它只插入“”信息,这在我们的 def delete 中使用 print 语句进行检查。我在使用 def delete 时遇到了类似的问题,但是元组中的信息未显示在列表框中。有没有人可以解决为什么会发生这些故障?

def addEmp():
    top = Toplevel()
    top.title("Add Employee")
    top.geometry("470x385")
    app = Frame(top)
    app.grid()

    firstName = StringVar()
    lastName = StringVar()
    address = StringVar()
    payRate = StringVar()
    inUnion = StringVar()
    paymentMethod = StringVar()
    grp1 = StringVar()

    firstNameLabel = Label (app, text = "First Name:", font = 15)
    firstNameLabel.grid(row = 0, column = 0)
    firstNameEntry = Entry (app, text = "", textvariable = firstName)
    firstNameEntry.grid(row = 0, column = 1)
    surNameLabel = Label (app, text = "Surname:", font = 15)
    surNameLabel.grid(row = 1, column = 0)
    lastNameEntry= Entry (app, text = "", textvariable = lastName)
    lastNameEntry.grid(row = 1, column = 1)
    addressLabel = Label (app, text = "Address:", font = 15)
    addressLabel.grid(row = 2, column = 0)
    addressEntry = Entry (app, text = "", textvariable = address)
    addressEntry.grid(row = 2, column = 1)
    payRateLabel = Label (app, text = "Pay Rate Hourly:", font = 15)
    payRateLabel.grid(row = 3, column = 0)
    payRateEntry = Entry (app, text = "", textvariable = payRate)
    payRateEntry.grid(row = 3, column = 1)
    salaryLabel = Label (app, text = "Pay Rate Monthly:", font = 15)
    salaryLabel.grid(row = 4, column = 0)
    salaryEntry = Entry (app, text = "")
    salaryEntry.grid(row = 4, column = 1)
    payTypeLabel = Label (app, text = "Work Type:", font = 15)
    payTypeLabel.grid(row = 5, column = 0)

    radio1 = Radiobutton(app, text = "Full Time (Monthly Salary)", value = 'Monthly', variable = grp1)
    radio1.grid(row = 6, column = 1)
    radio2 = Radiobutton(app, text = "Part Time (Hourly Pay per Week)", value = 'Weekly', variable = grp1)
    radio2.grid(row = 7, column = 1)
    radio3 = Radiobutton(app, text = "Commission", value = 'Commission', variable = grp1)
    radio3.grid(row = 8, column = 1)
    paymentOptionsLabel = Label (app, text = "Payment Option:", font = 15)
    paymentOptionsLabel.grid(row = 9, column = 0)
    radio4 = Radiobutton(app, text = "Mail to current address", value = "Mail", variable = paymentMethod)
    radio4.grid(row = 10, column = 1)
    radio5 = Radiobutton(app, text = "Held by Paymaster", value = "Hold", variable = paymentMethod)
    radio5.grid(row = 11, column = 1)
    radio6 = Radiobutton(app, text = "Directly Deposit into bank account", value = "Bank", variable = paymentMethod)
    radio6.grid(row = 12, column = 1)
    unionLabel = Label (app, text = "Union:", font = 15)
    unionLabel.grid(row = 13, column = 0)
    radio1union = Radiobutton(app, text = "Yes", value = '1', variable = inUnion)
    radio1union.grid(row = 14, column = 1)
    radio2union = Radiobutton(app, text = "No", value = '0', variable = inUnion)
    radio2union.grid(row = 15, column = 1)


    submitButton = Button (app, command = addEmpSubmit, text = "Submit", font = 15)
    submitButton.grid(row = 20, column = 3)

def addEmpSubmit():
    c.execute("INSERT INTO employees (first_name, last_name, address, in_union, pay_type, payment_method) VALUES (?, ?, ?, ?, ?, ?)",
              (str(firstName), str(lastName), str(address), str(inUnion), str(payType), str(paymentMethod)))
    connection.commit()

    if payType == "Weekly":
        c.execute("UPDATE employees SET pay_rate=? WHERE employee_id=?", (payRate, c.lastrowid))
        connection.commit()
    elif payType == "Monthly":
        c.execute("UPDATE employees SET monthly_salary=? WHERE employee_id=?", (monthlySalary, c.lastrowid))
        connection.commit()
    elif payType == "Commission":
        c.execute("UPDATE employees SET monthly_salary=?, commission_rate=? WHERE employee_id=?",
                  (monthlySalary, commissionRate, c.lastrowid))
        connection.commit()


def deleteEmp():
    top = Toplevel()
    top.title("Delete Employee")
    top.geometry("470x385")
    deleteList = Listbox(app)
    deleteList.grid(row = 0, column = 0)
    listItem = ""

    c.execute("SELECT * FROM employees")
    allEmp = c.fetchall()
    for line in allEmp:
        for item in line:
            print(str(item))
            listItem += str(item)
        deleteList.insert(END, listItem)

    connection.commit()
    empIDLabel = Label (app, text = "Please select an Emp ID:", font = 15)
    empIDLabel.grid(row = 1, column = 0)
    empIDEntry = Entry (app, text = "")
    empIDEntry.grid(row = 2, column = 0)

    deleteButton = Button (app, text = "Delete", font = 15)
    deleteButton.grid(row = 2, column = 1)

【问题讨论】:

  • 这段代码是否真的在没有错误信息的情况下运行?因为我不知道addEmpSubmit 怎么知道firstName
  • @CL。抱歉回复晚了,我忙着工作。不,运行程序时没有错误消息,但是它将空白信息输入数据库。 firstName 最初是作为类变量创建的,因此这两个函数都应该只是简单地更改原始的 firstName 变量。这是正确的吗?

标签: python user-interface sqlite tkinter


【解决方案1】:
  1. 正确阅读ControlVariables / StringVar 上的文档。 您为 INSERT INTO 提供的值 - 查询不是条目小部件的值。



>>> name=tk.StringVar()
>>> name.set("First Name")
>>> name
<Tkinter.StringVar instance at 0x01EB4CB0>
>>> str(name)
'PY_VAR0'
>>> name
<Tkinter.StringVar instance at 0x01EB4CB0>
>>> name.get()
'First Name'

  1. 请确保您发布可以在(至少)您的系统上重现您的错误的代码示例。因此,非常很难重现您遇到的问题。 拆分您的代码并在更小的切片中对其进行调试。自行检查不同的组件(例如,首先使用一些虚拟数据使用变量、StringVars 等的 sql 部分)。

  2. 您是否收到任何错误消息?如果是这样,请将它们添加到您的帖子中,以便我们可以查看您是否在某个时间点苦苦挣扎。像 - “我的代码不工作 - 为什么?”即使有正确的信息也很难分析。

【讨论】:

  • 如果我记得使用 tk.用于程序使用类时。如果是这样,则程序不使用类,而只是使用创建新顶层和根的函数。运行程序时没有错误消息,但是它将空白信息输入到数据库中,打印员工列表时可以看到,但在 sql 编辑器中不显示。
  • 所以如果我没听错的话,你是说在 sql 编辑器中数据没问题?
  • 添加员工时,输入的员工数据均为空字符串,仅在程序内。这是问题一,因为输入的信息没有被收集并保存到变量中。在 SQL 编辑器中添加员工后,数据没有任何变化,这意味着没有出现空字符串的新员工
  • 如上所述:您使用str(lastname)。姓氏是tk.StringVar object。 StringVar 对象通过调用它们的get() 函数来读取。您的代码示例没有 global 或与类相关的关键字。这意味着每个变量(及其内容)都在函数结束时被垃圾收集。可能的解决方法:使用类(self 关键字)或使用全局变量(一般不推荐用于此目的)
  • 感谢您的澄清,我明白您在解释什么。我以前尝试过 .get() 函数,但没有类或全局变量,这可能是程序无法运行的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
相关资源
最近更新 更多