0

我有点像 python 菜鸟,我试图为我的学校制作一个简单的文本编辑器,但是保存、剪切、粘贴和复制不起作用。它称为 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()
4

2 回答 2

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()
于 2013-10-16T19:26:26.770 回答
0

这是因为这个(和其他类似的错误):

def save_command(self):

您的函数接受一个参数,但按钮没有将参数传递给它,因此它会引发错误。

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

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

于 2013-10-16T18:47:47.590 回答