Tkinter - Editor

Fragen zu Tkinter.
Antworten
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Hi Leute,

ich bin gerade dabei einen Editor zu programmieren
Aber ich habe zwei Probleme:
das eine ist das er mir nur im ergebnis ein buchstabe anzeigt
und dann will ich wie bei den Windows Txt - Editor die Urzeit und das Datum ausgeben lassen - aber ich weiß nicht wie ich das übergeben soll

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
#iso-859-1

import tkMessageBox
import tkFileDialog                                                          
from Tkinter import *
import time
import Tkinter as tk
import Tkinter
import tkMessageBox


root=Tkinter.Tk()
root.title("Text - Editor - Neuer Text")
root.config(bg = "#E3E2E9")
#root.resizable(width=FALSE, height=FALSE)
root.geometry('1270x750')
root.iconbitmap('icoeditor.ico')

def ask_quit():
    if tkMessageBox.askokcancel("Quit", "Möchtest du das Fenster wirklich schließen?"):
        root.destroy()
        root.mainloop()

def print_time():

    Wochentag = time.strftime("%A",time.gmtime())
    Datum = time.strftime("%d.%m.%Y",time.gmtime())
    
    wochen = { 
                  "Monday" : "Montag", 
                  "Tuesday" : "Dienstag", 
                  "Wednesday" : "Mittwoch",
                  "Thursday" : "Donnerstag",
                  "Friday" : "Freitag",
                  "Saturday" : "Samstag",
                  "Sunday" : "Sonntag"
                  }

    woche=wochen["" + Wochentag]

    inputdaten = {
    "woche": woche,
    "Datum": Datum
      }
    return inputdaten
    
def save():
  programm= "test"
  text = etext.get(0.0)
  textfile = text
  daten = open(programm + ".txt", 'w')
  daten.write(textfile)
  daten.close()
  #ask_quit()

print (woche)

menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
#menubar.grid(row = 6, column = 1, padx = 0, pady = 10)

filemenue = Menu(menubar, tearoff=0)
menubar.add_cascade(label="File", menu=filemenue)
filemenue.add_command(label="Save", command=save)
filemenue.add_command(label="Exit", command=ask_quit)

edit = Menu(menubar, tearoff=0)
menubar.add_cascade(label="Edit", menu=edit)
edit.add_command(label="Time/Date", command=print_time)
root.config(menu=menubar)


    
etext = Tkinter.Text(root, relief = "ridge", bg = "white", fg = "black",
                     height = 2200, width = 1350)
etext.config(font=('Arial', 11))
etext.grid(row = 0,column = 0, padx =0 , pady = 0,sticky='w')
etext.insert(0.0, "")


root.protocol("WM_DELETE_WINDOW", ask_quit)
root.mainloop()

programm()
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Dark Shadow
User
Beiträge: 38
Registriert: Samstag 23. April 2011, 15:49

Zu Deiner 1. Frage:
Das konnte ich nicht nachvollziehen. Wo wird nur ein Buchstabe angezeigt?

Zu 2.:
Mit return in der Menüleiste wirst Du wenig Erfolg haben. Ich weiß nicht, wie Du es angezeigt haben möchtest, aber im Windows-Editor erscheint (bei F5) die Zeit im Textfenster an der Cursorposition. Hier mein Vorschlag (zu print_time()):

Code: Alles auswählen

def print_time():

    Wochentag = time.strftime("%A",time.gmtime())
    Datum = time.strftime("%d.%m.%Y",time.gmtime())
   
    wochen = {
                  "Monday" : "Montag",
                  "Tuesday" : "Dienstag",
                  "Wednesday" : "Mittwoch",
                  "Thursday" : "Donnerstag",
                  "Friday" : "Freitag",
                  "Saturday" : "Samstag",
                  "Sunday" : "Sonntag"
                  }

    woche=wochen["" + Wochentag]

    inputdaten = {
    "woche": woche,
    "Datum": Datum
      }
    #return inputdaten #das brauchst Du nicht, deshalb ein Kommentar
    etext.insert(etext.index(Tkinter.INSERT), "[%s, %s]"%(inputdaten["woche"], inputdaten["Datum"]))
#diese Zeile zeigt das Datum und den Wochentag an.

Dark Shadow

P.S.: Du importierst Tkinter 3x. 1x reicht auch. :wink:
problembär

tkedit.py:

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!
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

vielen dank das du die ganze Arbeit gemacht hast!
Ich hätte nicht gedacht das du gleich das ganze Programm schreibst!
genau so sollte er werden

---------------------
jtschoch
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Hier hab ich auch das Problem mit dem Text: http://www.python-forum.de/viewtopic.php?f=18&t=26516
z.B. wenn ich jtschoch eingebe kommt in der E-Mail j an!

aber ich möchte nicht mein ganzes Programm umgeschrieben sehen (Und bitte kein self ich kenne mich da nicht aus)
gibt es auch scrollendtext ohne self

danke im voraus
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
problembär

jtschoch hat geschrieben:vielen dank das du die ganze Arbeit gemacht hast!
Ich hätte nicht gedacht das du gleich das ganze Programm schreibst!
genau so sollte er werden
Hehe, Dankeschön! Das hab' ich aber jetzt nicht extra für dieses Thema gemacht, sondern schon vor ein paar Jahren, als ich auch mal selbst so einen einfachen Editor in Tkinter schreiben wollte.
Es gibt zwar den einen oder anderen Editor in Python, aber die konnten mich alle nicht so recht überzeugen. Da hab' ich dann also mal selbst Hand angelegt.

Die Sache wurde dadurch stark erleichtert, daß das Text-Widget von Tkinter eigentlich schon die meisten Standardtastenkombinationen für das Editieren von Text mitbringt. Ich mußte also gar nicht Sachen schreiben wie "wenn die Taste 'Pos1' gedrückt wird, springe mit dem Cursor zum Zeilenanfang". All das macht das Text-Widget schon automatisch. Insofern gebührt das Verdienst eigentlich zum großen Teil den Autoren von Tkinter.
Edit (nach PM): Beziehungsweise genauer den Autoren von Tk, denn diese Funktionalität des Text-Widgets gibt es ja auch in Tcl/Tk und Perl/Tk.

Gruß
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

@jtschoch: Das 'self' wird gerne für Klassen benutzt, man kann natürlich auch 'this' benutzen. Aber 'self' ist eben der Standard als Zeiger auf die Klasse selbst! ScrolledText ist eine Unterklasse von tkinter - du kannst sie benutzen wie du lustig bist!
LG Maik
Antworten