Das deutsche Python-Forum

10 Jahre Diskussionen rund um die Programmiersprache Python
Aktuelle Zeit: Freitag 29. August 2014, 05:22

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Donnerstag 17. Mai 2012, 11:27 
User

Registriert: Montag 30. Januar 2012, 17:38
Beiträge: 510
Hallo zusammen,

mein aktuelles Projekt ist, Bestelldateien per FTP oder EMail mit Anhang an Lieferanten zu verschicken.

Nun wird es auch Zeit für eine Gui, die Informationen anzeigt und mit der man auch eine Auswahl treffen kann, wie mit der jeweiligen Situation zu verfahren ist.
Da ich bisher noch keine Ahnung von Guiś habe, habe ich zuerst einmal feste gegoggelt und habe mich für Tkinter der Standart-Gui Pythonś entschieden, da für den Anfang diese wohl am leichtesten zu Handeln ist.
Mein Gui-Konstrukt sieht so aus:
  1. from Tkinter import *
  2.  
  3. class App:
  4.   def __init__(self, master, befehl):
  5.     frame = Frame(master)
  6.     frame.pack()
  7.     self.button = Button(frame,
  8.                          text="Abbrechen", fg="red",
  9.                          command=frame.quit)
  10.     self.button.pack(side=LEFT)
  11.     self.slogan = Button(frame,
  12.                          text="Ausführen",
  13.                          command=self.run)
  14.     self.slogan.pack(side=LEFT)
  15.     self.befehl = befehl
  16.   def run(self):
  17.     print(self.befehl)
  18.  
  19. def fenster(information, befehl):
  20.     root = Tk()
  21.     T = Text(root, height=2, width=50)
  22.     T.pack()
  23.     T.insert(END, information)
  24.     app = App(root, befehl)
  25.     root.mainloop()
Highlighting by GeSHi
Ich steuere dies dann so an:
  1. from window import *
  2.  
  3. dada = 'Hallo, hier bin ich!'
  4. dirList = os.listdir(bestelleingang)
  5.  
  6. fenster(dada, dirList)
Highlighting by GeSHi

Kurze Erläuterung dazu.
Ich möchte bestimmte Informationen im Fenster direkt haben, und wenn alles ok ist mit dem Ausführen-Button, einen Befehl ausführen.

Nach ersten Test, funktioniert das so wie gewünscht.
Möchte aber trotzdem bei Euch, die Ihr mehr Erfahrung damit habt anfragen, ob das Konstrukt so ok ist, oder was man besser anderst machen sollte.

Grüße Nobuddy


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Donnerstag 17. Mai 2012, 12:06 
Moderator

Registriert: Mittwoch 26. Januar 2005, 00:29
Beiträge: 23296
@Nobuddy: Zuerst mal `slogan`‽ Und `T` ist unkonventionell.

Ich verstehe den Sinn der Aufteilung zwischen dem Textfeld und den Schaltflächen nicht. Warum ist eins in der `App`-Klasse und das andere nicht?

Eventuell solltest Du einen Blick auf `tkSimpleDialog.Dialog` werfen, damit Du nichts selbst implementierst, was dieses kleine Rahmenwerk schon anbietet.

_________________
“From the programmer's perspective, indentation implies program flow in nearly all modern languages. The difference is that in Python the compiler believes you.” — Dave Brueck in c.l.p


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Samstag 19. Mai 2012, 14:22 
User

Registriert: Montag 30. Januar 2012, 17:38
Beiträge: 510
Hallo BlackJack,
Danke für Deine Info.

Beim Googeln, bin ich hier drauf http://epydoc.sourceforge.net/stdlib/tkSimpleDialog.Dialog-class.html gestoßen.
Durch mein englisches Handicap, ist es äußerst schwierig, für den Anfang weiter zukommen.

Vielleicht Könntet Ihr mir für den Anfang, erste Hilfestellung geben?

Ich hätte gerne ein einziges Fenster, in dem gleichzeitig die Ausgaben erfolgen sollen.
Das Fenster öffnet sich, wenn ein Bestellauftrag vorliegt. Hier sollte dann die erste Ausgabe erfolgen, die Infos zu dem aktuellen Bestellauftrag liefert.
Weiter benötige ich zwei Buttons, Eines für den Abbruch (Bestellauftrag wird nicht ausgeführt) und das Andere zum Ausführen des Bestellauftrages. Hierzu sollte in dem Fenster, jeweils die aktuelle Ausgabe kommen, was gemacht wird.

Ist so etwas möglich?

Im Moment bewerkstellige ich dies so (ohne Fenster)
  1.                                 ### FTP-Work
  2.                                 def ftp_work():
  3.                                     try:
  4.                                         # Modul FTP-Versand
  5.                                         ftp_versand(auftrag, auftragdatei, zieladresse, benutzernamen, passwort, ftpverzeichnis)
  6.                                         print('Der FTP-Versand war erfolgreich, Bestelldatei wurde versendet!')
  7.  
  8.                                         # Bestelldatei sichern
  9.                                         zielordner(export, auftrag, export_path)
  10.                                     except:
  11.                                         print('Fehler beim FTP-Versand, der FTP-Versand wurde abgebrochen!')
  12.  
  13.                                         # Bestelldatei sichern
  14.                                         zielordner(export, auftrag, fehler_path)
  15.  
  16.                                 frage = ('Möchten Sie den Bestellauftrag absenden?')
  17.                                 infos = ('Bestellung für Lieferant: ' + lieferant + ', Auftragnummer: ' + auftragnummer + ' durchführen?')
  18.                                 run = functools.partial(ftp_work)
  19.                                 abfrage(frage, infos, run)
Highlighting by GeSHi


Grüße Nobuddy


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Samstag 19. Mai 2012, 16:23 
User

Registriert: Montag 30. Januar 2012, 17:38
Beiträge: 510
Ich habe mal was zusammengebastelt:
  1. from Tkinter import *
  2.  
  3. import tkSimpleDialog, tkMessageBox
  4.  
  5. class DialogFenster(tkSimpleDialog.Dialog):
  6.     ## so leitet man in Python aus einer Klasse ab!
  7.     ## Aufruf: NamenDialog = DialogFenster(root)
  8.     def body(self, master):  ## wird überschrieben
  9.         self.titel = titel
  10.         self.title(self.titel)
  11.  
  12.         self.info = info
  13.  
  14.         self.namen = Label(master, text=self.info)
  15.         self.namen.pack(side=LEFT)
  16.  
  17.  
  18.     def apply(self):  ## wird überschrieben
  19.         self.result = 1 ## alles ok!
  20.  
  21. def benutzer(titel, info):
  22.     root = Tk()
  23.     NamenDialog = DialogFenster(root)
  24.     if NamenDialog.result <> None:
  25.         tkMessageBox.showinfo('Info','Bestellauftrag wurde versendet!')
  26.  
  27. titel = 'Bestellauftrag'
  28. info = 'Achtung, neuer Auftrag!\nAuftragnummer: 4711, Lieferant: Mops'
  29.  
  30. benutzer(titel, info)
  31.  
Highlighting by GeSHi
So, in der Art wäre der Ablauf.
Es sind zwar mehrere Fenster im Einsatz, aber das wäre nicht so schlimm.
Was mich etwas irritiert, ist daß wenn das erste Fenster geöffnet ist, ein zweites leeres Fenster noch dazu geöffnet ist.
Muß das so sein, oder kann man das ändern?

Hoffe, ihr habt mir noch ein paar gute Ratschläge!


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Samstag 19. Mai 2012, 17:19 
User

Registriert: Montag 30. Januar 2012, 17:38
Beiträge: 510
Ich habe das mal so in meinem Pythonprogramm umgesetzt:
  1.                                 ### GUI ###
  2.                                 class DialogFenster(tkSimpleDialog.Dialog):
  3.                                     ## so leitet man in Python aus einer Klasse ab!
  4.                                     ## Aufruf: NamenDialog = DialogFenster(root)
  5.                                     def body(self, master):  ## wird überschrieben
  6.                                         self.titel = titel
  7.                                         self.title(self.titel)
  8.  
  9.                                         self.auftraginfo = auftraginfo
  10.  
  11.                                         self.namen = Label(master, text=self.auftraginfo)
  12.                                         self.namen.pack(side=LEFT)
  13.  
  14.  
  15.                                     def apply(self):  ## wird überschrieben
  16.                                         self.result = 1 ## alles ok!
  17.  
  18.                                 ### FTP-Work
  19.                                 def ftp_work(titel, auftraginfo):
  20.                                     root = Tk()
  21.                                     NamenDialog = DialogFenster(root)
  22.                                     if NamenDialog.result <> None:
  23.                                         try:
  24.                                             # Modul FTP-Versand
  25.                                             ftp_versand(auftrag, auftragdatei, zieladresse, benutzernamen, passwort, ftpverzeichnis)
  26.                                             info = ('Der FTP-Versand war erfolgreich, Bestelldatei wurde versendet!')
  27.  
  28.                                             # Bestelldatei sichern
  29.                                             zielordner(export, auftrag, export_path)
  30.                                         except:
  31.                                             info = ('Fehler beim FTP-Versand, der FTP-Versand wurde abgebrochen!')
  32.  
  33.                                             # Bestelldatei sichern
  34.                                             zielordner(export, auftrag, fehler_path)
  35.                                         tkMessageBox.showinfo('Info', info)
  36.  
  37.                                 auftraginfo = ('Bestellung für Lieferant: ' + lieferant + ', Auftragnummer: ' + auftragnummer + ' durchführen?')
  38.                                 titel = 'Bestellauftrag'
  39.                                
  40.                                 ftp_work(titel, auftraginfo)
Highlighting by GeSHi

Das erste Fenster öffnet sich und informiert über einen Bestellauftrag.
Nach dem ich auf den OK-Button geklickt habe, wird die Bestelldatei per FTP versendet und ich erhalte anschließend die Info, ob der FTP-Versand erfolgreich war oder nicht. Wenn ich aber dann bei diesem Fenster auf Ok klicke, passiert nichts.
Auch beim ersten Fenster, wenn ich auf das CANCEL-Button klicke passiert auch nichts.

Da könnte ich Eure Hilfe brauchen.

Grüße Nobuddy


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Montag 21. Mai 2012, 12:26 
User

Registriert: Montag 30. Januar 2012, 17:38
Beiträge: 510
So, bin selbst drauf gekommen! :D
Mit root.destroy(), konnte ich das problem lösen.
  1.                                         tkMessageBox.showinfo('Info', info)
  2.                                         if not None:
  3.                                             root.destroy()
Highlighting by GeSHi


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Montag 21. Mai 2012, 12:39 
Moderator

Registriert: Mittwoch 26. Januar 2005, 00:29
Beiträge: 23296
Ich hoffe mal da steht nicht wirklich ``if not None:`` im Quelltext. ;-)

_________________
“From the programmer's perspective, indentation implies program flow in nearly all modern languages. The difference is that in Python the compiler believes you.” — Dave Brueck in c.l.p


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Montag 21. Mai 2012, 13:39 
User

Registriert: Montag 30. Januar 2012, 17:38
Beiträge: 510
Beim Versuch, diesen Bereich aus meinem Programm herauszunehmen und in ein eigene Pythondatei zu nehmen und dann von dort aus das Modul bzw. die GUI aufzurufen, habe ich Schwierigkeiten.
  1. ### GUI ###
  2. class DialogFenster(tkSimpleDialog.Dialog):
  3.     ## so leitet man in Python aus einer Klasse ab!
  4.     ## Aufruf: NamenDialog = DialogFenster(root)
  5.     def body(self, master):  ## wird überschrieben
  6.         self.titel = titel
  7.         self.title(self.titel)
  8.  
  9.         self.auftraginfo = auftraginfo
  10.  
  11.         self.namen = Label(master, text=self.auftraginfo)
  12.         self.namen.pack(side=LEFT)
  13.  
  14.     def apply(self):  ## wird überschrieben
  15.         self.result = 1 ## alles ok!
  16.  
  17. ### FTP-Work
  18. def ftp_work(titel, auftraginfo):
  19.     root = Tk()
  20.     NamenDialog = DialogFenster(root)
  21.     if NamenDialog.result <> None:
  22.         try:
  23.             # Modul FTP-Versand
  24.             ftp_versand(auftrag, auftragdatei, zieladresse, benutzernamen, passwort, ftpverzeichnis)
  25.             info = ('Der FTP-Versand war erfolgreich, Bestelldatei wurde versendet!')
  26.  
  27.             # Bestelldatei sichern
  28.             zielordner(export, auftrag, export_path)
  29.         except:
  30.             info = ('Fehler beim FTP-Versand, der FTP-Versand wurde abgebrochen!')
  31.  
  32.             # Bestelldatei sichern
  33.             zielordner(export, auftrag, fehler_path)
  34.             tkMessageBox.showinfo('Info', info)
  35.                 if not None:
  36.                     root.destroy()
  37.     else:
  38.         # Bestelldatei umbenennen und nach Ordner .. verschieben
  39.         quelle = auftrag
  40.         ersatzname = (lieferantnummer + 'officeplanet.' + endung + '-' + auftragdatei)
  41.         ziel = os.path.join(os.path.dirname(__file__),  offen_path, ersatzname)
  42.         os.rename(quelle, ziel)
  43.         info = ('Der FTP-Versand wurde abgebrochen!')
  44.     tkMessageBox.showinfo('Info', info)
  45.     if not None:
  46.         root.destroy()
Highlighting by GeSHi

Wie kann ich das machen, daß der Aufruf der GUI aus einem anderen Pythonprogramm funktioniert?

Grüße Nobuddy


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Montag 21. Mai 2012, 13:40 
User

Registriert: Montag 30. Januar 2012, 17:38
Beiträge: 510
BlackJack hat geschrieben:
Ich hoffe mal da steht nicht wirklich ``if not None:`` im Quelltext. ;-)

Doch das tut es, wäre die 'if <> None' besser?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Montag 21. Mai 2012, 13:47 
Moderator
Benutzeravatar

Registriert: Freitag 4. August 2006, 15:56
Beiträge: 6628
Wohnort: Hamburg
Nobuddy hat geschrieben:
Doch das tut es, wäre die 'if <> None' besser?

Um Gottes Willen, nee! Nichts davon ist irgend wie *gut* :-D
  1. In [23]: if not None:
  2.    ....:     print("Ich bin immer wahr!")
  3.    ....:    
  4. Ich bin immer wahr!
  5.  
Highlighting by GeSHi

Du kannst Dir das anhand der `bool`-Funktion klar machen:
  1. In [26]: bool(None)
  2. Out[26]: False
  3.  
Highlighting by GeSHi

`bool` gibt zu einem beliebigen Objekt seinen Wahrheitswert zurück. (Doku s. Built-in Functions)

Damit ist klar, was passiert:
  1. In [27]: not False
  2. Out[27]: True
  3.  
Highlighting by GeSHi

Du packst hinter `if` einen Ausdruck, der *immer* wahr ist. Ergo wird der Code *immer* aufgerufen. Und bei so etwas, kann man sich `if` schlicht sparen und den auszuführenden Code auch direkt hinschreiben...

_________________
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Folien & Text inkl. Python3))


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Montag 21. Mai 2012, 15:55 
User

Registriert: Montag 30. Januar 2012, 17:38
Beiträge: 510
Also einfach 'root.destroy()' ohne die if-Abfrage davor.

Danke und Grüße
Nobuddy


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Montag 21. Mai 2012, 16:11 
Moderator

Registriert: Mittwoch 26. Januar 2005, 00:29
Beiträge: 23296
@Nobuddy: Ich glaube ich hatte ``<>`` schon mal irgendwo in Deinem Quelltext gesehen: Gewöhn Dir das am besten auch schnell wieder ab, beziehungsweise gar nicht erst an. Der Operator war schon „deprecated” als ich mit Python angefangen habe, also schon ziemlich lange. Ungleich testet man mit ``!=``.

_________________
“From the programmer's perspective, indentation implies program flow in nearly all modern languages. The difference is that in Python the compiler believes you.” — Dave Brueck in c.l.p


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Abfragefenster mit Befehlsausführung
BeitragVerfasst: Montag 21. Mai 2012, 16:44 
User

Registriert: Montag 30. Januar 2012, 17:38
Beiträge: 510
Eigentlich, benutze ich '!=' ... außer wenn ich fremden Code kopiere, da kann sich so etwas einschleichen ..., aber ich schreibe es mir hinter die Ohren! :wink:

Hast Du mir evtl. auch einen Tipp zu meinem Post (etwas weiter oben, GUI-Modul)?


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Deutsche Übersetzung durch phpBB.de