Seite 1 von 1

Funktioniert ausserhalb von IDLE nicht

Verfasst: Mittwoch 11. April 2007, 16:12
von Crypted
Hey Leute^^
Hab mir schon immer mal vorgenommen Python auszuprobieren,
gestern hab ich ein bisschen was gemacht.
Hab mich etwas eingelesen und bin zum Thema Tkinter gekommen.
Hat mich interessiert, also hab ich mit dem Wissen, das ich gestern gesammelt hab versucht einen simplen Editor zu coden :

Code: Alles auswählen

from Tkinter import *
import tkMessageBox


def editorprogram():
    def beendeprogramm():
        window.destroy()
    
    def spdef():
        dataline.close()
        speicherinhalt=text.get('1.0',END)
        saveornot=tkMessageBox.askokcancel(title="Überschreiben, Speichern?",message=u"Wenn Sie auf OK klicken wird die Datei überschrieben!")
        if(saveornot!=0):
            saveline=open(textfile,"w")
            saveline.write(speicherinhalt)
            saveline.close()
    textfile=eingabe.get()
    dialog.destroy()
    window=Tk()
    window.title("Arunsoft SimpleEdit 1.0")
    dataline=open(textfile)
    inhalt=dataline.read()
    text=Text(window)
    text.pack()
    speichern=Button(window,text=u"Speichern",command=spdef)
    speichern.pack()
    beenden=Button(window,text=u"Beenden",command=beendeprogramm)
    beenden.pack()
    text.insert(END,inhalt)
dialog=Tk()
dialog.title("Arunsoft SimpleEdit 1.0 - PROMPT")
lab1=Label(dialog,text=u"Bitte geben Sie den Dateinamen an:")
lab1.pack()
eingabe=Entry(dialog)
eingabe.pack()
button=Button(dialog,text=u"OK",command=editorprogram)
button.pack()
Das Problem is: Es geht zwar in IDLE aber nicht, wenn ich es als *.pyw abspeichere. Hab dann noch gelesen, dass da etwas mit mainloop() gemacht werden muss. Dann hab ich dialog.mainloop() und window.mainloop() eingesetzt. :

Code: Alles auswählen

from Tkinter import *
import tkMessageBox


def editorprogram():
    def beendeprogramm():
        window.destroy()
    
    def spdef():
        dataline.close()
        speicherinhalt=text.get('1.0',END)
        saveornot=tkMessageBox.askokcancel(title="Überschreiben, Speichern?",message=u"Wenn Sie auf OK klicken wird die Datei überschrieben!")
        if(saveornot!=0):
            saveline=open(textfile,"w")
            saveline.write(speicherinhalt)
            saveline.close()
    textfile=eingabe.get()
    dialog.destroy()
    window=Tk()
    window.title("Arunsoft SimpleEdit 1.0")
    dataline=open(textfile)
    inhalt=dataline.read()
    text=Text(window)
    text.pack()
    speichern=Button(window,text=u"Speichern",command=spdef)
    speichern.pack()
    beenden=Button(window,text=u"Beenden",command=beendeprogramm)
    beenden.pack()
    text.insert(END,inhalt)
    window.mainloop()#<---- HIER!
dialog=Tk()
dialog.title("Arunsoft SimpleEdit 1.0 - PROMPT")
lab1=Label(dialog,text=u"Bitte geben Sie den Dateinamen an (relativ):")
lab1.pack()
eingabe=Entry(dialog)
eingabe.pack()
button=Button(dialog,text=u"OK",command=editorprogram)
button.pack()
dialog.mainloop() #<---- HIER!
Es tut sich aber immer noch nix, wenn ich es mit *.pyw versuche...^^

Kann sein, dass ich irgendein Grundlagenwissen verpasst habe in Python, hab nur das durchgelesen was mich interessiert hat^^

Hab dann noch rumgebastelt: Wenn ich einige Stellen weglasse funktioniert (wenn ich alles was mit der Datei zu tun hat weglasse).

lg,
Crypted

---

Wenn ich endlich weiss, warum das Obrige nicht funzt,
werd ich es wohl mit grid() schön zu ausrichten versuchen, weil mir pack() nicht einleuchten will^^
Sorry, wenn es eine Anfängerfrage ist, bin aber Anfänger ;) Habe per Forensuche nichts gefunden (auf den ersten Blick jedenfalls) was mein Problem anspricht.[/code]

Verfasst: Mittwoch 11. April 2007, 17:03
von encbladexp
Ich bevorzuge zwar GTK+ & Glade, aber das mainloop() in der editorprogram() Funktion kannste dir sparen (habs selber probiert).

Bei mir (unter Linux) läuft dein programm einwandfrei...

Starte es bitte einfach mal auf ner cmd oder so, damit man schön nen output von python sehen kann (Zwecks Fehlermeldungen).

mfg Betz Stefan

Verfasst: Mittwoch 11. April 2007, 17:08
von BlackJack
Was auf jeden Fall zu Problemen führen kann ist das zweifache verwenden von `Tk()`. So ein Objekt sollte es pro Programm nur einmal geben. Andere Fenster sollte man per `Toplevel()` erzeugen.

Verfasst: Mittwoch 11. April 2007, 19:01
von Crypted
Hey Leute!
Danke erst mal für die schnellen Antworten!
Habe das ganze nun mit Toplevel() gemacht
(Habe den Code nun anders gestaltet, damit
ich beim Dialog Toplevel(Hauptfenster) machen kann.
)

Das Problem im Moment ist einfach, dass der Dialog
hinter dem Hauptfenster steht und man ihn übersieht.
Hab zwar noch nicht gegoogelt oder gesucht aber:
Weiss jemand wie das geht?
Kann man so einem Toplevelfenster (wenn mans den so nennt :D) einen
ähnlichen Status wie einer MessageBox geben (dass das Toplevelfenster
die höchste Priorität hat => Vorne steht und der Resten unanklickbar ist)

Und ein anderes Problem scheint der Ü Umlaut gewesen zu sein.
(Habs erst bemerkt als ich wie geraten das Script per CMD aufgerufen
hab => Fehlermeldung)
Und als ich das mit IDLE abspeichern wollte hat es mir dann grad die
richtige Kodierung vorgeschlagen.

Neuer Code:

Code: Alles auswählen

# -*- coding: cp1252 -*-
from Tkinter import *
import tkMessageBox

def beendeprogramm():
    window.destroy()

def insertfiletxt():
    textfile=eingabe.get()
    dialog.destroy()
    dataline=open(textfile)
    inhalt=dataline.read()
    text.insert(END,inhalt)

def spdef():
    speicherinhalt=text.get('1.0',END)
    saveornot=tkMessageBox.askokcancel(title="Überschreiben, Speichern?",message=u"Wenn Sie auf OK klicken wird die Datei überschrieben!")
    if(saveornot!=0):
        saveline=open(textfile,"w")
        saveline.write(speicherinhalt)
        saveline.close()

window=Tk()
window.title("Arunsoft SimpleEdit 1.0")
text=Text(window)
text.pack()
speichern=Button(window,text=u"Speichern",command=spdef)
speichern.pack()
beenden=Button(window,text=u"Beenden",command=beendeprogramm)
beenden.pack()

dialog=Toplevel(window)
dialog.title("Arunsoft SimpleEdit 1.0 - PROMPT")
lab1=Label(dialog,text=u"Bitte geben Sie den Dateipfad an (relativ):")
lab1.pack()
eingabe=Entry(dialog)
eingabe.pack()
button=Button(dialog,text=u"OK",command=insertfiletxt)
button.pack()

window.mainloop()
Lg,
Crypted

...
Jetzt schau ich mir grid() an^^

Verfasst: Mittwoch 11. April 2007, 19:40
von schlangenbeschwörer
Hi!
Du suchst grab_set. Hier oder in der Doku liest du mehr.
Zudem kannst du mit `fenster.["state"]` den Status des Fensters ändern. Dazu
hier mehr.

Gruß, jj

Verfasst: Mittwoch 11. April 2007, 19:52
von Crypted
Danke, werd ich mir anschauen :)

Verfasst: Donnerstag 12. April 2007, 11:18
von Crypted
Sorry for Doublepost^^

Ich hab die Methoden ausprobiert: Das Hauptfenster wird zwar
inaktiv und man muss zuerst das Toplevel schliessen aber das Toplevel
bleibt trotzdem im Hintergrund.
Weiss jmd. eine Lösung?

Aktueller Code:

Code: Alles auswählen

# -*- coding: cp1252 -*-
from Tkinter import *
import tkMessageBox


def beendeprogramm():    window.destroy()

def insertfiletxt():
    global textfile
    textfile =eingabe.get()
    dialog.destroy()
    dataline=open(textfile)
    inhalt=dataline.read()
    text.insert(END,inhalt)

def spdef():
    speicherinhalt=text.get('1.0',END)
    saveornot=tkMessageBox.askokcancel(title="Überschreiben, Speichern?",message=u"Wenn Sie auf OK klicken wird die Datei überschrieben!")
    if(saveornot!=0):
        saveline=open(textfile,"w")
        saveline.write(speicherinhalt)
        saveline.close()

    

window=Tk()
window.title("Arunsoft SimpleEdit 1.0")
text=Text(window)
text.pack()
speichern=Button(window,text=u"Speichern",command=spdef)
speichern.pack()
beenden=Button(window,text=u"Beenden",command=beendeprogramm)
beenden.pack()

dialog=Toplevel(window)
dialog.title("Arunsoft SimpleEdit 1.0 - PROMPT")
lab1=Label(dialog,text=u"Bitte geben Sie den Dateinamen an (relativ):")
lab1.pack()
eingabe=Entry(dialog)
eingabe.pack()
button=Button(dialog,text=u"OK",command=insertfiletxt)
button.pack()
dialog.grab_set()
dialog.focus_set()
dialog.wait_window()
window["state"]="diabled"
window.mainloop()



Verfasst: Donnerstag 12. April 2007, 12:03
von Andy
Crypted hat geschrieben:Ich hab die Methoden ausprobiert: Das Hauptfenster wird zwar
inaktiv und man muss zuerst das Toplevel schliessen aber das Toplevel
bleibt trotzdem im Hintergrund.
Weiss jmd. eine Lösung?
So?

Code: Alles auswählen

# -*- coding: cp1252 -*- 
from Tkinter import * 
import tkMessageBox 


def beendeprogramm():    window.destroy() 

def insertfiletxt(): 
    global textfile 
    textfile =eingabe.get() 
    dialog.destroy() 
    dataline=open(textfile) 
    inhalt=dataline.read() 
    text.insert(END,inhalt) 

def spdef(): 
    speicherinhalt=text.get('1.0',END) 
    saveornot=tkMessageBox.askokcancel(title="Überschreiben, Speichern?",message=u"Wenn Sie auf OK klicken wird die Datei überschrieben!") 
    if(saveornot!=0): 
        saveline=open(textfile,"w") 
        saveline.write(speicherinhalt) 
        saveline.close() 

    

window=Tk() 
window.title("Arunsoft SimpleEdit 1.0") 
text=Text(window) 
text.pack() 
speichern=Button(window,text=u"Speichern",command=spdef) 
speichern.pack() 
beenden=Button(window,text=u"Beenden",command=beendeprogramm) 
beenden.pack()
window.wait_visibility()


dialog=Toplevel(window) 
dialog.title("Arunsoft SimpleEdit 1.0 - PROMPT") 
lab1=Label(dialog,text=u"Bitte geben Sie den Dateinamen an (relativ):") 
lab1.pack() 
eingabe=Entry(dialog) 
eingabe.pack() 
button=Button(dialog,text=u"OK",command=insertfiletxt) 
button.pack()
dialog.grab_set()
dialog.focus_force()  
window.mainloop()
Gruß Andy

EDIT: Funktioniert übrigens außerhalb v. IDLE und auch mit .pyw

Verfasst: Donnerstag 12. April 2007, 13:13
von Zizibee
Wegen den Sonderzeichen ü, ö, ä usw. kannst Du mal hier schaun, da steht wie Du die ersetzen kannst. Ca. nach einem drittel in einer Tabelle.

Verfasst: Donnerstag 12. April 2007, 13:17
von Andy
Zizibee hat geschrieben:Wegen den Sonderzeichen ü, ö, ä usw. kannst Du mal hier schaun, da steht wie Du die ersetzen kannst. Ca. nach einem drittel in einer Tabelle.
Hallo Zizibee!

Nur der Vollständigkeit halber:

Aber Du kennst doch auch das hier, oder?

Code: Alles auswählen

# -*- coding: cp1252 -*- 

Verfasst: Donnerstag 12. April 2007, 13:19
von Zizibee
Andy hat geschrieben:Hallo Zizibee!

Nur der Vollständigkeit halber:

Aber Du kennst doch auch das hier, oder?

Code: Alles auswählen

# -*- coding: cp1252 -*- 
nö, bisher kannte ich es nicht... :oops:

Verfasst: Donnerstag 12. April 2007, 13:38
von Andy
Zizibee hat geschrieben:
Andy hat geschrieben:Hallo Zizibee!

Nur der Vollständigkeit halber:

Aber Du kennst doch auch das hier, oder?

Code: Alles auswählen

# -*- coding: cp1252 -*- 
nö, bisher kannte ich es nicht... :oops:
Man spricht von der magic line, wenn diese in der ersten oder zweiten Zeile eines Scripts enthalten ist.
Falls Du mehr drüber wissen willst, kannst Du ja mal hier schauen: [wiki]Tags/Unicode[/wiki]
Dort sind auch noch viele andere codecs erläutert.

Verfasst: Donnerstag 12. April 2007, 13:51
von Zizibee
Andy hat geschrieben:Falls Du mehr drüber wissen willst, kannst Du ja mal hier schauen: [wiki]Tags/Unicode[/wiki]
Dort sind auch noch viele andere codecs erläutert.
Das scheint eine nette Seite zu sein, die kannte ich bisher nicht, danke!

Verfasst: Donnerstag 12. April 2007, 18:28
von Crypted
hab die focus_force() Methode wohl übersehen, danke!
lg,
Crypted

Verfasst: Donnerstag 12. April 2007, 18:30
von Andy
Crypted hat geschrieben:hab die focus_force() Methode wohl übersehen, danke!
lg,
Crypted
Ja, und diese auch: wait_visibility()