List box

Fragen zu Tkinter.
Antworten
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Hier bitte: lesen, lernen und verstehen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

verstehe ich nicht
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Das kommt davon wenn man die zwei Schritte davor überspringt.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Naja, ich meinte das eigentlich ohne Button.
Es soll beim klicken ausgelöst werden!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Hatte ich dir nicht neulich schon so eine Listbox zum Fraß vorgeworfen: http://www.python-forum.de/viewtopic.ph ... 14#p202314
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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

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
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Vielen Dank!!! :lol: Jetzt komm ich weiter :wink:
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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:
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten