Variablen aus GUI in Logik Code übergeben

Plattformunabhängige GUIs mit wxWidgets.
Antworten
gottlieb
User
Beiträge: 21
Registriert: Freitag 15. März 2013, 14:22

Hallo,
ich bin blutiger Anfänger in Python und wx. (Seit Montag :D)
Mein Problem ist, ich bekomme keine Verknüpfung zwischen Variablen im GUI und im Logik Code hin.

Ich vesuche ein ganz einfaches Programm zu schreiben:
Es geht bei Programmstart ein Dialogfenster mit zwei Buttons auf. Mit den Buttons kann man auswählen ob man den Inhalt aller Ordner oder eines einzelnen löschen will. Hier möchte ich einfach erreichen, dass zb. bei Betätigen von Button "Alle löschen" eine Variable den Wert 1 und bei "Ordner einzeln" den Wert 2 erhält, das reicht mir schon.
Je nach Variablenwert (1 oder 2) wird im Hauptprogramm entweder ein wx.DirDialog gestartet , über den man den Pfad des Ordners wählen kann, dessen Inhalt gelöscht werden soll ODER es werden einfach alle (im Code mit Pfad hinterlegten) Ordner gelöscht.

Bisher funktioniert:
-Aus dem Hauptprogramm den wx.DirDialog aufrufen, Pfad übergeben und Ordnerinhalt löschen.
-Alle (im Quellcode definierten) Ordnerinhalte löschen.
-In einer If Anweisung entscheiden ob ersteres oder zweites erfolgen soll.
-Einen Dialog mit den beiden Buttons hab ich auch erstellt.


Was nicht klappt und wo ich auch keinen Ansatz habe ist:
-Je nach Button der Variable einen Wert zuweisen und diesen an Hauptprogramm übergeben, damit die if-Anweisung ausgeführt werden kann

Vielleicht kann mir jemand mit einem Minimalcode helfen, wie man aus einer wx Class eine Variable ausgibt.

Gruß
gottlieb
User
Beiträge: 21
Registriert: Freitag 15. März 2013, 14:22

Ich häng mal hier den bisherigen Code an, falls ich mich schlecht ausgedrückt habe. Ist noch nicht schön, aber mir gehts in erster Linie um die Funktion nicht so sehr um Modularität. Das Dialogfenster mit den Buttons habe ich jetzt mal hier als Funktion und nicht als Class, auch wenn ihr mich wahrscheinlich dafür steinigt.
Wenn ich für die Buttons funktionen erstelle, sind das Unterfunktionen von "SelectOption", ich weiß nicht wie ich diese genau aufrufe im Bindbefehl, zumindest hat das bisher nicht recht funktioniert. Und außerdem weiß ich nicht wie ich die Variable dann handlen soll. Wenn ich das ganze in eine Class packe, dann weiß ich nicht wie ich da die Variablen rausbekomme für meine if-Anweisung.
Bitte gnädig sein :D

Code: Alles auswählen

import os

################_____GUI_Auswahl_einzeln_oder_alle_____################

def SelectOption():
    import wx
    app = wx.App()
    dlg = wx.Dialog(None, -1, 'Delete Option', size = (200,100))
    button1 = wx.Button(dlg, -1, 'delete all')
    button2 = wx.Button(dlg, -1, 'delete individual')
    
    # hier sollen die buttons mit events verknüpft werden und "var" einen wert zuweisen und den returnen

    gs = wx.GridSizer(2,1,1,1)
    gs.AddMany([((button1),0, wx.EXPAND),((button2),0, wx.EXPAND)])
    dlg.SetSizer(gs)
    dlg.Show()
    dlg.Center()
    app.MainLoop()
                     
###############_____GUI_Ordner_wählen_____######################

def SelectDir():
    import wx
    import wx.lib.agw.multidirdialog as MDD
    app = wx.App()
    dlg = wx.DirDialog(panel, "Choose a directory:",style=wx.DD_DEFAULT_STYLE | wx.DD_DIR_MUST_EXIST | wx.DD_CHANGE_DIR)
    if dlg.ShowModal() == wx.ID_OK:
        rtrn = dlg.GetPath()
        dlg.Destroy()
        frame.Close()
    else:
        frame.Close()
    app.MainLoop()
    return rtrn

##################______Ordner_löschen______##############################

def Delete(path):
    for the_file in os.listdir(path):
        file_path = os.path.join(path, the_file)
        try:
            if os.path.isfile(file_path):
                os.unlink(file_path)
        except Exception, e:
            print e

###################_____Löscht_einzelnen_Ordner______#######################
 
def ClearOne():
    import os 
    folderpath = SelectDir()
    #print folderpath
    Delete(folderpath)

#################______Löscht_alle_Ordner______###########################

def ClearAll():
    import os 
    folderpath = [...\DeleteFolder', '...\DeleteFolder2', '...\DeleteFolder3',...]
    #print folderpath
    for item in folderpath:
        Delete(item)
    
##################_____if_Anweisung________################################

var = 0                    # hier soll die Variable eingelesen werden
SelectOption()

try:
    if var == 1:
        ClearOne()
    elif var ==2:
        ClearAll()
except Exception, e:
    print e
Zuletzt geändert von Anonymous am Freitag 15. März 2013, 19:02, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@gottlieb: Wenn Du nicht irgend etwas davon als Klasse implemetierst, dann wird das entweder schwierig oder total unsauber. Du solltest eine GUI-Anwendung schreiben, statt zu versuchen ein lineares Programm zu schreiben und da irgendwie GUI-Funktionalität hinein zu basteln. Dann kann man sich auch den Umweg über eine Zahl sparen und gleich die richtige Funktion für die jeweilige Schaltfläche aufrufen.

`SelectDir()` enthält Fehler. Dem Namen `frame` wird nie etwas zugewiesen, es wird aber versucht eine Methode darauf aufzurufen. Der Name `panel` wird auch verwendet ohne irgendwo definiert worden zu sein. Und falls der Dateidialog abgebrochen wird, dann wurde dem Namen `rtrn` nichts zugewiesen und damit kann das ``return`` am Ende nicht funktionieren. Der Name ist auch furchtbar schlecht. Abkürzungen sollte man vermeiden wenn die nicht allgemein bekannt sind. `rtrn` und `dlg` sehen aus als hätte jemand die Vokale von der Tastatur geklaut. ;-)

Die Namen halten sich auch nicht an den Style Guide for Python Code. Das tun die `wx`-Namen auch nicht, aber die tun das, weil das GUI-Toolkit, das in C++ geschrieben ist, diese Namen vorgibt.

Importe werden üblicherweise am Anfang des Modul erledigt. Dann sieht man dort gleich wovon das Modul abhängt, und muss sich das nicht über den Quelltext verteilt zusammen suchen.

Die eigenartig formatierten Kommentare zwischen den Funktionen würden sich in den meisten Fällen wohl als DocStrings für die Funktionen eignen.
BlackJack

Nahezu ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
import os
import wx

PATHS_TO_CLEAR = ['...\DeleteFolder', '...\DeleteFolder2', '...\DeleteFolder3']


def clear_path(root_path):
    for name in os.listdir(root_path):
        path = os.path.join(root_path, name)
        try:
            if os.path.isfile(path):
                print 'Removing', path
                #os.remove(path)
        except EnvironmentError as error:
            print error


def clear_paths(paths):
    for path in paths:
        try:
            clear_path(path)
        except EnvironmentError as error:
            print error


class CleanerUI(wx.Frame):
    def __init__(self, parent=None):
        wx.Frame.__init__(self, parent, title='Delete Option')
        delete_all_button = wx.Button(self, wx.ID_ANY, 'Delete all')
        delete_single_button = wx.Button(self, wx.ID_ANY, 'Delete individual')
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(delete_all_button)
        sizer.Add(delete_single_button)
        self.SetSizer(sizer)
        self.Fit()

        self.Bind(wx.EVT_BUTTON, self.on_delete_all, delete_all_button)
        self.Bind(wx.EVT_BUTTON, self.on_delete_single, delete_single_button)

    def on_delete_all(self, _event):
        clear_paths(PATHS_TO_CLEAR)

    def on_delete_single(self, _event):
        dir_dialog = wx.DirDialog(self, style=wx.DD_DIR_MUST_EXIST)
        if dir_dialog.ShowModal() == wx.ID_OK:
            clear_path(dir_dialog.GetPath())


def main():
    app = wx.PySimpleApp()
    window = CleanerUI()
    window.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()
gottlieb
User
Beiträge: 21
Registriert: Freitag 15. März 2013, 14:22

Hallo BlackJack,

vielen Dank für deine Hilfe!
Du hast Recht mit den von dir aufgeführten Fehlern zu frame, das kommt durch meine Copy-Paste Orgie, hab mir das mehr oder weniger aus anderen Programmen die ich bisher geschrieben habe zusammengebastelt (wx. Tutorial).
Dein Code läuft einwandfrei, wirklich klasse! Ich hab das ums verrecken nicht hinbekommen aus einer Klasse die Funktionen aufzurufen, bei dir sieht das aber sehr simpel aus. Ich werd nochmal paar Sachen zur Übung schreiben.

Man liest sich :)

gruß
Antworten