2016-08-15 4 views
1

Ich habe eine Listbox mit tkinter erstellt Jetzt möchte ich den Benutzer auf ein Element in der Listbox klicken, die eine Variable mit der Auswahl erstellt.Python und Listbox (GUI)

listbox.bind('<ButtonRelease-1>', get_list) 

def get_list(event): 
    index = listbox.curselection()[0] 
    seltext = listbox.get(index) 
    print(seltext) 

Dies druckt die Auswahl ordnungsgemäß aus. Ich bin jedoch nicht in der Lage, den "seltext" aus der Funktion zu entfernen und später im Code zu verwenden. Jemand hat get_list (event) empfohlen, aber ich weiß nicht, wo das Ereignis herkommt. Schätzen Sie die Hilfe

EDIT:

for f in filename: 
       with open(f) as file_selection: 
        for line in file_selection: 
         Man_list = (line.split(',')[1]) 

         listbox.insert(END, Man_list) 

       file_selection.close() 



     def get_list(event): 
      global seltext 
      # get selected line index 
      index = listbox.curselection()[0] 
      # get th e line's text 
      global seltext 
      seltext = listbox.get(index) 



     # left mouse click on a list item to display selection 
     listbox.bind('<ButtonRelease-1>', get_list) 
+0

Ereignisbehandlungsroutinen sind nicht dafür ausgelegt, Werte zurückzugeben. Haben Sie nicht versucht, eine globale Variable oder eine Klasseneigenschaft zu erstellen? – Hobbes

+0

@Hobbes Ich bin ziemlich neu bei Python, also habe ich wirklich keine Ahnung, was das sind. Kannst du mir helfen? –

+0

Was ist der beste Weg, dies zu tun? –

Antwort

1

Dies ist ein Problem mit, wie Sie Ihren Code strukturieren als alles andere. Ereignishandler sind nicht dafür ausgelegt, Werte zurückzugeben. Verwenden Sie eine globale Variable oder eine Klasseneigenschaft, um den Wert abzurufen und zu speichern. Eine globale Variable kann wie folgt eingestellt werden:

from Tkinter import * 

def get_list(event): 
    global seltext 
    index = listbox.curselection()[0] 
    seltext = listbox.get(index) 

root = Tk() 
listbox = Listbox(root) 
listbox.pack() 
listbox.bind('<ButtonRelease-1>', get_list) 

for item in ["one", "two", "three", "four"]: 
    listbox.insert(END, item) 

seltext = None 

root.mainloop() 

Aber eine Klasseneigenschaft ist die bessere Option. Ihre Tkinter-Anwendung sollte modular sein, um sicherzustellen, dass alles leicht zugänglich ist und Probleme wie diese vermieden werden. Sie können Variablen auf self setzen und später auf diese Weise darauf zugreifen.

from Tkinter import * 

class Application(Tk): 
    def __init__(self): 
     Tk.__init__(self) 
     listbox = Listbox(self) 
     listbox.pack() 
     listbox.bind('<ButtonRelease-1>', self.get_list) 

     for item in ["one", "two", "three", "four"]: 
      listbox.insert(END, item) 

     self.listbox = listbox # make listbox a class property so it 
           # can be accessed anywhere within the class 

    def get_list(self, event): 
     index = self.listbox.curselection()[0] 
     self.seltext = self.listbox.get(index) 

if __name__ == '__main__': 
    app = Application() 
    app.mainloop() 
+0

für die erste, wie würden Sie sich selbst aus der Funktion bekommen? –

+0

kann immer noch nicht drucken (seltext) außerhalb der Funktion –

+0

Meine gesamte Antwort behandelt, wie Sie eine Variable in einen anderen Bereich ohne die Verwendung einer Return-Anweisung übertragen würde. Sie müssen genauer wissen, mit welchem ​​Problem Sie konfrontiert sind, und vielleicht mehr Code im ursprünglichen Post posten. Es ist schwierig, ein Scope-Problem ohne weitere Informationen zu diagnostizieren. – Hobbes