TagInsert

Code-Stücke können hier veröffentlicht werden.
Antworten
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

Code: Alles auswählen

from Tkinter import *
tags=["<b>","<i>","<pre>","<p>","<html>","<script>"]
root=Tk()
root.title("TagInsert")

menuframe=Frame(root)
menuframe.pack(expand=1,fill=X)

menubuttons=[]
for i in range(0,len(tags)):
    tag=tags[i]
    menubuttons.append(Button(menuframe,text=tag))
    menubuttons[-1].pack(side=LEFT,fill=Y)
mainframe=Frame(root)
mainframe.pack(expand=1,fill=BOTH)

TextBox=Text(root,wrap="word")
def insert_tag(ev):
    tag=ev.widget["text"]
    endtag=tag[0]+"/"+tag[1:]
    TextBox.selection_own()
    try:
        f=TextBox.index(SEL_FIRST)
        l=TextBox.index(SEL_LAST)
        TextBox.insert(l,endtag)
        TextBox.insert(f,tag)
    except:
        #es ist kein text markiert
        TextBox.insert(TextBox.index(INSERT),tag+endtag)
    
    
TextBox.pack(expand=1,fill=BOTH)
root.bind_class("Button","<1>",insert_tag)
root.mainloop()
So hier das für Mr_Snede versprochene Snippet =)
Damit kann man dann mal nen htmledito bauen...
(wenn man zeit dazu hätte)

mfg jAN
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])
BlackJack

Kleine Kritik am Quelltext. Bitte nicht persönlich nehmen, ist lieb gemeint. :-)

Sind haupsächlich auch Kleinigkeiten, aber es ist ein IMHO grosser Fehler drin.

Code: Alles auswählen

menubuttons=[]
for i in range(0,len(tags)):
    tag=tags[i]
    menubuttons.append(Button(menuframe,text=tag))
    menubuttons[-1].pack(side=LEFT,fill=Y)
Die Schleife ist "unpythonisch". Du brauchst den Index `i` eigentlich gar nicht. Man kann direkt über die `tags` iterieren. Ausserdem wird die `menubuttons` Liste später nie wieder benutzt. Das würde dann zu folgenden drei Zeilen schrumpfen:

Code: Alles auswählen

for tag in tags:
    menubutton = Button(menuframe, text=tag)
    menubutton.pack(side=LEFT,fill=Y)

Code: Alles auswählen

def insert_tag(ev):
    tag=ev.widget["text"]
    endtag=tag[0]+"/"+tag[1:]
    TextBox.selection_own()
    try:
        f=TextBox.index(SEL_FIRST)
        l=TextBox.index(SEL_LAST)
        TextBox.insert(l,endtag)
        TextBox.insert(f,tag)
    except:
        #es ist kein text markiert
        TextBox.insert(TextBox.index(INSERT),tag+endtag)
Das ``TextBox.selection_own()`` hat keinen Effekt und den Umweg über ``Text.index(SEL_*)`` braucht man nicht, man kann beim ``Text.insert()` auch gleich die entsprechenden symbolischen Konstanten benutzen:

Code: Alles auswählen

def insert_tag(ev):
    tag=ev.widget["text"]
    endtag=tag[0]+"/"+tag[1:]
    try:
        TextBox.insert(SEL_FIRST,endtag)
        TextBox.insert(SEL_LAST,tag)
    except TclError:
        #es ist kein text markiert
        TextBox.insert(INSERT,tag+endtag)
Ausserdem ist es nicht so gut ein ``except`` ohne eine konkrete Ausnahme zu benutzen, weil man dann alles abfängt, auch Fehler die man vielleicht gerne sehen möchte um sie zu beheben.

Code: Alles auswählen

TextBox.pack(expand=1,fill=BOTH)
root.bind_class("Button","<1>",insert_tag)
Und jetzt der grössere Entwurfsfehler. Du benutzt die Buttons gar nicht, sondern bindest den Mausklick einfach an alle Widgets. Das klappt nur zufällig weil das `Text` Widget die Mausklicks nochmal selbst behandelt und keine anderen Widgets benutzt werden.

Das die Buttons nicht wirklich benutzt werden, sieht man daran, dass sie nicht "eingedrückt" werden, wenn man darauf klickt.

Man benutzt Buttons indem man ihnen bei der Initialisierung eine Funktion mitgibt, die ausgeführt wird, wenn man den Button drückt:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import Tkinter as tk


def tag_inserter(tag_text, text_widget):
    start_tag = '<%s>' % tag_text
    end_tag = '</%s>' % tag_text
    
    def insert_tag():
        try:
            text_widget.insert(tk.SEL_FIRST, start_tag)
            text_widget.insert(tk.SEL_LAST, end_tag)
        except tk.TclError:
            text_widget.insert(tk.INSERT, start_tag + end_tag)
    
    return insert_tag


tags = ('b', 'i', 'pre', 'p', 'html', 'script')

root = tk.Tk()
root.title("TagInsert")

menuframe = tk.Frame(root)
menuframe.pack(expand=True, fill=tk.X)

textbox = tk.Text(root, wrap=tk.WORD)

for tag in tags:
    menubutton = tk.Button(menuframe,
                           text=tag,
                           command=tag_inserter(tag, textbox))
    menubutton.pack(side=tk.LEFT, fill=tk.Y)

textbox.pack(expand=True, fill=tk.BOTH)

root.mainloop()
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

Danke BlackJack!
Ich bin noch ein Python Anfänger....
naja ich hatte es erst anders gemacht und hab den müll nicht wieder rausgenommen der dann unnütz ist... :oops:


ps: kann man ein Tkinterscript als CGI script einsetzen?
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])
Antworten