Anfänger Newbie Frage zu wxWidgets

Plattformunabhängige GUIs mit wxWidgets.
Antworten
zweisonnen
User
Beiträge: 3
Registriert: Sonntag 4. Februar 2007, 20:58

Hi @all,

will mich gerade in Python einarbeiten. Habe bisher nur vb.net (bisschen c#) programmiert.

Dazu möchte ich mir eine kleine Oberfläche schreiben, die ein Programm ausführt (in meinem Fall ffmpeg). Ich habe mir eine kleine Oberfläche gemacht, die entweder eine Datei oder ein Verzeichnis auswählt, ein Zielverzeichnis angegeben wird, das Format und dann solls losgehen.

Das Programm soll mir helfen, python besser zu verstehen. Deswegen ist es auch aufs Einfachste gehalten.

Hier mal der Code:

Code: Alles auswählen

#!/usr/bin/env python

import wx
import os

class gui(wx.Frame):

    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(300, 170))

        panel = wx.Panel(self, -1)

        wx.Button(panel, 100, "Oeffne Datei", (10,10), style=wx.RB_GROUP)
        wx.Button(panel, 101, "Oeffne Verzeichnis", (10,40))
        wx.Button(panel, 102, "&Ende", (10,70))
        wx.Button(panel, 103, "Zielverzeichnis", (150, 10))
        
        rb1 = wx.RadioButton(panel, 104, "dvd", (150, 40))
        rb2 = wx.RadioButton(panel, 105, "svcd", (150, 70))
        self.radiobuttons = [rb1, rb2]
        for r in [rb1, rb2]:
            wx.EVT_RADIOBUTTON(r, r.GetId(), self.radioStatus)
        wx.Button(panel, 106, "&START", (150,100))
        
        self.CentreOnScreen()
        self.Bind(wx.EVT_BUTTON, self.openfile, id=100)
        self.Bind(wx.EVT_BUTTON, self.opendir, id=101)
        self.Bind(wx.EVT_BUTTON, self.schliessen, id=102)
        self.Bind(wx.EVT_BUTTON, self.opendestination, id=103)
        self.Bind(wx.EVT_RADIOBUTTON, self.on_select, id=104)
        self.Bind(wx.EVT_RADIOBUTTON, self.on_select, id=105)
        self.Bind(wx.EVT_BUTTON, self.go, id=106)
        

    def openfile(self, event):
        dlg = wx.FileDialog(self, "Waehle eine Datei", os.getcwd(), "", "*.*", wx.OPEN)
        dlg.SetWildcard('*.py')
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            mypath = os.path.basename(path)
            pfad = self.start(dlg.GetPath() + "\\" + mypath)
            return pfad
        dlg.Destroy()

    def opendir(self, event):
        dlg = wx.DirDialog(self, "Waehle ein Verzeichnis:", style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
        if dlg.ShowModal() == wx.ID_OK:
            self.start(dlg.GetPath())

    def schliessen(self, event):
        self.Close()

    def opendestination(self, event):
        dlg = wx.DirDialog(self, "Waehle ein Zielverzeichnis:", style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
        if dlg.ShowModal() == wx.ID_OK:
            return dlg.GetPath()

    def start(self,wert):
        print wert

    def on_select(self, event):
        pass

    def radioStatus(self, event):
        pass

    def go(self, event):
        if self.radiobuttons[0].GetValue() == True:
            print "dvd"
        else:
            print "svcd"

class App(wx.App):
    def OnInit(self):
        frame = gui(None, -1, "gude")
        frame.Show(True)
        frame.CentreOnScreen()
        return True

app = App(0)
app.MainLoop()
Mein Gedanke war: ich wähle eine Datei aus und speicher die in einer Variablen, ebenso Zielverzeichnis und Format.
Aber wie kann ich die Variablen in den einzelnen Funktionen aufrufen ?
Ich bekomm immer nur gesagt, das es die Variable/Funktion nicht gibt....


Helft einem dummen Anfänger

Gruss
Ralf
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

zweisonnen hat geschrieben:[...]
Aber wie kann ich die Variablen in den einzelnen Funktionen aufrufen ?
Ich bekomm immer nur gesagt, das es die Variable/Funktion nicht gibt....
[...]
Instanzvariablen schreibt man ein ``self.`` davor. Dan kann über self darauf zurückgreifen. Auf methoden geift man auch mit ``self.`` drauf zu.

Auf Klassenvariablen greift man drauf zu, in den man denn Namen der klasse davor schreibt.

Code: Alles auswählen

class Foo(object):
    class_var = 0
    def __init__(self):
        self.bar = 1
        self.meth() # Aufruf der Methode
    
    def meth(self):
        print self.bar # Zugriff auf Instanzvariable
        print Foo.class_var # Zugriff auf Klassenvariable

Foo()
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

sape hat geschrieben:Auf Klassenvariablen greift man drauf zu, in den man denn Namen der klasse davor schreibt.
Hi sape!

Unabhängig vom Problem von zweisonnen.

Definiert man eine Klassenvariable, dann kann man AUCH mit ``self.klassenvariable`` zugreifen. Dann wird zuerst in der Instanz nach der Variable gesucht. Wird diese dort nicht gefunden, dann wird die Klassenvariable zurück gegeben.

Code: Alles auswählen

class A(object):
    vorname = "Nudlaug"
    
    def begruessung(self):
        print self.vorname

Code: Alles auswählen

class A(object):
    vorname = "Nudlaug"
    
    def __init__(self, vorname = None):
        if vorname:
            self.vorname = vorname
        
    def begruessung(self):
        print self.vorname
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Ach ja -- das hätte ich fast vergessen!

Ralf, willkommen im Python-Forum!

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

gerold hat geschrieben: Definiert man eine Klassenvariable, dann kann man AUCH mit ``self.klassenvariable`` zugreifen. Dann wird zuerst in der Instanz nach der Variable gesucht. Wird diese dort nicht gefunden, dann wird die Klassenvariable zurück gegeben.
[...]
Ups, sorry, stimmt ja. Diese Reglung, mit den Namen der Klasse davor, gilt ja nur im Konstruktor.

Code: Alles auswählen

class A(object):
    vorname = "Nudlaug"

    def __init__(self):
        print vorname

A()

Code: Alles auswählen

NameError: global name 'vorname' is not defined
lg
zweisonnen
User
Beiträge: 3
Registriert: Sonntag 4. Februar 2007, 20:58

super, vielen dank für die sehr nützlichen Hinweise.
Aber das, was ich wollte, wars noch nicht.

wenn ihr mal im code schaut, bei def go(self, event):
den Status des Radiobuttons konnte ich auslesen, mit wohl nem kleinen Trick ? den code hatte ich abgeschrieben. Ansonsten wüsste ich nicht, wie ich den Status abfragen kann.
Das zweite wäre den Rückgabewert von def openfile(self, event) (die ausgewählte datei mit pfad) irgendwie speichern (in vb hätte ich das kurzfristig mit ner globalen variable gelöst, geht das hier auch ?)
Oder wie greife ich auf die Variable einer anderen Funktion (in der gleichen Klasse) zu ?

Das sind so die kleinen Sachen, die ich irgendwie aus den Tutorials nicht rauslesen kann :(

gruss
Ralf

Code: Alles auswählen

    def go(self, event):
        if self.radiobuttons[0].GetValue() == True:
            print "ffmpeg -i " + self.start.wert + "-target dvd " + "ZIEL"
        else:
            print "svcd"
Traceback (most recent call last):
File "D:\programme\proggies\gui_main.py", line 69, in go
print "ffmpeg -i " + self.start.wert + "-target dvd " + "ZIEL"
AttributeError: 'function' object has no attribute 'wert'
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

zweisonnen hat geschrieben:Oder wie greife ich auf die Variable einer anderen Funktion (in der gleichen Klasse) zu?
Hallo zweisonnen!

Bitte nicht falsch verstehen oder übel nehmen: :roll:

Bitte lerne zuerst Python, bevor du wxPython lernst!
Das wird ansonsten viel schwieriger für dich, als es sein müsste.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

def zusammen(argument1, argument2):
    return argument1 + " " + argument2

class Person(object):
    def __init__(self):
        self.vorname = None
        self.nachname = None

person1 = Person()
person1.vorname = "Max"
person1.nachname = "Mustermann"

zusammengefuegt = zusammen(person1.vorname, person1.nachname)
print zusammengefuegt
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
zweisonnen
User
Beiträge: 3
Registriert: Sonntag 4. Februar 2007, 20:58

@gerold

Ich glaube, du hast recht. Ich muss mich da erst mal reinknien.....
Zuerst dachte ich: naja, das kriegste hin wie mit vb...... leider nicht ganz.

Also, es hat erst mal geklappt, vielen Dank für die Hilfe.


Gruss
Ralf
Antworten