Tkinter und globales x definieren?

Fragen zu Tkinter.
Antworten
bennym
User
Beiträge: 36
Registriert: Freitag 13. Oktober 2006, 21:17
Kontaktdaten:

Hallo!
Ich hab mal wieder ein peinliches Problem.....:oops:
In Zeile 6 soll x entry1.get sein und ich hab keinen plan wie ich das jetzt hinkrieg.

Vielen Dank Im Vorraus
mfg benny

Code: Alles auswählen

from Tkinter import *
import os
import ftplib


def ftplogin():
    ftp=ftplib.FTP(x) #<------dieses x soll entry1.get sein.
    ftp.login()
    ftp.dir()


def ftp():


    hauptfenster = Tk()
    Label(hauptfenster, text="Adresse", pady=10).grid(row=0, column=0)

    entry1 = Entry(hauptfenster)
    entry1.grid(row=1, column=1)

    button1 = Button(hauptfenster, text='ok', command=ftplogin)
    button1.grid(row=2, column=1)

    x = entry1.get()#<-----

ftp()
BlackJack

Vergiss globale Namen ganz schnell wieder. Die sind böse. :-)

Das lässt sich sauberer über Klassen lösen. Alles was sich mehrere Funktionen teilen ist dann als Attribut auf dem Objekt verfügbar.

Code: Alles auswählen

import ftplib
import os
import Tkinter as tk


class Application(object):
    def __init__(self):
        hauptfenster = tk.Tk()
        tk.Label(hauptfenster, text="Adresse", pady=10).grid(row=0, column=0)
        
        self.entry1 = tk.Entry(hauptfenster)
        self.entry1.grid(row=1, column=1)
        
        button1 = tk.Button(hauptfenster, text='ok', command=self.ftplogin)
        button1.grid(row=2, column=1)
        
        hauptfenster.mainloop()
    
    def ftplogin(self):
        ftp = ftplib.FTP(self.entry1.get())
        ftp.login()
        ftp.dir()


def main():
    application = Application()


if __name__ == '__main__':
    main()
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Hi,

3 Thread weiter unten habe ich gezeigt, wie man sowas mit StringVar() lösen kann. :wink:

Code: Alles auswählen

from Tkinter import *
import os
import ftplib
root = Tk()
variable = StringVar()

def ftplogin():
    ftp=ftplib.FTP(str( variable))  #<------dieses x soll entry1.get sein.
    ftp.login()
    ftp.dir()
def ftp(rot):
	hauptfenster = root
	Label(hauptfenster, text="Adresse....:", pady=10).grid(row=0, column=0)
	entry1 = Entry(hauptfenster, textvariable=variable)
	entry1.grid(row=1, column=1)
	button1 = Button(hauptfenster, text='ok', command=ftplogin)
	button1.grid(row=2, column=1)
if __name__=='__main__':
	ftp(root)
	root.mainloop()
Gruss
PyStyler
:D

edit: da war wohl jemand schneller :D
bennym
User
Beiträge: 36
Registriert: Freitag 13. Oktober 2006, 21:17
Kontaktdaten:

Super!!!
:D Danke euch beiden.

@BlackJack:

1. Was bedeutet in der 3. Zeile "import Tkinter as tk" ?
2. letzten 4 Zeilen Code versteh ich nicht :oops:
Kannst du mir nen Tipp geben?:wink:

So wie ich das sehe, hat die zweitletzte def Anweisung doch gar keine Auswirkungen oder?

Vielen Dank nochmal :D
mfg benny
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

bennym hat geschrieben:1. Was bedeutet in der 3. Zeile "import Tkinter as tk" ?
Ist unter [wiki]Import[/wiki] nachzulesen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
bennym
User
Beiträge: 36
Registriert: Freitag 13. Oktober 2006, 21:17
Kontaktdaten:

Danke!
bennym
User
Beiträge: 36
Registriert: Freitag 13. Oktober 2006, 21:17
Kontaktdaten:

So. Ich hab jetzt mein Programm erweitert. Es funktioniert noch nicht so wie es soll.
Vermutung: ftp = ftplib.FTP(self.entry3.get(), 'w') will self.entry.3.get() als String (halt in ' ' umgeben). Heist doch String oder?

Wie geh ich da jetzt vor, um die entrys als String zu bekommen?

Danke im Vorraus!

mfg benny

Edit: Sorry wegen den ganzen Einrückungsfehlern. Ich hab keine Ahnung, wiesos das so jetzt zusammenschlägt. In meiner IDLE hab ich keine. Ich glaube das Problem is, dass ich mit IDLE angefangen hab und mit SCite aufgehört habe. Is ja egal. Es geht warscheinlich eh nur um die Strings

Code: Alles auswählen

import ftplib
import os
import Tkinter as tk

class Application(object):
        def __init__(self):
            hauptfenster = tk.Tk()
            
	    #Adresse
	    tk.Label(hauptfenster, text="Adresse", pady=10).grid(row=0, column=0)
	    #Quelldatei
	    tk.Label(hauptfenster, text='Quelldatei', pady=10).grid(row=3, column=0)
	    #Zielordner
	    tk.Label(hauptfenster, text="Zielordner", pady=10).grid(row=4, column=0)


	    #Adresse
            self.entry1 = tk.Entry(hauptfenster)
            self.entry1.grid(row=0, column=1)
	    #Quelldatei
	    self.entry2 = tk.Entry(hauptfenster)
	    self.entry2.grid(row=3, column=1)
	    #Zielordner
	    self.entry3 = tk.Entry(hauptfenster)
	    self.entry3.grid(row=4, column=1)

	    #Nur im Programm, um in IDLE zu gucken, ob connection established
            button1 = tk.Button(hauptfenster, text="test", command=self.ftplogin).grid(row=2, column=1)
	    
	    #Download Button
	    button3 = tk.Button(hauptfenster, text="download", comman=self.ftpdownload).grid(row=5, column=1)

            hauptfenster.mainloop()

	#Adresse, login Teil
        def ftplogin(self):
            ftp = ftplib.FTP(self.entry1.get())
            ftp.login()
            ftp.dir()
	
	#Download teil
	def ftpdownload(self):
	    ftp = ftplib.FTP(self.entry3.get(), 'w')
	    ftp.login()
	    f=file(self.entry2.get(), f.write)
	    

def main():
   application = Application()

if __name__ == '__main__':
    main()

#Testfile: ftp://ftp.debian.org/debian/README
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

vermutlich

Code: Alles auswählen

ftp = ftplib.FTP(str(self.entry3.get(), 'w')) 
BlackJack

bennym hat geschrieben:So. Ich hab jetzt mein Programm erweitert. Es funktioniert noch nicht so wie es soll.
Vermutung: ftp = ftplib.FTP(self.entry3.get(), 'w') will self.entry.3.get() als String (halt in ' ' umgeben). Heist doch String oder?

Wie geh ich da jetzt vor, um die entrys als String zu bekommen?
Das was Du mit `get()` bekommst, ist bereits eine Zeichenkette. Benutz doch einfach mal den Interpretierer um ein wenig mit den Objekten herumzuspielen oder kleine Skripte zum Testen:

Code: Alles auswählen

In [12]: import Tkinter as tk

In [13]: root = tk.Tk()

In [14]: entry = tk.Entry(root)

In [15]: entry.pack()

In [16]: # hallo eingetippt

In [17]: a = entry.get()

In [18]: a
Out[18]: 'hallo'

In [19]: type(a)
Out[19]: <type 'str'>
Edit: Sorry wegen den ganzen Einrückungsfehlern. Ich hab keine Ahnung, wiesos das so jetzt zusammenschlägt. In meiner IDLE hab ich keine. Ich glaube das Problem is, dass ich mit IDLE angefangen hab und mit SCite aufgehört habe. Is ja egal. Es geht warscheinlich eh nur um die Strings
Kann es sein, dass Du Leerzeichen und Tabulatorzeichen gemischt hast? Das sollte man nicht machen. Am besten immer nur mit Leerzeichen einrücken, dann ist man auf der sicheren Seite.

Durch die Einrückung ist das Programm hier jetzt natürlich "kaputt" und man kann es nicht so einfach ausprobieren.

Was ist überhaupt das Problem? Es ist immer sehr hilfreich wenn verraten wird, was passiert wenn das Programm ausgeführt wird. Welche Ausnahmen werden auf der Konsole ausgegeben?

Du kannst zum Fehlersuchen auch ein paar ``print``-Anweisungen einbauen, zum Beispiel um zu schauen ob eine Funktion überhaupt ausgeführt wird. In `button3` hast Du nämlich `command` falsch geschrieben. Der hat keine Wirkung wenn man ihn drückt.

Code: Alles auswählen

	#Download teil
	def ftpdownload(self):
	    ftp = ftplib.FTP(self.entry3.get(), 'w')
	    ftp.login()
	    f=file(self.entry2.get(), f.write)
Hier läuft einiges schief. `FTP()` erwartet als zweites Argument den Benutzernamen, für den Fall das man sich als bestimmter Benutzer bei dem Server anmelden will und nicht als "anonymous". Willst Du wirklich 'w' als Benutzernamen an dieser Stelle?

Und in der letzten Zeile das zweite Argument ist der Modus in dem die Datei geöffnet werden soll. Also zum Beispiel 'w' für Schreiben. Du übergibst dort die Methode `write()` von `f`, das es an dieser Stelle aber noch gar nicht gibt, das Dateiobjekt soll mit diesem Aufruf ja erst erzeugt werden und wird *dann* an `f` gebunden.

Code: Alles auswählen

In [26]: f = file('test.txt', f.write)
---------------------------------------------------------------------------
exceptions.NameError          Traceback (most recent call last)

/home/marc/<ipython console>

NameError: name 'f' is not defined
bennym
User
Beiträge: 36
Registriert: Freitag 13. Oktober 2006, 21:17
Kontaktdaten:

Vielen Dank Blackjack!

So habe, ich habe jetzt das mit den Strings verstanden :wink:
Kann es sein, dass Du Leerzeichen und Tabulatorzeichen gemischt hast? Das sollte man nicht machen. Am besten immer nur mit Leerzeichen einrücken, dann ist man auf der sicheren Seite.
Das Problem war, dass ich mit der IDLE angefangen hab, und dann mit Scite weitergemacht hab. Jetzt bin ich aber wieder vim (vimrc: set tabstop=4) und alles ist gut :D

Hier läuft einiges schief. `FTP()` erwartet als zweites Argument den Benutzernamen, für den Fall das man sich als bestimmter Benutzer bei dem Server anmelden will und nicht als "anonymous". Willst Du wirklich 'w' als Benutzernamen an dieser Stelle?
Sorry, ich weis nicht wo mein Kopf war.... Musik und Python verträgt sich bei mir nicht :(

Jetzt wo ich das mit den Strings weiß, habe ich das Script noch ein bisschen erweitert. Die Verzeichnissauflistung und der Verzeichnisswechsel funktioniert, aber mit dem Download stimmt irgendetwas nicht.

Python spuckt
Exception in Tkinter callback
Traceback (most recent call last):
File "D:\programme\Python_2_5\lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
File "C:\Dokumente und Einstellungen\Benny Metzger\Desktop\programming\python\tkinter\forum tst\ftpeingabeforumansweranddownload.py", line 60, in ftpdownload
ftp.retrbinary('RETR', self.entry3.get(), f.write)
File "D:\programme\Python_2_5\lib\ftplib.py", line 379, in retrbinary
conn = self.transfercmd(cmd, rest)
File "D:\programme\Python_2_5\lib\ftplib.py", line 345, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "D:\programme\Python_2_5\lib\ftplib.py", line 327, in ntransfercmd
resp = self.sendcmd(cmd)
File "D:\programme\Python_2_5\lib\ftplib.py", line 241, in sendcmd
return self.getresp()
File "D:\programme\Python_2_5\lib\ftplib.py", line 216, in getresp
raise error_perm, resp
error_perm: 550 Failed to open file.
aus. Irgendetwas stimmt da mit den permissions nicht. Ich will doch nur lesen. Und die README auf dem Debian Server ist für anonymous lesbar.

Wäre Super wenn mir jemand wieder helfen könnte

Vielen Dank nochmal!

mfg benny



Code: Alles auswählen

import ftplib
import os
import Tkinter as tk

class Application(object):
	def __init__(self):
		hauptfenster = tk.Tk()

		#Adresse
		tk.Label(hauptfenster, text="Adresse", pady=10).grid(row=0, column=0)
		#Verzeichnis auf SRV
		tk.Label(hauptfenster, text="Verzeichnis SRV", pady=10).grid(row=3, column=0)
		#Quelldatei
		tk.Label(hauptfenster, text='Quelldatei', pady=10).grid(row=5, column=0)
		#Zielordner
		tk.Label(hauptfenster, text="Zielordner", pady=10).grid(row=6, column=0)
	
		#Adresse
		self.entry1 = tk.Entry(hauptfenster)
		self.entry1.grid(row=0, column=1)
		#Verzeichnis auf SRV
		self.entry2 = tk.Entry(hauptfenster)
		self.entry2.grid(row=3, column=1)
		#Quelldatei
		self.entry3 = tk.Entry(hauptfenster)
		self.entry3.grid(row=5, column=1)
		#Zielordner
		self.entry4 = tk.Entry(hauptfenster)
		self.entry4.grid(row=6, column=1)
		#Nur im Programm, um in IDLE zu gucken, ob connection established
		button1 = tk.Button(hauptfenster, text="test", command=self.ftplogin).grid(row=2, column=1)
		
		#Directory Wechsel
		button2 = tk.Button(hauptfenster, text="Wechsel", command=self.ftpchange).grid(row=4, column=1)
		
		#Download Button
		button3 = tk.Button(hauptfenster, text="download", command=self.ftpdownload).grid(row=7, column=1)


		hauptfenster.mainloop()


		#Adresse, login Teil
	def ftplogin(self):
		ftp = ftplib.FTP(self.entry1.get())
		ftp.login()
		ftp.dir()
	
	def ftpchange(self):
		ftp = ftplib.FTP(self.entry1.get())
		ftp.login()
		ftp.cwd(self.entry2.get())

	#Download teil
	def ftpdownload(self):
		ftp = ftplib.FTP(self.entry1.get())
		ftp.login()
		self.ftpchange()
		f=file(self.entry4.get(), 'w')
		ftp.retrbinary('RETR', self.entry3.get(), f.write)
		f.close()

def main():
	application = Application()

if __name__ == '__main__':
	main()


#Testfile: ftp://ftp.debian.org/debian/README
Antworten