Code: Alles auswählen
#!/usr/bin/env python
# coding: iso-8859-1
"""
tkedit.py
"""
import os
import sys
import Tkinter
import tkMessageBox
import ScrolledText
import tkFileDialog
from Tkconstants import *
class Main:
def __init__(self):
self.myclip = ""
self.newfile = False
self.filename = self.getFileName()
self.gui = MainWindow(self)
self.gui.mw.after_idle(self.loadFile)
self.gui.mw.mainloop()
def getFileName(self):
if len(sys.argv) == 1:
x = 1
fname = "new01.txt"
while(os.access(fname, os.F_OK)):
x += 1
fname = "new"
if x < 10:
fname += "0"
fname += str(x) + ".txt"
self.newfile = True
return fname
s = sys.argv[1].split("/").pop()
return s
def loadFile(self):
if self.newfile:
return
a = []
try:
fh = file(os.getcwd() + "/" + self.filename, "r")
a = fh.readlines()
fh.close()
except IOError:
self.gui.sbar.set("Error reading text-file.")
for i in a:
# Convert string to unicode: Tkinter.Text likes it that way:
if type(i) != unicode:
i = i.decode("iso-8859-1")
self.gui.tfield.insert(END, i)
def openAFile(self):
fh = tkFileDialog.askopenfile()
if fh:
try:
text = fh.read()
# Convert string to unicode: Tkinter.Text likes it that way:
if type(text) != unicode:
text = text.decode("iso-8859-1")
self.gui.tfield.delete("1.0", END)
self.gui.tfield.insert("1.0", text)
self.filename = fh.name.split("/").pop()
fh.close()
self.gui.mw.title(self.filename)
self.gui.sbar.set("Text-file loaded.")
except IOError:
self.gui.sbar.set("Error reading text-file.")
def saveText(self):
text = self.gui.tfield.get("1.0", END)
# Convert the unicode-string we got from the Tkinter-textfield:
text = text.encode("iso-8859-1")
try:
fh = file(os.getcwd() + "/" + self.filename, "w")
fh.write(text)
fh.close()
os.chmod(os.getcwd() + "/" + self.filename, 0666)
self.gui.sbar.set('Text saved as "' + self.filename + '".')
except IOError:
self.gui.sbar.set("Error writing file !")
def saveAs(self):
text = self.gui.tfield.get("1.0", END)
# Convert the unicode-string we got from the Tkinter-textfield:
text = text.encode("iso-8859-1")
fh = tkFileDialog.asksaveasfile(initialfile = self.filename)
if fh:
try:
fh.write(text)
self.filename = fh.name.split("/").pop()
fh.close()
self.gui.mw.title(self.filename)
self.gui.sbar.set("Text saved.")
except IOError:
self.gui.sbar.set("Error writing file !")
def copyToClipboard(self):
try:
self.myclip = self.gui.mw.selection_get()
self.gui.sbar.set("Text copied to clipboard.")
except:
self.gui.sbar.set("Nothing copied.")
def copyAll(self):
self.gui.tfield.tag_add("all", "1.0", END)
self.gui.tfield.tag_config("all", background = "dark grey")
self.myclip = self.gui.tfield.get("1.0", END)
# We need this to be able to paste to applications outside:
self.gui.mw.clipboard_clear()
self.gui.mw.clipboard_append(self.myclip)
self.gui.mw.after(ms = 500, func = self.removeTagAll)
self.gui.sbar.set("Complete text copied to clipboard.")
def removeTagAll(self):
self.gui.tfield.tag_delete("all")
def pasteFromClipboard(self):
text = ""
try:
text = self.gui.mw.selection_get()
except:
pass
if text == "":
self.gui.tfield.insert(INSERT, self.myclip)
self.gui.sbar.set("Text pasted from clipboard.")
else:
# Convert string to unicode: Tkinter.Text likes it that way:
if type(text) != unicode:
text = text.decode("iso-8859-1")
self.gui.tfield.insert(INSERT, text)
self.gui.sbar.set("Text pasted from outside.")
class MainWindow:
def __init__(self, main):
self.main = main
if os.name == "posix":
self.fonts = {"app" : ("Suse Sans", 16)}
self.keyseqs = {"a" : 38, "c" : 54, "q" : 24, "s" : 39, "v" : 55}
else:
self.fonts = {"app" : ("Arial", 10)}
self.keyseqs = {"a" : 65, "c" : 67, "q" : 81, "s" : 83, "v" : 86}
self.mw = Tkinter.Tk()
self.mw.option_add("*font", self.fonts["app"])
self.mw.option_add("*tearOff", "false")
self.mw.geometry("+61+103");
self.mw.title(self.main.filename)
self.tfield = ScrolledText.ScrolledText(self.mw,
background = '#fff5e1',
wrap = WORD,
font = self.fonts["app"])
for i in self.keyseqs:
self.tfield.bind(sequence = '<Control-' + i + '>', func = self.bindFunc)
# A frame containing some menubuttons:
self.menubar = Tkinter.Frame(self.mw, relief = RIDGE, bd = 5)
# The menubuttons
self.mb_file = Tkinter.Menubutton(self.menubar, text = "File")
self.mb_bearb = Tkinter.Menubutton(self.menubar, text = "Edit")
self.mb_help = Tkinter.Menubutton(self.menubar, text = "Info")
# Several menues associated with the menubuttons:
self.menu_file = Tkinter.Menu(self.mb_file)
self.menu_file.insert_command(0,
label = "Open",
command = self.main.openAFile)
self.menu_file.insert_command(1,
label = "Save",
command = self.main.saveText)
self.menu_file.insert_command(2,
label = "SaveAs",
command = self.main.saveAs)
self.menu_file.insert_separator(3)
self.menu_file.insert_command(4, label = "Exit", command = self.mw.destroy)
self.mb_file.config(menu = self.menu_file)
self.menu_bearb = Tkinter.Menu(self.mb_bearb)
self.menu_bearb.insert_command(0,
label = "Copy",
command = self.main.copyToClipboard)
self.menu_bearb.insert_command(1,
label = "CopyAll",
command = self.main.copyAll)
self.menu_bearb.insert_command(2,
label = "Paste",
command = self.main.pasteFromClipboard)
self.mb_bearb.config(menu = self.menu_bearb)
self.menu_help = Tkinter.Menu(self.mb_help)
self.menu_help.add_command(label = "About", command = self.showAbout)
self.menu_help.add_command(label = "Keys", command = self.showKeys)
self.mb_help.config(menu = self.menu_help)
self.sbar = StatusBar(self.mw)
self.menubar.pack(side = TOP, fill = X)
self.mb_file.pack(side = LEFT)
self.mb_bearb.pack(side = LEFT)
self.mb_help.pack(side = RIGHT)
self.tfield.pack(expand = TRUE, fill = BOTH)
self.tfield.focus()
self.sbar.pack(fill = X)
self.sbar.set("Waiting.")
def showAbout(self):
tkMessageBox.showinfo(title = 'tkedit.py', message = "tkedit.py:\n\nA Primitive Text-Editor, written in 2008 by\nabgdf@gmx.net\nusing Python/Tkinter.\nLicense: GNU GPL.")
def showKeys(self):
tkMessageBox.showinfo(title = 'Keys', message = "Keys in tkedit.py:\n\nSave:\tCtrl + s\nCopy:\tCtrl + c\nCopyAll:\tCtrl + a\nPaste:\tCtrl + v\nExit:\tCtrl + q\n")
def bindFunc(self, event):
# print event.keycode
if event.keycode == self.keyseqs["s"]:
self.main.saveText()
if event.keycode == self.keyseqs["a"]:
self.main.copyAll()
if event.keycode == self.keyseqs["q"]:
self.sbar.set("Bye.")
self.mw.destroy()
if os.name == "posix":
if event.keycode == self.keyseqs["c"]:
self.main.copyToClipboard()
if event.keycode == self.keyseqs["v"]:
self.main.pasteFromClipboard()
class StatusBar(Tkinter.Frame):
def __init__(self, master):
Tkinter.Frame.__init__(self, master)
self.label = Tkinter.Label(self,
bd = 1,
relief = SUNKEN,
anchor = W)
self.label.pack(fill = X)
def set(self, format):
self.label.config(text = format)
self.label.update_idletasks()
def clear(self):
self.label.config(text = "")
self.label.update_idletasks()
if __name__ == "__main__":
app = Main()
Primitiv und nicht perfekt. Dennoch viel Spaß damit!