OptionMenu von Textdatei einlesen

Fragen zu Tkinter.
Antworten
sumsum
User
Beiträge: 11
Registriert: Donnerstag 2. Dezember 2010, 13:00

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()
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
sumsum
User
Beiträge: 11
Registriert: Donnerstag 2. Dezember 2010, 13:00

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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
sumsum
User
Beiträge: 11
Registriert: Donnerstag 2. Dezember 2010, 13:00

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!
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Zuletzt geändert von Xynon1 am Donnerstag 2. Dezember 2010, 15:07, insgesamt 1-mal geändert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
sumsum
User
Beiträge: 11
Registriert: Donnerstag 2. Dezember 2010, 13:00

Ja, ich möchte, dass es von Anfang an die Auswahl der Datei enthält :-)
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

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?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

@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,
Antworten