Seite 1 von 1

OptionMenu von Textdatei einlesen

Verfasst: Donnerstag 2. Dezember 2010, 13:33
von sumsum
Hallo zusammen,
ich habe mir ein bisschen was zusammengebastelt und möchte, dass OptionMenu bei jedem Start die Datei "text2.txt "neu einliest, damit die manuell eingebenen Werte auch berücksichtigt werden. Leider habe ich das nicht hinbekommen :-(

Code: Alles auswählen

from Tkinter import *
from Tkinter import _setit
from pylab import grid, title
import tkMessageBox
ProgramLabel = " Test your Python :-)"

class App (Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.grid()
        self.StartFrame()
        
    def StartFrame (self):
        # First frame for buttons
        FirstFrame = Frame(root)
        FirstFrame.grid()
       
        self.var  = StringVar()
        self.var.set("1")
        self.optionmenu = OptionMenu(FirstFrame, self.var, "2", command=self.readFile)
        self.optionmenu.grid(row=0, column=0)
        
        self.label_show = Label(FirstFrame, text="Current value")
        self.label_show.grid(row=0, column=1)
        self.entry_show = Entry(FirstFrame, textvariable=self.var)
        self.entry_show.grid(row=0, column=2)

        self.label_add = Label(FirstFrame, text="New Choice")
        self.label_add.grid(row=0, column=3)
        self.entry_add = Entry(FirstFrame)
        self.entry_add.grid(row=0, column=4)

        self.button_add = Button(FirstFrame, text="Add Choice", command=self.writeFile)
        self.button_add.grid(row=0, column=5)


    def writeFile (self):
        self.value = self.entry_add.get()
        self.menu = self.optionmenu["menu"]
        self.variable = self.var
        self.command = None # what you passed as command argument to optionmenu
        self.menu.add_command(label=self.value, command=_setit(self.variable, self.value, self.command))
            
        file1 = open("test2.txt","a")
        #print (file1) # prints out details about the file
        file1.write(self.value)
        file1.write('\n')
        file1.close()
        
    def readFile (self):
        self.fin = open("Test2.txt","r")
        self.iVar  = IntVar()
        ##self.ketchVar = IntVar()
        self.menu = self.optionmenu["menu"]
        self.lineList = self.fin.readlines()
        for self.line in self.lineList:
            print self.line,
            self.optionmenu.insert(label=self.line, variable=self.iVar)

if __name__ == '__main__':
    
    # TK requires this for widgets:
    root = Tk()
    
    # Calls parent widget
    app = App()

    root.title(ProgramLabel)
    root.maxsize(width=500, height=500)

    app.mainloop()

Re: OptionMenu von Textdatei einlesen

Verfasst: Donnerstag 2. Dezember 2010, 13:59
von Xynon1
Du machts mehrere Fehler,

1. Der Grund warum dies nicht funktioniert ist, weil das command vom Optionsmenü dessen aktuellen Wert an die Funktion über gibt.
Mit anderen Worten dir fehlt ein Parameter, in der readFile-Funktion.

Weniger wichtig für dein Problem:
2. Ist es nicht sinnvoller den Inhalt zuerst auszulesen und dann alles im Script zu erledigen und nicht ständig lesen, specihern, lesen speichern, ....

3. Dateien öffnet man spätestens ab Python 2.6 mit dem with-keyword

4. Lese dir bitte mal die Namenskonvention für Python durch und nutze wenn du hier was postest die Python-Tags.
Zudem nehm bitte die Leerzeichen zwischen Funktionsnamen und Parameterlist raus.


mfg xynon

Re: OptionMenu von Textdatei einlesen

Verfasst: Donnerstag 2. Dezember 2010, 14:27
von sumsum
Xynon1 hat geschrieben: 1. Der Grund warum dies nicht funktioniert ist, weil das command vom Optionsmenü dessen aktuellen Wert an die Funktion über gibt.
Mit anderen Worten dir fehlt ein Parameter, in der readFile-Funktion.
Das ist ja mein Problem. Optionsmenu soll keinen Parameter übergeben, sondern einen erhalten, damit die Auswahl immer aktuell ist. Ich komm da nicht weiter :K

Re: OptionMenu von Textdatei einlesen

Verfasst: Donnerstag 2. Dezember 2010, 14:31
von Xynon1
Du hast mich falsch verstanden, aus

Code: Alles auswählen

def readFile (self):
    ...
muss zB. dies hier werden:

Code: Alles auswählen

def readFile (self, selected_menupoint):
    ...
Da bei einem command auf dem OptionsMenu der Index gewechselt wird und so bekommt man den aktuellen Index.
Dieser wird aber immer mit übergeben ob du ihn brauchst oder nicht, aber wenn du den nicht abfängst, wird eine Exception geworfen.

Re: OptionMenu von Textdatei einlesen

Verfasst: Donnerstag 2. Dezember 2010, 15:03
von sumsum
Was ich sagen wollte war eigentlich nur, dass mein Textfile nicht gelesen wird :-( Ich möchte "readFile" so ändern, dass am Anfang im Optionmenu nicht immer nur 1 und 2 zur Auswahl stehen, sonern der Inhalt meines Files.

Code: Alles auswählen

    def readFile (self, selected_menupoint):
           
        self.fin = open("Test2.txt","r")
        self.iVar  = IntVar()
        ##self.ketchVar = IntVar()
        self.menu = self.optionmenu["menu"]
        self.lineList = self.fin.readlines()
        for self.line in self.lineList:
            print self.line,
            self.optionmenu.insert(label=self.line, variable=self.iVar)
Danke für die Mühe!

Re: OptionMenu von Textdatei einlesen

Verfasst: Donnerstag 2. Dezember 2010, 15:06
von Xynon1
Möchtest du das das Optionsmenü von Anfang an die Auswahl der Datei enthält ?

Weil hier wirkt es so, dass du erst bei der Auswahl eines Menüpunktes ein neues Menü einlesen möchtest.

Re: OptionMenu von Textdatei einlesen

Verfasst: Donnerstag 2. Dezember 2010, 15:07
von sumsum
Ja, ich möchte, dass es von Anfang an die Auswahl der Datei enthält :-)

Re: OptionMenu von Textdatei einlesen

Verfasst: Freitag 3. Dezember 2010, 10:20
von ts7343
Wenn das Optionmenu von Anfang an einen Dateiinhalt bekommen soll,
kann man dann nicht einfach in der init:
- den Inhalt lesen,
- in eine Liste packen
- diese Liste dann an das Optionmenue uebergeben?

Re: OptionMenu von Textdatei einlesen

Verfasst: Freitag 3. Dezember 2010, 10:25
von Xynon1
@ts7343
Das kann man nicht nur einfach so machen,
sondern das ist auch die beste Option, denn den Inhalt des Optionsmenüs zuändern,
wolltest du ja auch schon machen wenn ich mich recht entsinne, funktioniert nicht ganz so einfach.

Also einfach die Datei auslesen die Daten in eine Liste packen, am besten per ".split(...)"-Methode und diese beim erstellen des Optionsmenüs übergeben.

Re: OptionMenu von Textdatei einlesen

Verfasst: Freitag 3. Dezember 2010, 10:53
von ts7343
@Xynon1
ja, das stimmt, das war nicht ganz trivial, mit dem aendern zur Laufzeit,


hier hatte es auch so ausgesehen, als wenn sich das Optionmenu on-the-fly aendern soll ...
aber so wird es einfach,