【问题标题】:How to fix "TypeError: an integer is required (got type IntVar)" in mysql python如何在mysql python中修复“TypeError:需要一个整数(获取类型IntVar)”
【发布时间】:2020-03-03 16:54:18
【问题描述】:

我正在尝试在我的数据库表中插入日期。但我得到了

Traceback (most recent call last):
  File "D:\SchoolApp\Python\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "D:/SchoolApp/Python/register only.py", line 45, in register
    self.entry_birthday = datetime.datetime(self.birth_day)
TypeError: an integer is required (got type IntVar)

我将变量self.get_birthday 转换为int(self.get_birthday),但它仍然是一个错误。

这是我的代码


import tkinter as tk
import pymysql
from tkinter import *
from tkinter import messagebox
import datetime

class Main(tk.Frame):
    def __init__(self, master, *args, **kwargs):
        tk.Frame.__init__(self, master, *args, **kwargs)
        self.master = master
        master.title("Thesis")

        self.register_button = Button(master, text="Register", command=self.register)
        self.register_button.pack()

        self.db = pymysql.connect(host = "localhost",user = "root",passwd = "",db = "database")
        self.cursor = self.db.cursor()
        self.QueryResident = "CREATE TABLE IF NOT EXISTS residence (BIRTH_DATE date, AGE varchar(255)not null)"
        self.cursor.execute(self.QueryResident)

    def registered(self,birth_day):
        self.get_birth_day =self.birth_day.get()

        if (self.get_birth_day == ""):
                messagebox.showerror("Error!","Please complete the required field")
        else:
            self.cursor.execute ("INSERT INTO residence (BIRTH_DATE) VALUES(%s)",(self.get_birth_day))

            self.db.commit()
            messagebox.showinfo("Success!","Registration successful")

        self.cursor.close()
        self.db.close()


    def register(self):
        self.master_register = Toplevel()

        self.birth_day = IntVar()

        self.label_birthday = Label(self.master_register, text = "Birth Day")
        self.label_birthday.pack()
        self.entry_birthday = Entry(self.master_register, textvariable = self.birth_day)
        self.entry_birthday = datetime.datetime(self.birth_day)
        self.entry_birthday.pack()
        self.button_submit = Button(self.master_register, text = "Submit", command = lambda: self.registered(self.birth_day))
        self.button_submit.pack()

我的预期输出是输入的日期 get 将以任何日期格式存储到数据库中,我将根据给定的出生日期计算年龄。

【问题讨论】:

  • 这里的代码有什么错误?自从上次遇到描述的错误后,您似乎更改了代码
  • 您好,先生,我忘了输入完整的回溯错误。我现在已经完成了编辑。
  • 如果您可以包含一个运行代码来重现导入和类的错误,那就太好了。也就是说,您将名称 self.entry_birthday 定义为日期时间对象,然后尝试打包它。这不可能。我认为您想将 self.birthday 转换为 datetime 对象。顺便说一句,self.birthday 必须是什么格式? datetime.datetime 可以接受 3 个参数表示年、月、日,例如 datetime.datetime(1995, 12, 15)
  • 嗨,@BrunoVermeulen 先生,我编辑了代码并放入了导入模块。我没有指定 self.birthday 的格式。所以我会有3个条目?比如birth_yearbirth_daybirth_month?并将其放入 datetime.datetime(birth_year,birth_day,birth_month)?

标签: python tkinter pymysql


【解决方案1】:

这里有一些修改,希望能帮助你更进一步。基本上你需要定义如何输入日期(所以我选择格式yyyymmdd)。也最好作为 StringVar 输入。然后在注册的方法中将yyyymmdd 解析为日期时间对象,然后您可以将其放入数据库中。

不接受使用“try-except”格式错误的任何日期。

代码

import tkinter as tk
import pymysql
from tkinter import *
from tkinter import messagebox
import datetime

class Main(tk.Frame):
    def __init__(self, master, *args, **kwargs):
        tk.Frame.__init__(self, master, *args, **kwargs)
        self.master = master
        master.title("Thesis")

        self.register_button = Button(master, text="Register", command=self.register)
        self.register_button.pack()

        self.db = pymysql.connect(host = "localhost",user = "root",passwd = "",db = "database")
        self.cursor = self.db.cursor()
        self.QueryResident = "CREATE TABLE IF NOT EXISTS residence (BIRTH_DATE date, AGE varchar(255)not null)"
        self.cursor.execute(self.QueryResident)

    def registered(self,birth_day):

        birthday = self.birth_day.get()
        try:
            _year = int(birthday[0:4])
            _month = int(birthday[4:6])
            _day = int(birthday[6:8])

            birthday = datetime.datetime(_year, _month, _day)
            print(birthday)  # for debugging purpose you can remove

        except Exception as e:
            print(e)
            birthday = ""

        if (birthday == ""):
                messagebox.showerror("Error!","Please complete the required field")

        else:
            sql_string = "INSERT INTO residence (BIRTH_DATE) VALUES(%s)"
            print(sql_string) # for debugging purpose you can remove
            self.cursor.execute (sql_string,(birthday))

            self.db.commit()
            messagebox.showinfo("Success!","Registration successful")

        self.cursor.close()
        self.db.close()

    def register(self):
        self.master_register = Toplevel()

        self.birth_day = StringVar()

        self.label_birthday = Label(self.master_register, text = "Birth Day [yyyymmdd]")
        self.label_birthday.pack()
        self.entry_birthday = Entry(self.master_register, textvariable = self.birth_day)
        self.entry_birthday.pack()
        self.button_submit = Button(self.master_register, text = "Submit", command = lambda: self.registered(self.birth_day))
        self.button_submit.pack()

root = Tk()
Main(root)
root.mainloop()

【讨论】:

  • 这可不是一点帮助!这是我这一天得到的最大帮助。太感谢了。我接下来要做的是将分隔符“/”放在年、月和日中,就像 yyyy/mm/dd 一样。再次,非常感谢。
  • 不客气。如果这个答案帮助你走得更远,请你投票为answered。谢谢!
【解决方案2】:

self.birth_day 是一个对象,而不是一个整数。由于是IntVar,所以需要调用get方法取值。

datetime.datetime(self.birth_day.get())

【讨论】:

  • 我明白了,先生,非常感谢!你们帮了大忙。谢谢!
  • 就我而言,self.entry_birthday 不应该是 datetime 对象。你怎么能收拾这个?
  • @BrunoVermeulen:我不明白你的评论。关键不是self.entry_birthday 是什么或不是什么,问题是为什么datetime.datetime 会抛出错误。我将从示例中删除分配以避免混淆。
  • 您说得对,这可以解决当前的问题,但是原始代码还有其他几个缺陷,我在回答中也尝试纠正了这些缺陷。最终将 Entry 对象更改为 datetime 对象是错误的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
相关资源
最近更新 更多