Dateipfad anzeigen lassen nach "datei öffen"-Dialo

Fragen zu Tkinter.
Antworten
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Hallo

ich bräuchte nach langer Zeit mal wiede ein klein wenig Hilfe von euch bzw. Hinweise für einen Denkanstoß. Ich muss dazu aber sagen, dass ich mich noch nicht lange mit Tkinter und GUI in Python beschäftigt habe.
Und zwar will ich eine ganz einfache und rudimentäre GUI erstellen mit deren Hilfe man verschiedene andere Programme starten kann bzw. Parameter an diese Programme übergeben.
Als erstes wollte ich einen "Datei auswählen"-Dialog aufrufen, mit welchem man eine bestimmte Datei auswählen kann, die für den späteren Gebrauch benutzt werden soll. Das hab ich jetzt schon fertiggestellt nur diese Datei mit dem gesamten entsprechenden Dateipfad zu dieser Datei soll jetzt zwischengespeichert werden.

Entweder soll jetzt noch neben dem Butten ein Textfeld eingefügt werden, welches nach Auswahl der Datei den Dateipfad anzeigt (ähnlich wie wenn man auf irgendeiner Seite eine Datei hochladen will) oder der Dateipfad soll im Hintergrund gespeichert werden. Dabei finde ich aber die erste Variante besser, da man dabei sieht, dass man schon eine Datei ausgesucht hat.
Der Sinn besteht darin, dass von Hause aus eine bestimmte Datei schon für den weiteren Programmablauf genutzt wird, wird aber vom Nutzer eine andere ausgesucht, soll diese verwendet werden.
Hier mal der Quellcode dazu:

Code: Alles auswählen

from Tkinter import *
from tkFileDialog import *

root = Tk()

frame = Frame()
dateipfad = Text(root, width=10, height=1)
knopf = Button(root, text="Datei auswählen", command=openFile)

def openFile ():
    print "gedrückt"
    datei = askopenfilename(initialdir="../../../Haupordner/Unterordner",
                            initialfile="Datei.xml")


dateipfad.pack()
knopf.pack()
frame.pack()

root.mainloop()
Oder gibt es vielleicht noch ein anderen GUI-Baustein der sowas gleich enthält oder ein anderes TkFileDialog-modul, welches ich benutzen muss???

LG
Daniela
BlackJack

@Daniela: Dafür würde man am besten ein eigenes Widget schreiben, das aus dem Button und dem Textfeld besteht.

Auf jeden Fall solltest Du Dir die Sternchen-Importe gar nicht erst angewöhnen und auch keinen Programmcode auf Modulebene. Wenn das nicht sauber in Funktionen verschwindet, ist die Gefahr einfach zu gross "globale" Objekte zu benutzen.

Der `Frame` macht übrigens nichts sinnvolles.
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

Hallo Daniela

bin mir nicht sicher ob es das ist was du willst,hoffe aber das es
dir zumindest irgendwie hilft.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-

import Tkinter as tk
import tkFileDialog as fd
import os

def dateipfad():
	home = os.path.expanduser("~")
	datei_pfad = fd.askopenfilename(initialdir=home,
                 title="Datei-Auswahl")
	entry.insert(tk.END, datei_pfad)


root = tk.Tk()
root.title("Dateipfad anzeigen")
button = tk.Button(root,text="Datei auswählen",command=dateipfad)
button.grid(row=0,column=0)
label = tk.Label(root,text="Datei Pfad")
label.grid(row=0,column=1)
entry = tk.Entry(root,width=25)
entry.grid(row=0,column=2)
root.mainloop()
Gruß...busfahrer
Alles wird gut ;-)
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

@busfahrer

Vielen Dank für deine Hilfe. Genau nach sowas hatte ich gesucht und man lernt nie aus. Damit lässt sich auf jeden Fall weiter arbeiten.

LG
Daniela
problembär

Hallo,

hier nochmal mit .pack() und noch etwas dichter am Ausgangscode:

Code: Alles auswählen

#-*- coding: iso-8859-1 -*-

import Tkinter
import tkFileDialog

def openFile ():

    dateipfad.delete(0, Tkinter.END)
    print "gedrückt"
    datei = tkFileDialog.askopenfilename(initialdir="../../../Haupordner/Unterordner",
                            initialfile="Datei.xml")
    dateipfad.insert(Tkinter.END, datei)

root = Tkinter.Tk()

dateipfad = Tkinter.Entry(root,
                          width = 70)

knopf = Tkinter.Button(root, text="Datei auswählen", command=openFile)

knopf.pack(side = Tkinter.LEFT)
dateipfad.pack(fill = Tkinter.X)

root.mainloop()
Prinzipiell würde ich Tkinter-Code aber in eine Klasse packen, dann kann man leichter die Methoden aufrufen.

Viele Grüße
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

@problembär

vielen Dank auch für diesen Hinweis. Ich muss mal sehen, welche Methode besser ist, bzw. welche sich besser handhaben lässt.
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Ich hab nochmal eine kleine Frage zu meinem oben geschilderten Problem:

Also eigentlich wollte ich fragen, ob es möglich ist in dem Entry-Feld auch eine Art Standartwert anzugeben, welcher beim Aufruf der GUI gleich angezeigt wird.
Bisher ist es ja so, dass das Entry-Feld erst gefüllt wird, wenn man auf den entsprechenden Button drückt.

Dabei fällt mir ein, dass dieser Inhalt des Feldes jetzt an ein anderes Programm übergeben werden muss.

Folgendermassen soll es aussehen:
  • - Berechnungen.py liesst Werte aus einer Datei aus, der Dateipfad soll von mit Hilfe der GUI ausgewählt werden.
    - Zusammen.py führt die einzelnen Ergebnisse aus Berechnung.py zusammen
    - Darstellung.py schreibt die Ergebniss in eine Datei
jetzt soll quasi die GUI das Programm "schreiben" in Darstellung.py aufrufen und der Dateipfad, der in der GUI ausgewählt wurde soll am besten nach ganz unten (Berechnungen.py) durchgegeben werden.

Weiß jemand Rat?

LG
Daniela
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ich sehe nicht, warum man daraus drei Skripte machen sollte.
Da genügt auch eins.

Du könntest eine Klasse für die GUI entwerfen, dort wird auch der Dateipfad ausgewählt etc. - alles, was mit der Benutzerinteraktion zu tun hat.

Dann könntest du eine Klasse Rechner o.ä. oder evtl. auch nur eine Funktion berechne() verwenden, an die die Eingabedaten verfüttert werden und wo die Berechnungen durchgeführt und in einer geeigneten Datenstruktur abgelegt werden.

Eine Funktion sichern() erhält über die GUI den Dateipfad, vom Rechner die Daten und schreibt die Ergebnisse in eine Datei.
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Ich hatte den Inhalt der 3 Skripte deshalb getrennt, damit jede Datei zum Einen mehr oder weniger eigenständig ist und es für mich logischer erschien und zum Anderen, damit die Datei nicht so lang ist.

Naja wie dem auch sei, kann man denn jetzt eigentlich ein Entry-Feld mit nem Default-Wert belegen, also das dieser sofort angezeigt wird, bis man ihn ändert?
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

Hallo Daniela

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-

import Tkinter as tk
import tkFileDialog as fd
import os

def dateipfad():
    home = os.path.expanduser("~")
    datei_pfad = fd.askopenfilename(initialdir=home,
                 title="Datei-Auswahl")
    entry.delete(0, tk.END)
    entry.insert(tk.END, datei_pfad)


root = tk.Tk()
entry = tk.Entry(root,width=25)
entry.grid(row=0,column=0)
entry.insert(tk.END, "/bla/blubb")
root.mainloop()
Entweder so oder ansonsten solltest du dir glaube ich das hier
mal anschauen http://infohost.nmt.edu/tcc/help/pubs/t ... ables.html

Gruß...busfahrer
Alles wird gut ;-)
Antworten