[nicht gelöst] - Tkinter - Editor

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

Hi,

Ich habe mir eine Editor geschrieben,
er funktioniert, aber ich möchte so eine save funktion wie bei Notepad.

Also das das Programm, wenn das File noch nicht gespeichert ist,
den Save - Dialog öffnet, und wenn es gespeichert ist soll er den Pfad merken,
und kein Dialog öffnen sondern das in den angegebne Pfad von vorher speichen.

Hier der Code ausschnitt:

Code: Alles auswählen

def savefile():
    
    zahl = []
    
    def funktion(zahl):
            print zahl
            try:
                winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\Editor") 
            except:
                None
            with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\Editor") as key:
                winreg.SetValueEx(key, "option", 0, winreg.REG_SZ, zahl)
    
    funktion(zahl)
        
    
    save_True = zahl
    print zahl
    if save_True == []:
        
        savegettext = (text.get(0.0,END))
        savegettext = savegettext.encode("iso-8859-1")
                          
        savetext = tkFileDialog.asksaveasfile(mode='w', defaultextension=".txt",
                                              filetypes=[("Text",".txt"),
                                                       ("Python",".py"),
                                                       ("VBS",".vbs"),
                                                       ("CMD",".bat"),
                                                       ("Alle Dateien",".*")])
        #savetext1 = str(savetext[0:9])
        print savetext
        try:
            savetext.write(savegettext)
            savetext.close()
        except:
            sbar.set("   Error")
            
  
        zahl.append("1")
        funktion(zahl)
    else:
        print "mode 2"
Zuletzt geändert von jtschoch am Samstag 22. Oktober 2011, 20:51, insgesamt 5-mal geändert.
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:

Weiß niemand etwas? :cry: :cry: :cry: :cry: :cry: :cry: :?
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
BlackJack

@jtschoch: Ich weiss das der Quelltext *sehr* schlechte Namen verwendet und IMHO zeigt, dass Du nicht weisst was Du da tust. Es würde letztendlich darauf hinaus laufen, das jemand anders das für Dich programmiert.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

ich denke auch, dass der obige Quelltext nichts zur Sache tut. Letztlich ist es doch so: Wenn du ein neues Dokument öffnet, sollte deine Editor-Klasse (oder was auch immer) irgendwo ein Attribut "filename=None" haben. Wenn es ein bestehendes Dokument ist bzw. bereits gespeichert wurde, hat das Attribut "filename" halt den Wert "/home/user/datei.txt" (oder so).

Ob du jetzt einfach speicherst oder vorher den Dialog anzeigst, lässt sich dann wie folgt formulieren: "if filename ... else ...".

So gesehen ist das Problem echt trivial - oder was möchtest du von uns hören?
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Danke Funktioniert :lol:
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:

Ich habe noch was,
ich will in mein Editor Sonderzeichen einfgen können,
also habe ich ein Fenster mit Sonderzeichen gemacht.
Aber ich möchte nicht jedes Sonderzeichen einzeln definieren.
Ich weiß dass es Irgendwie eine möglichkeit mit lambda gibt.

Code Ausschnitt:

Code: Alles auswählen

def sonderzeichen():

    root=tk.Tk()
    style = ttk.Style()
    style.theme_use('xpnative')
    root.title("Sonderzeichen")
    root.config(bg = "#E3E2E9")
    root.geometry('280x200')
    sonderzeichenlist1 = [u"\u2022",u"\u00b7", u"\u00a9", u"\u00ae", u"\u00b6",
                         u"\u00ad", u"\u00ac", u"\u00b1", u"\u00a4"]   

        
    def einfuegen(sonderzeichenlist1):# u"\u00bc"
        text.insert('end', sonderzeichenlist1)
    
    labell = Label(root, width = 99)
    labell.pack(side = "top")
    for text in sonderzeichenlist1:
        stichpunkt = Button(root, text = text, width = 2, height = 1, command = lambda : einfuegen(sonderzeichenlist1),
                        font = ('Arial', 11, 'bold'))
        stichpunkt.pack(side = "left", anchor = "n", expand = True)
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
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und was genau ist jetzt Deine Frage? :K
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Na wie ich das machen kann das ich auf den entsprechenden Button klicke und dann das
Sonderzeichen was auf den Button ist an das Text Wiget gegeben wird
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
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi jtschoch

Hier etwas zum ausprobieren:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from functools import partial
import tkinter as tk

def sonderzeichen():
    
    def einfuegen(sonderzeichen):
        text_plane.insert('end', sonderzeichen)

    root=tk.Tk()
    root.title("Sonderzeichen")
    root.config(bg = "#E3E2E9")
    
    sonderzeichenlist1 = ["\u2022", "\u00b7", "\u00a9", "\u00ae", "\u00b6",
        "\u00ad", "\u00ac", "\u00b1", "\u00a4"]  
    
    labell = tk.Label(root, text='Mein Editor :-)', width = 80, 
        font=('Arial', 14, 'bold'))
    labell.pack(side = "top")

    text_plane = tk.Text(root, bg='white')
    text_plane.pack(side='top', pady=5)
    
    button_frame = tk.Frame(root)
    button_frame.pack(side='top', expand=True, pady=5,)
           
    for index, text in enumerate(sonderzeichenlist1):
        stichpunkt = tk.Button(button_frame, text=text, width=2, height=1,
            command=partial(einfuegen, sonderzeichenlist1[index]),
            font = ('Arial', 11, 'bold'))
        stichpunkt.pack(side="left")
           
    return root

root = sonderzeichen()

root.mainloop()
Gruß wuf :wink:
Take it easy Mates!
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

danke,
Ich habe es Probiert einzubauen, aber ich bekomme ein Unicode ERROR:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
File "J:\JT_proj\python\editor\editor3.py", line 312, in einfuegen
text.insert(END, sonderzeichen1)
AttributeError: 'unicode' object has no attribute 'insert'


Code:

Code: Alles auswählen

from functools import partial


def sonderzeichen():
    
    def einfuegen(sonderzeichen1):
        print sonderzeichen1
        text.insert(END, sonderzeichen1)

    root=Tk()
    root.title("Sonderzeichen")
    root.config(bg = "#E3E2E9")
    
    sonderzeichenlist = [u"\u2022", u"\u00b7", u"\u00a9", u"\u00ae", u"\u00b6",
        u"\u00ad", u"\u00ac", u"\u00b1", u"\u00a4"]  
    
    button_frame = Frame(root)
    button_frame.pack(side='top', expand=True, pady=5,)
           
    for index, text in enumerate(sonderzeichenlist):
        stichpunkt = Button(button_frame, text=text, width=2, height=1,
            command=partial(einfuegen, sonderzeichenlist[index]),
            font = ('Arial', 11, 'bold'))
        stichpunkt.pack(side="left")
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
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Die Meldung kann ja kaum von dem Schnipsel stammen... Zeile 312 WTF?

Zudem ist sie ja eindeutig: Dein `text` Objekt ist eben ein Unicode-Objekt. Da Du den Snippet von wuf ja an einer vermutlich entscheidenden Stelle gekürzt hast, solltest Du das ja leicht selber fixen können ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi jtschoch

Aber mein Skript alleine funktioniert auf deiner Maschine?

BEMERKUNG: Du darfst für die Instanz des Text-Widget's nicht den Namen 'text' verwenden da du 'text' in der for-Schleife überschreibst!

In meinem Skript brauchte ich hierfür den Namen 'text_plane'

Gruß wuf :wink:
Take it easy Mates!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

wuf hat geschrieben: In meinem Skript brauchte ich hierfür den Namen 'text_plane'
Ach menno... lass ihn doch auch mal selber was rausbekommen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Danke, es Funktioniert, darauf habe ich gar nicht so geachtet.
Und das Ist ein Ausschnitt aus dem Code, der eigentliche Code ist länger!

Gruß 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
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

@jtschoch: Super! Geht doch.

ACHTUNG: Der Codeabschnitt:

Code: Alles auswählen

sonderzeichenlist1 = [u"\u2022", u"\u00b7", u"\u00a9", u"\u00ae", u"\u00b6",
    u"\u00ad", u"\u00ac", u"\u00b1", u"\u00a4"]
wirft beim Einsatz von Python3.x einen SyntaxError!

@Hyperion: OK! Unser jtschoch hat immerhin Anstand und bedankt sich für eine Hilfe. Da gibt es in unserem Forum andere Typen die sich auf die französische Art verabschieden. Mein Hilfe-Syndrom kommt vermutlich davon, dass ich meiner Amazone schon 20 Jahre versuche das Sprechen beizubringen. :lol:

Gruß wuf :wink:
Take it easy Mates!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

wuf hat geschrieben: @Hyperion: OK! Unser jtschoch hat immerhin Anstand und bedankt sich für eine Hilfe. Da gibt es in unserem Forum andere Typen die sich auf die französische Art verabschieden. Mein Hilfe-Syndrom kommt vermutlich davon, dass ich meiner Amazone schon 20 Jahre versuche das Sprechen beizubringen. :lol:
Hehe... das stimmt. Ich wollte ja auch nicht verhindern, dass Du ihm hilft - nur muss er endlich lernen, selber sinnvoll über ein Problem nachzudenken ;-) Und dass er `text` falsch gebunden hatte, hätte er durchaus rausfinden können nach der Hilfestellung.

@Amazone: Um die beneide ich Dich immer, wenn ich Deinen Avatar erblicke :-D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Ja, aber das war' s noch nicht!

Ich habe schon lange an diesen Abschnitt rumprobiert,
und die Suche auf den Kopf gestellt, aber ich habe es nicht hinbekommen.

Abschnittscode:

Code: Alles auswählen

    
def schrift(event):
        
        pos = lb.curselection() 
        #ausgabe = lb.get(pos)
        ausgabe = lbVar.get()
        print str(ausgabe)
        zeigeschrift.delete(0, 80)
        zeigeschrift.insert(0, ausgabe)
        text.config(font=(ausgabe, 11))
        zeige.config(font = (str(ausgabe), 60, 'bold'))

    def schriftschnitt_ausgabe(event):
        
        pos = lb1.curselection()
        ausgabe = lb1.get(pos)

        print ausgabe
        zeigeschnitt.delete(0, 80)
        zeigeschnitt.insert(0, ausgabe)

    def grosse(event):
        
        pos = lb2.curselection()
        ausgabe = lb2.get(pos)
        
        zeigegrad.delete(0, 80)
        zeigegrad.insert(0, ausgabe)
        text.config(font = (ausgabe))
  
        
    schriftauswahl = ["Arial", "Arial Black", "Comic Sans MS",
                       "Courier New", "DejaVu Sans", "DejaVu Sans Condensed", 
                       "DejaVu Sans Light", "DejaVu Sans Mono", "DejaVu Serif", 
                       "DejaVu Serif Condensed", "Estrangelo Edessa", 
                       "Franklin Gothic Medium", "Gautami", "Gentium Basic", 
                       "Gentium Book Basic", "Georgia", "Impact", "Kartika", 
                       "Latha", "Liberation Sans Narrow", "Lucida Console", 
                       "Lucida Sans Unicode", "Mangal", "Marlett", 
                       "Microsoft Sans Serif", "MV Boli", "OpenSymbol",
                       "Palatino Linotype", "Raavi", "Segoe UI", "Segoe UI Light",
                       "Shruti", "Sylfaen", "Symbol", "Tahoma", "Times New Roman",
                       "Trebuchet MS", "Tunga", "Verdana", "Vrinda", "Webdings",
                       "Wingdings"]
    ###############################################################

    sb = Scrollbar(root)
    sb.place(relx=0.334, rely=0.14, relheight=0.34)
    lbVar = Tkinter.Variable()
    lbVar.set(schriftauswahl)
    lb = Tkinter.Listbox(root, listvariable = lbVar, yscrollcommand=sb.set)
    lb.place(relx=0.018, rely=0.14 , relwidth=0.317 , relheight=0.34)
    print lbVar
    lbVar.set(schriftauswahl)
    sb.config(command=lb.yview)
    lb.insert("end", *schriftauswahl)
    lb.selection_set(0)
    lb.bind("<<ListboxSelect>>", schrift)

    ###############################################################

    schriftschnitt = ["Standard", "Kursiv", "Fett", "Fett Kursiv"]

    lb1 = Tkinter.Listbox(root)
    lb1Var = Tkinter.StringVar()
    lb1.place(relx=0.385, rely=0.14 , relwidth=0.26 , relheight=0.34)
    
    lb1.insert("end", *schriftschnitt)
    lb1.selection_set(0)
    lb1.bind("<<ListboxSelect>>", schriftschnitt_ausgabe)


    ################################################################
    sb2 = Tkinter.Scrollbar(root)
    sb2.place(relx=0.76, rely=0.14, relheight=0.34)

    lb2 = Tkinter.Listbox(root, yscrollcommand=sb2.set)
    lb2Var = Tkinter.StringVar()
    lb2.place(relx=0.66, rely=0.14 , relwidth=0.10 , relheight=0.34)

    sb2.config(command=lb2.yview)
    
    lb2.insert("end", *[i for i in range(72)])
    lb2.selection_set(0)
    lb2.bind("<<ListboxSelect>>", grosse)
    ################################################################

Ich möchte die Schriftart einstellen und das ist das Problem.
Ich will die es so haben z.B. font = ("Arial", 11, bold) dazu muss ich die
werte immer wieder abrufen, und das funktioniert nicht!
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:

Keiner ne Idee?
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
Antworten