Warum schließt sich mein Programm sofort wieder?

Fragen zu Tkinter.
Antworten
Hotp44py
User
Beiträge: 3
Registriert: Donnerstag 1. Oktober 2015, 06:41

Ich habe ein Verschlüsselungsprogramm geschrieben. Wenn ich es in IDLE teste funktioniert alles, aber direkt aus dem Windows Explorer öffnet sich kurz die Python shell und es werden zwei(aufgrund der kurzen anzeigezeit) unlesbare Zeilen ausgegeben :K .
Ich weiß, dass mein Programmierstil nicht der beste ist :oops:
Hier der code:

Code: Alles auswählen

#Python 3.4.1
from tkinter import *
from tkinter.filedialog import *
import time
import sys
import os
from string import *
import webbrowser

global root
root = Tk()

class screen(Frame):#Mein spezieller Frame
    
    def add_widget(self,widget,**options):
        widget.master = self
        widget.pack(**options)
    
    def geometry(self,höhe,breite):
        self["height"] = höhe
        self["width"] = breite
    
    def __init__(self,master,borderwidth=0,bg="white",pos=NONE):
        Frame.__init__(self,master,borderwidth=borderwidth,bg=bg)
        print("screen angelegt")

def tempsavescr(scrname):#bewährt, um die screens zu wechseln
    schreiber = open("Dateien/tmp/packscreen.tmp","w")
    schreiber.write(scrname)
    schreiber.close()

tempsavescr("tempsavescreen und temploadscreen funktionieren!")

def temploadscr():#bewährt, um die screens zu wechseln
    leser = open("Dateien/tmp/packscreen.tmp")
    packscreen = leser.read()
    leser.close()
    return packscreen;

print(temploadscr())
tempsavescr("start")

#def verschlüsseln():
#    pass
#verschlüsseln() wird nur durch einen Button in vgui() gerufen.

def vgui():
    
    def acceptevent(vstring):
        print("vstring( " + vstring + " )wird an verschlüsseln übergeben.")
        verschlüsseln(vstring)
    packscr = temploadscr()
    print(packscr)
    if packscr == "start":
        start.pack_forget()
    elif packscr == "escr":
        escr.pack_forget()
    elif packscr == "vscr":
        exit()
    global vscr
    vscr = screen(root)
    vscr.geometry(höhe=100,breite=100)
    vscr.text = screen(vscr)
    vscroll = Scrollbar(vscr.text)
    vtext = Text(vscr.text,height=40,width=170)
    vscroll.pack(side="right",fill="y")
    vtext.pack(side="left",fill="y")
    vscroll.config(command=vtext.yview)
    vtext.config(yscrollcommand=vscroll.set)
    okbutton = Button(vscr,command=lambda:acceptevent(vtext.get(1.0,END)),text="Verschlüsseln",relief="raised",borderwidth=1,bg="white",fg="green")
    okbutton.pack(side="bottom")
    vscr.text.pack()
    vscr.pack()
    tempsavescr("vscr")

#def entschlüsseln(string):
#    pass
#entschlüsseln() wird nur durch einen Button in egui() gerufen

def egui():
    
    def acceptevent(estring):
        print("estring( " + estring + " )wird an verschlüsseln übergeben.")
        entschlüsseln(estring)
    packscr = temploadscr()
    print(packscr)
    if packscr == "start":
        start.pack_forget()
    elif packscr == "escr":
        exit()
    elif packscr == "vscr":
        vscr.pack_forget()
    global escr
    escr = screen(root)
    escr.geometry(höhe=100,breite=100)
    escr.text = screen(escr)
    escroll = Scrollbar(escr.text)
    etext = Text(escr.text,height=40,width=170)
    escroll.pack(side="right",fill="y")
    etext.pack(side="left",fill="y")
    escroll.config(command=etext.yview)
    etext.config(yscrollcommand=escroll.set)
    okbutton = Button(escr,command=lambda:acceptevent(etext.get(1.0,END)),text="Entschlüsseln",relief="raised",borderwidth=1,bg="white",fg="green")
    okbutton.pack(side="bottom")
    escr.text.pack()
    escr.pack()
    tempsavescr("escr")

root.title("SC Test")
root.geometry("500x500")
bar = Menu(root)#erstelle leiste
#featurem
featurem = Menu(bar)
featurem.add_command(label="Verschlüsseln",command=lambda:vgui())
featurem.add_command(label="Entschlüsseln",command=lambda:egui())
#helpm
helpm = Menu(bar)
helpm.add_command(label="Website Hotp44.de",command=lambda:webbrowser.open("http://Hotp44.de/"))

global start
start = screen(root)
startlabel1 = Label(start,text="\nWillkommen bei SC!\n",bg="blue",fg="yellow",font="Arial 30")
start.add_widget(startlabel1)
startlabel2 = Label(start,text="Bitte wählen Sie eine Aktion unter 'Funktionen' aus!",bg="white",fg="black",font="Arial 10")
start.add_widget(startlabel2)
start.pack()
kill = Button(root,text="\nBeenden\n",bg="white",fg="red",font=None,command=exit)
kill.pack(side="bottom")

bar.add_cascade(label="Funktionen",menu=featurem)#zeige "Funktionen" an
bar.add_cascade(label="Hilfe",menu=helpm)#zeige "Hilfe" an
root.config(menu=bar)
root.mainloop()
BlackJack

@Hotp44py: Starte das Programm mal nicht per Doppelklick sondern von einer Konsole/Eingabeaufforderung aus, dann kannst Du auch die Fehlermeldung lesen.
Hotp44py
User
Beiträge: 3
Registriert: Donnerstag 1. Oktober 2015, 06:41

@BlackJack Danke für den Tipp! ich mach das mal...
Zuletzt geändert von Hotp44py am Donnerstag 1. Oktober 2015, 07:50, insgesamt 1-mal geändert.
Hotp44py
User
Beiträge: 3
Registriert: Donnerstag 1. Oktober 2015, 06:41

Im Code hatte ich Umlaute verwendet. Vielen Dank! :D
http://Hotp44.de
BlackJack

@Hotp44py: Als nächstes solltest Du dann das loswerden was da nicht funktioniert, denn das ist ja noch schlimmer als ``global``, was in einem sauberen Programm auch nichts zu suchen hat.

Die Sternchen-Importe sollten nicht sein, und die Lektüre vom Style Guide for Python Code könnte nicht schaden.

Auf Modulebene gehört nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm gehört nicht dort hin, schon gar nicht mit den anderen Definitionen vermischt, denn unübersichtlicher geht's kaum. Üblicherweise heisst die Funktion mit dem Hauptprogramm `main()`.
Antworten