TypeError:Tkinter中需要一个整数(得到类型str)

时间:2017-07-28 23:50:11

标签: python python-3.x tkinter

所以我编写了一个应用程序,它允许您将提供的信息存储到列表框中,列表框也可用于在某处打印数据。 (创建一个存储它的文本。)我也尝试过以前用户帖子的所有建议,但无法找到我的案例。任何帮助表示赞赏。

由于某种原因,我得到了你在标题中看到的错误。

这是我的代码:

from tkinter import*
from os import open

def addData():
    dataInsert = dataEntry.get()
    itemList.insert(END, dataInsert.upper())
    dataEntry.delete(0, END)

def deleteData():
    dataSelect = itemList.curselection()
    itemList.delete(dataSelect)

def clearData():
    itemList.delete(0, END)

def printData():
    dataDirectory = filedialog.askdirectory()
    f = open('items.txt', dataDirectory, 'ab+')
    f.write(bytes('', itemList.get(), 'UTF-8'))
    f.close()

def rootExit():
    root.destroy()

root = Tk()
root.config(bg='gray79')
root.title('Inventory Recording Systems')
root.geometry('1300x800')
root.resizable(width=False, height=False)

mainLabel = Label(text='Inventory Recording Systems',
                  font=('comic sans ms', 20, 'bold'),
                  bg='gray79',
                  fg='black')

mainLabel.place(x=360, y=10)

f1 = Frame(root,
           bg='black',
           width=300,
           height=40)

f1.place(x=40, y=22)

f2 = Frame(root,
           bg='black',
           width=300,
           height=40)

f2.place(x=950, y=22)

dataLabel = Label(root,
                  text='Enter Data:',
                  font=('comic sans ms', 20, 'bold'),
                  bg='gray79')

dataLabel.place(x=10, y=130)

dataEntry = Entry(root,
                  font=('arial', 16, 'bold'))

dataEntry.place(x=250, y=142)

itemList = Listbox(root,
                    font=('arial', 15, 'bold'),
                    width=47,
                    height=16)

itemList.place(x=10, y=200)

addButton = Button(root,
                   text='Add Data',
                   font=('arial', 20, 'bold'),
                   bg='gray89',
                   fg='black',
                   relief=GROOVE,
                   width=15,
                   height=1,
                   bd=5,
                   command=addData)

addButton.place(x=865, y=215)

deleteButton = Button(root,
                   text='Delete Data',
                   font=('arial', 20, 'bold'),
                   bg='gray89',
                   fg='black',
                   relief=GROOVE,
                   width=15,
                   height=1,
                   bd=5,
                   command=deleteData)

deleteButton.place(x=865, y=345)

clearButton = Button(root,
                   text='Clear Data',
                   font=('arial', 20, 'bold'),
                   bg='gray89',
                   fg='black',
                   relief=GROOVE,
                   width=15,
                   height=1,
                   bd=5,
                   command=clearData)

clearButton.place(x=865, y=470)

printButton = Button(root,
                   text='Print Data',
                   font=('arial', 20, 'bold'),
                   bg='gray89',
                   fg='black',
                   relief=GROOVE,
                   width=15,
                   height=1,
                   bd=5,
                   command=printData)

printButton.place(x=865, y=595)

exitButton = Button(root,
                   text='Exit',
                   font=('arial', 10, 'bold'),
                   bg='gray89',
                   fg='black',
                   relief=GROOVE,
                   width=6,
                   height=1,
                   bd=5,
                   command=rootExit)

exitButton.place(x=1212, y=752)

root.mainloop()

2 个答案:

答案 0 :(得分:0)

您收到该错误是因为您的打印功能尝试以此格式打开文件。 os中的open函数按顺序接受文件名,模式,缓冲区。这就是你脚本中的内容:

f = open('items.txt', dataDirectory, 'ab+')

您正在传递(文件名,路径,模式)。相反,你应该做这样的事情:

f = open(dataDirectory+'/items.txt', mode='a')
顺便说一下,你的写作方式仍然有误。我建议您阅读os项目的文档及其在Python 3中的使用。转到终端并运行:

import os
help(os)

另外,请阅读此article,它将帮助您将代码从python 2迁移到3,并帮助您发现迁移的潜在问题。在你的情况下特别有趣的段落就是这个:

  

作为这种二分法的一部分,你还需要小心打开   文件。除非你一直在Windows上工作,否则你有可能   打开二进制文件时,并不总是打扰添加b模式   (例如,rb用于二进制读取)。在Python 3下,二进制文件和文本   文件明显不同,互不相容;看到io   模块详情。因此,你必须决定是否   文件将用于二进制访问(允许读取二进制数据)   和/或书面的)或文本访问(允许读取文本数据)   和/或书面的)。您还应该使用io.open()来打开文件   而不是内置的open()函数,因为io模块是一致的   从Python 2到3,而内置的open()函数不是(在   Python 3它实际上是io.open())。不要打扰过时的   使用codecs.open()的做法,因为这只是保持的必要条件   兼容Python 2.5。

答案 1 :(得分:0)

参数编码必须像这样传递

此代码需要重写为

f.write(bytes('', itemList.get(), 'UTF-8'))

作为

f.write(bytes('', itemList.get(), encoding='UTF-8'))