Allgemeine Fragen zu Tkinter

Fragen zu Tkinter.
Antworten
Tkinter-Einsteiger

Liebe Pythonprogrammierern,
ich beschäftige mich erst seit wenigen Monaten mit Python, aber erst seit Wochen mit Tkinter. Mir wurde diese Sprache und das Modul empfohlen, um ein benutzerdefiniertes Programm mit grafischer Oberfläche zu gestalten. Allerdings gibt die Suchmaschine des Forums und auch das Internet recht wenig her, um mit Tkinter mehr erstellen zu können, als Labels, Buttons etc. Daher würde ich gerne wissen, wie ich am Besten Tkinter erlernen kann? Wichtig ist mir erstmal nur Tkinter, da die Grundvoraussetzungen von Python für mein Programm bereits vorhanden sind.
Ich wäre sehr dankbar, wenn ihr mir weiterhelfen könntet!
Tkinter-Einsteiger

Ich werde heute, obwohl mein Englisch nicht das beste ist, die geposteten Links noch durcharbeiten und Fragen, auf die ich keine Antwort finde, stellen.
rogen

um genauer nachzuschlage nehme ich

http://www.amazon.com/exec/obidos/tg/de ... 7?v=glance

und sonst

Objektorientierte Programmierung mit Python
Tkinter-Einsteiger

Bisher verlief das Schreiben meines Programmes recht gut und da es jetzt fast fertig ist, habe ich nur drei Fragen:
1. Wie kann ich eine Setup-Datei erstellen, die mir das Programm ordnungsgemäß auf dem PC installiert?

2. Ich muss in meinem Programm mehrere .txt Dateien 'verdecken', sozusagen nur für das Programm (ein)lesbar und sichtbar machen. Der Nutzer darf diese Dateien also nicht öffnen können.

3. Habe ich hier schon einmal etwas über selbsterstellte Iconsbilder gelesen, finde aber nicht näheres darüber. Das:

root = Tk()
root.title('Eigener Titel')
root.iconbitmap('C:\Python22\Tools\idle\Icons\tk.gif')

funktioniert leider nicht!
Auch wenn ich das Bild, das ich verwenden will, vorher definiere klappt es nicht.

Ich hoffe ihr könnt mir zumindest in ein paar Fragen behilflich sein.
Gruß Tkinter-Einsteiger
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

hallo.

ich denke das funktioniert:

Code: Alles auswählen

root = Tk() 
root.title('Eigener Titel') 
root.iconbitmap('pfad/datei.gif') 
verwende anstatt
MacEvil
User
Beiträge: 52
Registriert: Mittwoch 21. Januar 2004, 21:40

Und fehlt da nicht noch ein "root.mainloop()" ?

Link der alles abdeckt :
http://www.pythonware.com/library/tkinter/introduction/
Möge die Python-Community gedeihen
Tkinter-Einsteiger

Also einen mainloop hätte ich noch nie gebraucht, aber mal schauen...

Danke Olf, aber das habe ich schon probiert hat vorhin so nicht funktioniert, werde es aber weiterhin versuchen.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

solange du unter idle arbeitest, gehts auch ohne mainloop(), wenn das Script auch ohne idle laufen sollte, so immer mit mainloop().

statt / oder \ besser die pfade mit os.path.join zusammenfügen.


Gruß

Dookie
Tkinter-Einsteiger

Wie sieht es mit Frage 2 und 3 aus?

1. Wie kann ich eine Setup-Datei erstellen, die mir das Programm ordnungsgemäß auf dem PC installiert?

2. Ich muss in meinem Programm mehrere .txt Dateien 'verdecken', sozusagen nur für das Programm (ein)lesbar und sichtbar machen. Der Nutzer darf diese Dateien also nicht öffnen können.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Zu beiden Fragen:

Da kommt es sehr auf das OS an.

Zu 1. Würde ich ein Pythonscript schreiben, welches das Verzeichnis für das Programm anlegt und alle Teile dort hinkopiert, wohin sie gehören. In dem Script kannst Du auch prüfen, ob gewisse Voraussetzungen erfüllt sind und im Falle des Falles den Anwender auf fehlende Programme oder Module hinweisen. Bei umfangreichen Programmpaketen kannst Du auch distutils nehmen.

Zu 2. Unter Linux werden Dateien versteckt, indem der Dateiname mit einem "." beginnt. Um die Dateien nur von deinem Programm lesen zu können, müsste das Programm mit einem eigenen Benutzeraccount laufen und dann die Dateien nur für diesen Nutzer lesbar gemacht werden. Das kann dann von dem Script eingerichtet werden. Im Grunde sollte es aber reichen, die Dateien mit "chmod 0444 dateiname" als nurlesbar zu kennzeichnen und im Bedarfsfall aus dem Programm die Datei vorübergehend mit [/b]os.chmod("dateiname",0666)[/b] schreibbar und anschliessend mit [/b]os.chmod("dateiname",0444)[/b] wieder nur lesbar zu machen.
Das Ganze hat aber mehr mit dem OS als mit Python zu tun.


Gruß

Dookie
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

wenn du unter windoof eine setup datei erstellen willst, dann kannst Du das auch mit einer .bat Datei lösen.

wenn du das nciht willst, kannst du dir einen installer runteladen, bakannt sind
Nullsoft, Miscrosoft, und InstallShield (oder so)
Tkinter-Einsteiger

Das mit der Setupdatei sollte kein Problem sein.

Ich habe aber dennoch eine Frage: Ich möchte ein Programm schreiben, mit dem man Wörter in einer Textdatei abspeichert. Soweit alles in Ordnung, nur müsste ich die Datei ständig erweitern lassen und somit 'append' verwenden. Auch kein Problem, nur ich brauche ein bestimmtes Wort am ENDE nach jeder Eingabe! Wenn ich einfach nur anhängen lasse befindet sich das Wort also nicht mehr an letzter Stelle und die Datei ist sinnlos.
Ich habe mir überlegt erstmal den Text, der sich bereits in der Datei befindet so: text = in_file.read() herauszufiltern und diesen zu speichern.
Dann könnte ich diesen Text ohne Probleme wieder anhängen.
Nur leider wird, wenn ich den text anschließend während des Speicherns anhängen will, der aktuelle text, sprich das, was ich geschrieben habe, angehängt und nicht der, den ich am Anfang herausgefiltert hätte.

Falls noch etwas unklar ist, gehe ich gerne näher darauf ein.
Würde mich freuen, wenn ihr einen Lösungsvorschlag hättet!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi,

ich hoffe ich habe dich richtig verstanden:

Code: Alles auswählen

ende_txt = "ENDE"
try:
    f = file("datei.txt","r")
    old_text = f.read().rstrip() #alter Text ohne Whitespaces am Ende
    f.close()
    old_text = old_text[:-length(ende_txt)] # alter Text ohne "ENDE" am Ende
except IOError:
    old_text = ""

new_text = input("Text eingeben")

f = file("datei.txt","w")
f.write(old_text) # alter Text
f.write(new_text) # neuer Text
f.write(ende_text) # Ende vom Text
f.close
Gruß

Dookie
Tkinter-Einsteiger

Hi,
ich habe es bisher so versucht:

Code: Alles auswählen

def load():
    global text
    datei = "datei.txt"
    in_file = open(datei,"r")
    text = in_file.read()
    wort = a # Eingabe, die in den Text eingefügt werden soll
    in_file.close()
    schreiben(wort)

def schreiben(wort):
    in_file = open(datei,"w")
    in_file.write(wort)
    in_file.close()


def speichertbla():
    global speichert
    speichert(text)
    
def speichert(text):
    in_file = open(datei,"a")
    in_file.write(text) # Hier ist das Problem. Der Text, der zu diesem   #Zeitpunkt existiert wird angehängt, nicht 'text'!
    in_file.close()
Wundert euch bitte nicht über die vielen Fehler, hauptsache es funktioniert :-)

So hatte ich mir das eigentlich vorgestellt, aber wie gesagt, geht der herausgefilterte Text verloren. :x

PS: Datei stark bearbeitet, nur diese Stelle ich wichtig, ansonsten funktioniert es.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Also ich verstehe jetzt überhaupt nichts mehr, wie soll sich da der Pythoninterpreter noch auskennen.

Vermeide erstmal gloable Variablen, besonders wenn Du dann noch Funktionsparameter hast die den gleichen Namen haben.

Wenn Du jetzt noch genau sagen oder an einem Beispiel zeigen kannst, was am ende in der Datei stehen soll, kann man dir sicher besser helfen.


Gruß

Dookie
Tkinter-Einsteiger

Die Fehler werden schon noch beseitigt.
Es ging leider nur mit global.

Also am Ende der Datei soll EOF stehen und zuvor der Text, der schon vor der Veränderung in der Datei vorhanden war.

Angenommen in der Datei steht:
a = b
EOF

Ich will das jetzt erweitern mit c = d. Die Datei muss also nach Verwendung des Programmes:
c = d
a = b
EOF
heißen.

Der Text der Datei soll also nicht verlorengehen, sondern einfach nur angehängt werden.
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Natürlich geht das auch ohne globale Variablen. Dookie hat doch schon ein gutes Beispiel gezeigt, wie man Deine Fragestellung lösen kann. Die Aufteilung in mehrere Funktionen halte ich für übertrieben. Allein schon dadurch würde die globale Variable vermieden.
Grundsätzlich reicht es die Datei einmal einzulesen und einmal rauszuschreiben. Ein zusätzlichen öffnen zum anhängen ist überflüssig. Generell würde ich sowas immer so lösen, die Datei einzulesen, die nötigen Änderungen in der Variable zu machen und diese Varibale wieder in eine Datei schreiben.
Wozu brauchst Du überhaupt EOF? Das die Datei am Ende zu Ende ist, ist doch klar, oder? :wink:
Tkinter-Einsteiger

Ok, das Problem habe ich jetzt gelöst.
Ich hatten einen Fehler, den ich nicht bemerkt habe.
Danke für die Mühe.

Jetzt hätte ich aber noch eine Frage:
Wieso wird das Fenster mit:

root = Tk()
root.deiconify()

nicht maximiert?
Antworten