Tkinter und globales x definieren?

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

Tkinter und globales x definieren?

Beitragvon bennym » Samstag 30. Dezember 2006, 11:54

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

Beitragvon BlackJack » Samstag 30. Dezember 2006, 12:18

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

Beitragvon pyStyler » Samstag 30. Dezember 2006, 12:19

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:

Beitragvon bennym » Samstag 30. Dezember 2006, 20:25

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 30. Dezember 2006, 20:33

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 Modvoice
bennym
User
Beiträge: 36
Registriert: Freitag 13. Oktober 2006, 21:17
Kontaktdaten:

Beitragvon bennym » Samstag 30. Dezember 2006, 22:35

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

Beitragvon bennym » Sonntag 31. Dezember 2006, 11:00

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

Beitragvon pyStyler » Sonntag 31. Dezember 2006, 12:24

vermutlich

Code: Alles auswählen

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

Beitragvon BlackJack » Sonntag 31. Dezember 2006, 12:59

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:

Beitragvon bennym » Sonntag 31. Dezember 2006, 17:55

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder