窗口 8 中的非类型缓冲区接口错误



我正在制作一个文本编辑器,所以你可以想象有很多操作文本文件。当我双击.py文件以在 python 中运行它时.exe在窗口中,它会抛出"NoneType 不支持缓冲区接口"的错误,因为我只听说过"缓冲区"作为文本文件上下文中的编程术语,我相信问题出在那里的某个地方。

这是代码:

from tkinter import *
from tkinter.filedialog import *
from tkinter.messagebox import *
import os
os.chdir(os.getenv('HOME'))
current=None
backup=''
def newfile():
    def create_file(entry):
        global current
        global root
        nonlocal create_in
        nonlocal name_it
        current = open(entry.get(),'w')
        root.title(create_in+'/'+current.name+' - Aspus')
        name_it.destroy()
    create_in=askdirectory()
    if create_in!='':
        global root
        os.chdir(create_in)
        name_it=Tk()
        name_it.title("Name the File?")
        prompt=Label(name_it, text="Enter name for new file:")
        prompt.grid(row=0)
        entry=Entry(name_it)
        entry.grid(row=1)
        entry.insert(0, "Untitled.txt")
        create=Button(name_it, text="Create", command = lambda: create_file(entry))
        create.grid(row=1, column=3)
        name_it.mainloop()
def openfile(master):
    global current
    global backup
    opening=askopenfilename()
    file=open(opening, 'r')
    insert=file.read()
    backup=file.read()
    file.close()
    file=open(opening, 'w')
    current=file
    master.title(current.name+' - Aspus')
    return insert
def savefile(entry):
    global current
    if current!=None:
        current.write(entry.get('1.0', END))
    elif current==None:
        newfile()
        current.write(entry.get('1.0', END))
def ask_save():
    global root
    global current
    global main
    if current!=None:
        save_exit=askyesnocancel("Save Before Exit?", "Do you want to save before exiting?")
        if save_exit==True:
            a=current.name
            current.close()
            current=open(a, 'w')
            savefile(main)
            current.close()
            root.destroy()
            exit()
        elif save_exit==False:
            a=current.name
            current.close()
            current=open(a, 'w')
            current.write(backup)
            current.close()
            root.destroy()
            exit()
    elif current==None:
        if main.get('0.1', END).strip()!='':
            save_exit=askyesnocancel("Save Before Exit?", "Do you want to save before exiting?")
            if save_exit==True:
                newfile()
                savefile()
                current.close()
                root.destroy()
            elif save_exit==False:
                root.destroy()
        else:
            root.destroy()
def setpgwidth():
    def adjust(entry):
        global main
        new_width=entry.get()
        try:
            main.config(width=int(entry.get()))
        except:
            showerror("Invalid width", "You entered an invalid width. Expected an integer.")
            entry.delete(0, END)
        else:
            main.pack(expand=Y, fill=Y, side=LEFT)
            entry.master.destroy()
    width=Tk()
    width.title("Set Page Width")
    prompt=Label(width, text="Enter new page width:")
    prompt.grid(row=0, column=0, columnspan=2)
    new=Entry(width)
    new.grid(row=1, column=0)
    submit=Button(width, text="Submit", command=lambda: adjust(new))
    submit.grid(row=1, column=1)
    width.mainloop()
root=Tk()
root.title("Aspus Text Editor")
#create main text widget
main=Text(root, wrap=WORD)
main.pack(expand=True, fill=BOTH, side=LEFT)
#create scrollbar
scroll=Scrollbar(root)
scroll.pack(side=RIGHT, fill=Y)
#configure scrollbar
scroll.config(command=main.yview)
main.config(yscrollcommand=scroll.set)
#Creating menus
menu=Menu(root)
root.config(menu=menu)
menu.add_command(label="New File", command=newfile)
menu.add_command(label="Open File", command=lambda: main.insert(END, openfile(root)))
menu.add_command(label="Save File", command=lambda: savefile(main))
formatmenu=Menu(menu)
menu.add_cascade(label="Format", menu=formatmenu)
formatmenu.add_command(label="Set Page Width", command=setpgwidth)
menu.add_command(label="Quit", command=ask_save)
root.protocol("WM_DELETE_WINDOW", ask_save)
root.mainloop()

有谁知道为什么会发生这种情况以及如何避免它?

至少部分问题在于这两个陈述:

insert=file.read()
backup=file.read()

因为read()读取整个文件,所以backup不会是你想象的那样。

首先要做的是使用 pdb 逐步执行代码,或添加一些 print 语句来验证您的数据是否与您认为的那样。您严重依赖全局变量,这些变量可以很容易地以不同于您预期的顺序进行更改。

最新更新