Funktioniert ausserhalb von IDLE nicht

Fragen zu Tkinter.
Antworten
Crypted
User
Beiträge: 7
Registriert: Mittwoch 11. April 2007, 15:59

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]
encbladexp
User
Beiträge: 61
Registriert: Freitag 7. März 2003, 19:28
Kontaktdaten:

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
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.
Crypted
User
Beiträge: 7
Registriert: Mittwoch 11. April 2007, 15:59

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^^
Zuletzt geändert von Crypted am Mittwoch 11. April 2007, 19:53, insgesamt 1-mal geändert.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

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
Crypted
User
Beiträge: 7
Registriert: Mittwoch 11. April 2007, 15:59

Danke, werd ich mir anschauen :)
Crypted
User
Beiträge: 7
Registriert: Mittwoch 11. April 2007, 15:59

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()


Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Wegen den Sonderzeichen ü, ö, ä usw. kannst Du mal hier schaun, da steht wie Du die ersetzen kannst. Ca. nach einem drittel in einer Tabelle.
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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 -*- 
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

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:
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

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!
Crypted
User
Beiträge: 7
Registriert: Mittwoch 11. April 2007, 15:59

hab die focus_force() Methode wohl übersehen, danke!
lg,
Crypted
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Crypted hat geschrieben:hab die focus_force() Methode wohl übersehen, danke!
lg,
Crypted
Ja, und diese auch: wait_visibility()
Antworten