Wie Dateinamen ais wx.dialog weiter übergeben ?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo

Erstmal absoluter Anfänger mit wxPython.
Ich versuche eine Minianwendung zue rstellen, bei der eine Datei (hier mp3) per wx.Dialog selktiert wird, danach soll dann diese datei bei
Drücken den Buttons Play mit dem externen Linuxprogarmm mpg321 abgespeilt werden (Befehl lautet mpg321 meinsong.mp3).

Code: Alles auswählen

#!/usr/bin/env python
import wx
import os.path
import re
import glob
import subprocess

def create_menu(frame):
    # create menu
    menubar = wx.MenuBar()
    #main menus
    mnuFile = wx.Menu()
    mnuData = wx.Menu()
    menubar.Append(mnuFile,"&File")
    menubar.Append(mnuData,"&Data")
    #submenus
    m_Open = mnuFile.Append(-1,"&Open")
    mnuFile.AppendSeparator()
    m_Exit = mnuFile.Append(-1,"&Exit")
    m_Play = mnuData.Append(-1,"&Play")
    # attach menu to frame
    frame.SetMenuBar(menubar)
    
    #bind menu events to procedures
    frame.Bind(wx.EVT_MENU, OnExit, m_Exit)
    frame.Bind(wx.EVT_MENU, OnOpen, m_Open)
    frame.Bind(wx.EVT_MENU, OnPlay, m_Play)
#---------------------------------------------------------------------
# Event handlers
def OnExit(event):
    frame.Close()

def OnOpen(event):
    dlg = wx.FileDialog(None, "Choose a file", os.getcwd(), "","*.*", wx.OPEN)
    dlg.ShowModal()
    filename=dlg.GetPath()
    Fname = filename
    dlg.Destroy()
    textbox.write(Fname) 
    print Fname
             
def OnPlay(event):
    # play mp3
    befehl = "mpg321  %s" %(filename,)   

    process = subprocess.Popen(befehl , shell=True, stdout=subprocess.PIPE)

#---------------------------------------------------------------------

#-----------------------------------------------------------------

#-----------------------------------------------------------------
#             Main
#-----------------------------------------------------------------
app = wx.App()

# create frame
frame = wx.Frame(None, title="PLOTTER", pos=(350,300))

create_menu(frame)
# editor textbox for date
textbox=wx.TextCtrl(frame, style = wx.TE_MULTILINE)

# show frame and run event loop
frame.Show()
app.MainLoop()

Was muß ich machen damit meinsong.mp3 (hier im Beispiel als Fname in ein TextCtrl geschrieben) nach onOpen weiterverarbeitet werden kann?

mfg
schwedenmann


P.S.
Das Ganze ist der Versuch, folgnede kleine Anwendung umzustricken, dort wird eine datendatei (2 Zahlenreihen) ausgewählt, der Inahlt der Datei in ein TextCtrl geschriebven, dann der Inahlt des TextCtrl ausgelesen, augbereitet und geplottet.
Ich möchte eben anstatt plotten, eine datei mot mpg321 abspielen.
heir der Code vom original

Code: Alles auswählen

#!/usr/bin/env python
import wx
import os.path
#import mathplotlib.pyplot as plt
import pylab as plt



def create_menu(frame):
    # create menu
    menubar = wx.MenuBar()
    #main menus
    mnuFile = wx.Menu()
    mnuData = wx.Menu()
    menubar.Append(mnuFile,"&File")
    menubar.Append(mnuData,"&Data")
    #submenus
    m_Open = mnuFile.Append(-1,"&Open")
    mnuFile.AppendSeparator()
    m_Exit = mnuFile.Append(-1,"&Exit")
    m_Plot = mnuData.Append(-1,"&Plot")
    # attach menu to frame
    frame.SetMenuBar(menubar)
    
    #bind menu events to procedures
    frame.Bind(wx.EVT_MENU, OnExit, m_Exit)
    frame.Bind(wx.EVT_MENU, OnOpen, m_Open)
    frame.Bind(wx.EVT_MENU, OnPlot, m_Plot)
#---------------------------------------------------------------------
# Event handlers
def OnExit(event):
    frame.Close()

def OnOpen(event):
    # ask for filename
    dlg = wx.FileDialog(None,"Open data file", os.getcwd() ,"", "*.*", wx.OPEN)
    dlg.ShowModal()
    filename = dlg.GetPath()
    
    #open file, get data and put it into textbox
    try:
        f = open(filename, "r")
        data = f.read()
        f.close()
        textbox.SetValue(data)
    except:
        wx.MessageBox("Could not open file!")
        
def OnPlot(event):
    # plot data
    x,y = fill_xy_with_values(textbox)
    plot_xy(x, y)
    
#---------------------------------------------------------------------
def fill_xy_with_values(textbox):
    # """ get values from textbox 
    #   returns array x, y and nummer of data points"""
    text=textbox.GetValue()
    lines=text.splitlines()
    
    x=[]
    y=[]
    for line in lines:
        columns = line.split()  # seperator can be on or more " " or "\t"
        x.append (float(columns[0]))
        y.append (float(columns[1]))
    return x,y
#-----------------------------------------------------------------
def plot_xy( x, y):
    """ Plot arrays x, y with matplotlib"""
    plt.figure(1)
    plt.subplot(111)        # 1 row, 1 col, plot nb. 1
    plt.grid(True)
    plt.plot(x, y)
    plt.xlabel("x")
    plt.ylabel("y")
    plt.show()
#-----------------------------------------------------------------
#             Main
#-----------------------------------------------------------------
app = wx.App()

# create frame
frame = wx.Frame(None, title="PLOTTER", pos=(350,300))

create_menu(frame)
# editor textbox for date
textbox=wx.TextCtrl(frame, style = wx.TE_MULTILINE)

# show frame and run event loop
frame.Show()
app.MainLoop()
Danke schon mal im Voraus
mfg
schwedenmann
BlackJack

@schwedenmann: Am besten erst einmal einen Schritt zurück und objektorientierte Programmierung (OOP) lernen. Ohne OOP sollte man IMHO gar nicht erst über GUIs nachdenken.

Dann kannst Du den Dateinamen an das Anwendungsobjekt binden und darauf auch wieder zugreifen.

Was man ausserdem vermeiden sollte ist die GUI-Elemente als Speicher zu missbrauchen. Die sind zur Kommunikation mit dem Benutzer da, nicht um sich Werte zu merken.
Antworten