Seite 1 von 1

List box

Verfasst: Freitag 8. Juli 2011, 13:26
von jtschoch
Hi

Ich möchte die Auswahl einer Listbox in ein Entry -Wiget ausgebeb lassen.
Ich weiß bloß nicht wie das geht!

Kann mir bitte jemand ein Beispiel machen

Re: List box

Verfasst: Freitag 8. Juli 2011, 15:32
von Xynon1
Hier bitte: lesen, lernen und verstehen.

Re: List box

Verfasst: Samstag 9. Juli 2011, 11:19
von jtschoch
verstehe ich nicht

Re: List box

Verfasst: Samstag 9. Juli 2011, 15:30
von Xynon1
Das kommt davon wenn man die zwei Schritte davor überspringt.

Re: List box

Verfasst: Samstag 9. Juli 2011, 16:53
von wuf
Hi jtschoch

Hier eine mögliche Lösung:

Code: Alles auswählen

#!/usr/bin/env python
## -*- coding: utf-8 -*-

from functools import partial
import Tkinter as tk

def transfer(listbox, entry_data):
    sel_index = listbox.curselection()
    data = listbox.get(sel_index)

    entry_data.set(data)
    
    listbox.selection_clear(sel_index)
    
def update(listbox, elements):
    listbox.insert("end", *elements)

if __name__ == "__main__":
    
    my_list = ['Element-1', 'Element-2', 'Element-3']
   
    app_win = tk.Tk()

    #~~ Listbox
    listbox = tk.Listbox(app_win, bg='khaki', bd=1, selectmode="single",
        highlightthickness=0)
    listbox.pack()
    update(listbox, my_list)
   
    #~~ Eingabe
    entry_data = tk.StringVar()
    entry = tk.Entry(app_win, bg='white', bd=1, highlightthickness=0,
        textvariable=entry_data)
    entry.pack(pady=5)
    
    #~~Schaltflächen
    button_frame = tk.Frame(app_win)
    button_frame.pack(pady=5)
    
    cmd_transfer = partial(transfer, listbox, entry_data)
    button_pack_info = dict(side='left', padx=5)
    
    button_transfer = tk.Button(button_frame, text="Transfer",
        command=cmd_transfer)
    button_transfer.pack(button_pack_info)

    button_exit = tk.Button(button_frame, text="Exit",
        command=app_win.destroy)
    button_exit.pack(button_pack_info)
    
    app_win.mainloop()
Gruß wuf :wink:

Re: List box

Verfasst: Montag 18. Juli 2011, 09:27
von jtschoch
Naja, ich meinte das eigentlich ohne Button.
Es soll beim klicken ausgelöst werden!

Re: List box

Verfasst: Montag 18. Juli 2011, 09:42
von BlackJack

Re: List box

Verfasst: Montag 18. Juli 2011, 09:57
von Xynon1
Hatte ich dir nicht neulich schon so eine Listbox zum Fraß vorgeworfen: http://www.python-forum.de/viewtopic.ph ... 14#p202314

Re: List box

Verfasst: Montag 18. Juli 2011, 12:48
von wuf
Hi jtschoch

Hast du dir ein bisschen Ferien gegönnt?
jtschoch hat geschrieben:Naja, ich meinte das eigentlich ohne Button.
Super! Dies ist eine Bestätigung, dass du das Skript ausprobiert hast. Es geht aber auch ohne Button. Hier:

Code: Alles auswählen

#!/usr/bin/env python
## -*- coding: utf-8 -*-

from functools import partial
import Tkinter as tk

def transfer(listbox, entry_data, args):
    sel_index = listbox.curselection()
    data = listbox.get(sel_index)

    entry_data.set(data)
    
    listbox.selection_clear(sel_index)
    
def update(listbox, elements):
    listbox.insert("end", *elements)

if __name__ == "__main__":
    
    my_list = ['Element-1', 'Element-2', 'Element-3']
   
    app_win = tk.Tk()

    #~~ Listbox
    listbox = tk.Listbox(app_win, bg='khaki', bd=1, selectmode="single",
        highlightthickness=0)
    listbox.pack()
    update(listbox, my_list)
   
    #~~ Eingabe
    entry_data = tk.StringVar()
    entry = tk.Entry(app_win, bg='white', bd=1, highlightthickness=0,
        textvariable=entry_data)
    entry.pack(pady=5)
    
    cmd_transfer = partial(transfer, listbox, entry_data)
    listbox.bind('<ButtonRelease-1>', cmd_transfer)

    #~~Schaltflächen
    button_frame = tk.Frame(app_win)
    button_frame.pack(pady=5)
    
    button_exit = tk.Button(button_frame, text="Exit",
        command=app_win.destroy)
    button_exit.pack(side='left', padx=5)
    
    app_win.mainloop()
Hier noch eine angepasste Variante des Effbod-Imperiums:

Code: Alles auswählen

import Tkinter as tk

class Dialog(tk.Frame):

    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.list = tk.Listbox(self, selectmode='single', )
        self.list.pack(fill='both', expand='yes')
        self.current = None
        self.entry_data = None

        self.poll()

    def update(self, list_items):
        self.list.insert("end", *list_items)

    def poll(self):
        sel_index = self.list.curselection()
        if sel_index != self.current:
            self.current = sel_index
            if self.entry_data != None:
                self.entry_data.set(self.list.get(sel_index))
        self.after(250, self.poll)

if __name__ == "__main__":
    
    my_list_items = ['jtschoch-1', 'jtschoch-2', 'jtschoch-3']
   
    app_win = tk.Tk()
    
    dialog = Dialog(app_win)
    dialog.pack()
    dialog.update(my_list_items)
    
    entry_data = tk.StringVar()
    entry = tk.Entry(app_win, bg='white', bd=1, highlightthickness=0,
        textvariable=entry_data)
    entry.pack(pady=5)
    
    dialog.entry_data = entry_data
    
    app_win.mainloop()
Xynon1 hat geschrieben:Hatte ich dir nicht neulich schon so eine Listbox zum Fraß vorgeworfen
Raubtiere fressen scheinbar auch nicht alles. :lol:

Gruß wuf :wink:

Re: List box

Verfasst: Montag 18. Juli 2011, 13:05
von Xynon1
Dieses *Raubtier* wäre in der Wildnis(Web) längst verhungert so wie es sich seine Beute(Quellcode) besorgt, zum Glück gibt es ja Zoos(Foren). Und dann fängt es auch noch an Futter(fertigen Quellcode - sogar schon vorgekaut) zu ignorierenen? :K

Re: List box

Verfasst: Montag 18. Juli 2011, 14:10
von yipyip
Dieses *Raubtier* kann wohl nur in Gesellschaft ziemlich genuegsamer Wiederkaeuer ueberleben :D. Deshalb hier nochmal eine Variante mit dem <<ListboxSelect>> Event. (Ganz, ganz unten auf der entspr. Effbot-Seite)

Code: Alles auswählen

import Tkinter as tk

class Gui(object):

  def __init__(self):

    self.root = tk.Tk()
    font = 'Arial', 12, 'bold'

    self.list_var = tk.StringVar()
    # Use <Shift> and <STRG> to select multiple ranges!
    self.listbox = tk.Listbox(self.root, font=font, selectmode=tk.EXTENDED)
    self.listbox.pack(fill=tk.BOTH, expand=True)
    self.listbox.bind("<Button-1>", self.check)
    
    self.items = []
    for i in dir(self.root):
      self.listbox.insert(tk.END, i)
      self.items.append(i)

    self.entry_var = tk.StringVar()
    self.entry = tk.Entry(self.root, textvariable=self.entry_var, font=font, width=40)
    self.entry.pack(fill=tk.BOTH)

    self.listbox.bind('<<ListboxSelect>>', self.check)
        

  def check(self, event):

    indices = map(int, self.listbox.curselection())
    #print self.listbox.curselection()
    self.entry_var.set(' '.join(self.items[i] for i in indices))
    
     
  def run(self):

    self.root.mainloop()


if __name__ == '__main__':

  Gui().run()
:wink:
yipyip

Re: List box

Verfasst: Montag 18. Juli 2011, 17:18
von wuf
Hallo yipyip

Danke für den goldenen Hinweis betreffs '<<ListboxSelect>>'. Wie du siehst nehme ich es auch nicht so genau mit dem durchlesen der Dokumente. :shock: Muss mich unbedingt verbessern. Somit ergibt sich eine weitere Variante:

Code: Alles auswählen

import Tkinter as tk

class Dialog(tk.Listbox):

    def __init__(self, parent, entry_var):
        
        self.entry_var = entry_var
        tk.Listbox.__init__(self, parent, selectmode='single', )
        self.bind('<<ListboxSelect>>', self.change)

    def update(self, list_items):
        self.insert("end", *list_items)

    def change(self, event):
        self.entry_var.set(self.get(self.curselection()))

if __name__ == "__main__":
    
    list_items = ['jtschoch-1', 'jtschoch-2', 'jtschoch-3']
   
    app_win = tk.Tk()
    
    entry_var = tk.StringVar()
    
    dialog = Dialog(app_win, entry_var)
    dialog.pack(fill='both', expand=True)
    dialog.update(list_items)

    entry = tk.Entry(app_win, bg='white', textvariable=entry_var)
    entry.pack(pady=5)
    
    app_win.mainloop()
Gruß wuf :wink:

Re: List box

Verfasst: Donnerstag 21. Juli 2011, 10:54
von jtschoch
Vielen Dank!!! :lol: Jetzt komm ich weiter :wink:

Re: List box

Verfasst: Donnerstag 21. Juli 2011, 11:43
von Xynon1
Mit so wenig Informationen wie jetzt ist es nur möglich Puzzelstücke schreiben, vieleicht sagts du uns einfach mal was dein Programm alles können soll, dann schreiben wir es dir auch ganz. :roll: