'NoneType' 尝试将包含 .write() 的变量附加到文件时出现 TypeError

'NoneType' TypeError when trying to append variable containing .write() to a file

我正在尝试将我写入的内容保存到变量中的文件中,然后将其附加到 wx.ListCtrl 小部件。但是我每次尝试都会得到 'NoneType' TypeError。

with open("birthday.txt", 'a') as database:
     name = database.write(name_data + '\n')
     mail = database.write(mail_data + '\n')

     if int(month_data) < 10 and int(day_data) < 10:
        date = database.write('0' + day_data + '/0' + month_data + '/' + year_data + '\n')

     elif int(month_data) >= 10 and int(day_data) >= 10:
        date = database.write(day_data + '/' + month_data + '/' + year_data + '\n')

     elif int(month_data) < 10 and int(day_data) >= 10:
        date = database.write(day_data + '/0' + month_data + '/' + year_data + '\n')

     elif int(month_data) >= 10 and int(day_data) < 10:
        date = database.write('0' + day_data + '/' + month_data + '/' + year_data + '\n')
        database.write('\n')

index = self.list.InsertItem(sys.maxint, '1')
self.list.SetItem(index, 1, name)  # Error message occurs here
self.list.SetItem(index, 2, mail)
self.list.SetItem(index, 3, date)

错误信息:

TypeError: ListCtrl.SetItem(): arguments did not match any overloaded call:
  overload 1: argument 1 has unexpected type 'long'
  overload 2: argument 3 has unexpected type 'NoneType'

写入文件不会 return 您在 python 中写入的内容。这是你的问题:

 name = database.write(name_data + '\n')
 mail = database.write(mail_data + '\n')
 ...
 date = database.write('0' + day_data + '/0' + month_data + '/' + year_data + '\n')

这些写操作不会 return 任何东西,因此姓名、邮件和日期将始终是 None。这就是你得到错误的原因。只需删除分配:

database.write(name_data + '\n')

相反,您可以在 SetItem 调用中使用原始变量,假设您已经在某处定义了它们。

index = self.list.InsertItem(sys.maxint, '1')

顺便问一下,为什么要传递这个 sys.maxint 而不是 0?我对wxpython了解不多。我会猜测并假设函数 returns 列表长度作为索引并将插入到末尾,而 0 将插入到开头。好吧,这里可能不重要。

无论如何,你可以将原始数据设置为项目:

self.list.SetItem(index, 1, name_data) 
self.list.SetItem(index, 2, mail_data)
self.list.SetItem(index, 3, date_data)

好吧,你实际上并没有那样的 data_data,但这是另一回事,我建议你查找如何使用 the datetime module 从字符串中解析日期数据。或者您可以按照与文件写入相同的方式进行操作。或者至少更好一点的是将数据保存到那里的一个变量中:

 data_data = '0' + day_data + '/0' + month_data + '/' + year_data + '\n'
 database.write(date_data)