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

时间:2016-10-26 16:22:02

标签: python wxpython

我试图将我写入的内容保存到变量中的文件中,然后将其附加到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'

1 个答案:

答案 0 :(得分:1)

写入文件不会返回你在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')

这些写操作不会返回任何内容,因此名称,邮件和日期将始终为None。这就是你得到错误的原因。只需删除作业:

database.write(name_data + '\n')

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

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

那么为什么你会传递这个sys.maxint而不是0呢?我对wxpython了解不多。我做了一个猜测,并假设该函数返回列表长度作为索引并将插入到结尾,而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)