为什么我的文本编辑器没有保存?

时间:2013-10-16 17:02:45

标签: python text tkinter

我有点像一个python noob,我试图为我的学校制作一个简单的文本编辑器,但保存,剪切,粘贴和复制不起作用。它叫做PyWriter,即时通讯使用Tkinter。很抱歉没有添加代码评论。这是我的代码:

import Tkinter
from Tkinter import *
from ScrolledText import *
import tkFileDialog
import tkMessageBox

def __init__(self):
    self.text = textPad()
    self.text.pack()
root = Tkinter.Tk(className=" PyWriter")
textPad = ScrolledText(root, width=100, height=80)


def open_command():
    file = tkFileDialog.askopenfile(parent=root,mode='rb',title='Open')
    if file != None:
        contents = file.read()
        textPad.insert('1.0',contents)
        file.close()

def save_command(self):
    file = tkFileDialog.asksaveasfile(parent=root,mode='w',title='Save')
    if file != None:
        data = self.textPad.get('1.0', END+'-1c')
        file.write(data)
        file.close()

def exit_command():
    root.destroy()

def copy_command(self, event=None):
    self.clipboard_clear()
    text = self.get("sel.first", "sel.last")
    self.clipboard_append(text)

def cut_command(self, event=None):
    self.copy()
    self.delete("sel.first", "sel.last")

def paste_command(self, event=None):
    text = self.selection_get(selection='CLIPBOARD')
    self.insert('insert', text)


menu = Menu(root)
root.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="Open...", command=open_command)
filemenu.add_command(label="Save...", command=save_command)
filemenu.add_separator()
filemenu.add_command(label="Copy", command=copy_command)
filemenu.add_command(label="Cut", command=cut_command)
filemenu.add_command(label="Paste", command=paste_command)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=exit_command)

textPad.pack()
root.mainloop()

2 个答案:

答案 0 :(得分:1)

Tkinter GUI经常在不使用类的情况下进行编码,但我建议使用它们 您可能会因为切割和粘贴而混合使用这两种方法 为了让您了解代码中的错误,我将根据两种不同的方法为您提供以下示例。我只修复了复制/粘贴方法,其余的对你有用。

没有类(我不认为这个好代码):

import Tkinter as tk
from ScrolledText import ScrolledText

def copy_command():
    root.clipboard_clear()
    text = textPad.get("sel.first", "sel.last")
    root.clipboard_append(text)

def paste_command():
    text = root.selection_get(selection='CLIPBOARD')
    textPad.insert('insert', text)

root = tk.Tk(className=" PyWriter")

textPad = ScrolledText(root, width=100, height=80)

menu = tk.Menu(root)
root.config(menu=menu)

filemenu = tk.Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="Copy", command=copy_command)
filemenu.add_command(label="Paste", command=paste_command)

textPad.pack()
root.mainloop() 

和课程:

import Tkinter as tk
from ScrolledText import ScrolledText

class TkApp(tk.Tk):
    def __init__(self, className=" PyWriter"):
        tk.Tk.__init__(self, className=className)
        self.textPad = ScrolledText(self, width=100, height=80)
        self.textPad.pack()

        menu = tk.Menu(self)
        self.config(menu=menu)
        filemenu = tk.Menu(menu)
        menu.add_cascade(label="File", menu=filemenu)
        filemenu.add_command(label="Copy", command=self.copy_command)
        filemenu.add_command(label="Paste", command=self.paste_command)

    def copy_command(self):
        self.clipboard_clear()
        text = self.textPad.get("sel.first", "sel.last")
        self.clipboard_append(text)

    def paste_command(self):
        text = self.selection_get(selection='CLIPBOARD')
        self.textPad.insert('insert', text)

if __name__ == '__main__':
    app = TkApp()
    app.mainloop()

答案 1 :(得分:0)

正是由于这个(和其他类似的错误):

def save_command(self):

您的函数接受一个参数,但该按钮不会向其传递参数,因此会抛出错误。

我的猜测是,你错误地从其他地方复制了这段代码。它具有类的所有标记,但您没有class语句。你有一个__init__函数只会在你实例化一个类时被调用,而你的函数只有self作为它们的唯一参数,这通常就是你对象的方法所做的。

我的建议是仔细查看您复制此代码位的位置,您会发现可能在__init__函数之前,您会看到类似class Something():