Listbox auswahl als Int

Fragen zu Tkinter.
Code_Bender
User
Beiträge: 21
Registriert: Sonntag 6. Januar 2019, 12:32

aber Listbox hat keinen attribut namens "type"
Code_Bender
User
Beiträge: 21
Registriert: Sonntag 6. Januar 2019, 12:32

kannst du mal ein beispiel geben, denn bei mir gibts keinen Listbox attribut namens "type()"
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Code_Bender: `type()` ist eine eingebaute Funktion die den Typ des Arguments ermittelt. Und den kannst Du dann ausgeben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Code_Bender
User
Beiträge: 21
Registriert: Sonntag 6. Januar 2019, 12:32

wenn ich selection = type(listbox.get("active")) und dann print(selection) mache dann kommt "<class 'str'>" raus
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Code_Bender: Deckt sich mit der Dokumentation zu der Methode.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Code_Bender
User
Beiträge: 21
Registriert: Sonntag 6. Januar 2019, 12:32

Kannst du bitte ein Beispiel an einer Listbox geben?
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Code_Bender: Die verlinkte Referenzdokumentation beschreibt genau was `curselection()` zurück gibt, sowohl den/die Datentyp(en) als auch die Bedeutung der Werte. Es sind Grunddatentypen. Wenn Du das nicht gebacken kriegst, dann arbeite ein Grundlagentutorial durch, bis Du Dich mit den Python-Grundlagen auskennst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Code_Bender

Hier etwas zum herumspielen:

Code: Alles auswählen

import random 
import tkinter as tk

APP_TITLE = "Listbox Selection"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 300
APP_HEIGHT = 300


class Application(object):

    def __init__(self, main_win):
        self.main_win = main_win
        
        self.build()
        
    def build(self):
        self.radom_data = [round(random.uniform(0,1000), 2)
            for cycle in range(20)]
        print(self.radom_data)
        self.main_frame = tk.Frame(self.main_win)
        self.main_frame.pack(fill='both', expand=True, padx=10, pady=10)

        scrollbar = tk.Scrollbar(self.main_frame)
        scrollbar.grid(row=0, column=1, sticky='ns')
        
        listbox = tk.Listbox(self.main_frame, height=10, width=50,
            selectmode="extended")
        listbox.grid(row=0, column=0)
        listbox.selection_set(0)
        listbox["yscrollcommand"] = scrollbar.set
        listbox.bind('<<ListboxSelect>>', self.check)
        self.listbox = listbox
        
        scrollbar["command"] = listbox.yview
        
        listbox.insert('end', *self.radom_data)
        
    def check(self, event):
        print(type(self.listbox.curselection()), self.listbox.curselection())
        line_nubers = self.listbox.curselection()
        
        for line_nr in line_nubers:
            selected_element = self.listbox.get(line_nr)
            
            print("Selektiertes Listbox-Elemente-{}: {}".format(
                line_nr, selected_element))
        
        
def main():
    main_win = tk.Tk()
    main_win.title(APP_TITLE)
    main_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    #main_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    
    app = Application(main_win)
    
    main_win.mainloop()
 
 
if __name__ == '__main__':
    main()      

#from tkinter import *
#from tkinter.scrolledtext import ScrolledText
#from tkinter.ttk import Progressbar
#from tkinter.ttk import Combobox
#from tkinter import messagebox
#from tkinter import filedialog
#from time import *
#import webbrowser as web
#import os
#import sys

#FONT = ["Bahnschrift", 14 , "bold"]
#FONT2 = ["Bahnschrift", 12 , "bold"]

#def n1(event=None):
    #def OPEN(event=None):
        #filename = filedialog.askdirectory()
        #Wider_zu.insert("end", filename)
    #def BACK(event=None):
        #var = -600
        #var2  = 0
        #for i in range(100):
            #var = var + 6
            #var2 = var2 + 6
            #main.place(x=var, y=0)
            #Wider.place(x=var2, y=0)
            #sleep(0)
            #root.update()
        #Wider.destroy()
    #def WIDERHER(event=None):
        #e = Wider_zu.get()
        #prolb["text"] = "Suche Dateien"
        #Wider_zu.config(state="disabled")
        #Widerher.config(state="disabled")
        #for i in range(20):
            #pro["value"] = i
            #sleep(0.000025)
            #root.update()
        #if e == "":
            #Wider_zu.config(state="normal")
            #Widerher.config(state="normal")
            #prolb["text"] = "Ein fehler ist Aufgetreten"
        #prolb["text"] = "Dateien lokatisiert"
        #try:
            #d1r = open(scroll.get("active"), "r")
            #d1 = d1r.read()
            #d2 = open(Wider_zu.get()+"/"+scroll.get("active"), "w")
            #d2.write(d1)
            #prolb["text"] = "Dateien Ungeschrieben"
            #for i in range(560):
                #i = i + 20
                #pro["value"] = i
                #sleep(0)
                #root.update()
            #root.update()
            #sleep(0.5)
            #prolb["text"] = "Warten..."
            #for i in range(20):
                #i = i + 580
                #pro["value"] = i
                #sleep(0.25)
                #root.update()
                #pro.update()
            #d1.close()
            #d2.close()
        #except:
            #Wider_zu.config(state="normal")
            #Widerher.config(state="normal")
            #prolb["text"] = "Ein fehler ist Aufgetreten"
    #Wider = Frame(root, height=300, width=600, bg="#FFFFFF")
    #Wider.place(x=600, y=0)
    #sc = Scrollbar(Wider)
    #sc.place(x=300, y=80)
    #scroll = Listbox(Wider, height=10, width=50, selectmode="extended")
    #scroll.place(x=0, y=80)
    #scroll.selection_set(0)
    #scroll["yscrollcommand"] = sc.set
    #sc["command"] = scroll.yview
    #filer = open("C:/Users/Gabriel/Documents/1 Projeckte/Abteil B/Datei Liste.data", "r")
    #file = filer.read().splitlines()
    #filer.close()
    #for i in file:
        #scroll.insert("end", i)
    #DatOpen = Button(Wider, text="Order Öffnen", bg="#FFFFFF", relief="raised", bd=1,
                     #font=FONT, command = OPEN)
    #DatOpen.place(x=477, y=0)
    #Back = Button(Wider, text="< Zurück", bg="#FFFFFF", relief="raised", bd=1,
                  #font=FONT, command = BACK)
    #Back.place(x=0, y=0)
    #Wider_zulb = Label(Wider, text="Widerherstellen zu:", bg="#FFFFFF", font=FONT2)
    #Wider_zulb.place(x=0, y=50)
    #Wider_zu = Entry(Wider, width=40, bg="#FFFFFF", font=FONT2)
    #Wider_zu.place(x=150, y=52)
    #Widerher = Button(Wider, text="Widerherstellen", bg="#FFFFFF", font=FONT2,
                      #relief="raised", bd=1, width=13, command = WIDERHER)
    #Widerher.place(x=474, y=245)
    #pro = Progressbar(Wider, length=600, maximum=600, value=0)
    #pro.place(x=0, y=278)
    #prolb = Label(Wider, text="", bg="#FFFFFF", font=FONT2)
    #prolb.place(x=230, y=250)
    #var = 0
    #var2 = 600
    #for i in range(100):
        #var = var - 6
        #var2 = var2 - 6
        #Wider.place(x=var2, y=0)
        #main.place(x=var, y=0)
        #sleep(0)
        #root.update()
#def n2(event=None):
    #def BACK(event=None):
        #var = -600
        #var2  = 0
        #for i in range(100):
            #var = var + 6
            #var2 = var2 + 6
            #main.place(x=var, y=0)
            #Hinzu.place(x=var2, y=0)
            #sleep(0)
            #root.update()
        #Hinzu.destroy()
    #def M(event=None):
        #sel = listbox
        #del file[sel]
        #print(file)
        ##listbox.delete(0, END)
        ##for i in file:
            ##listbox.insert("end", i)
    #Hinzu = Frame(root, height=300, width=600, bg="#FFFFFF")
    #Hinzu.place(x=600, y=0)
    #Back = Button(Hinzu, text="< Zurück", bg="#FFFFFF", relief="raised", bd=1,
                  #font=FONT, command = BACK)
    #Back.place(x=0, y=0)
    #listbox = Listbox(Hinzu, height=10, width=40)
    #listbox.place(x=0, y=40)
    #filer = open("C:/Users/Gabriel/Documents/1 Projeckte/Abteil B/Datei Liste.data", "r+")
    #file = filer.read().splitlines()
    #filer.close()
    #for i in file:
        #listbox.insert("end", i)
    #plus = Button(Hinzu, text="+", width=2, bg="#FFFFFF", relief="raised", bd=1)
    #plus.place(x=0, y=210)
    #minus = Button(Hinzu, text="-", width=2, bg="#FFFFFF", relief="raised", bd=1, command =M)
    #minus.place(x=23, y=210)
    #var = 0
    #var2 = 600
    #for i in range(100):
        #var = var - 6
        #var2 = var2 - 6
        #Hinzu.place(x=var2, y=0)
        #main.place(x=var, y=0)
        #sleep(0)
        #root.update()

#root = Tk()
#root.title("Datei Manager v.1.1")
#root.resizable(0, 0)
#root.geometry("600x300+330+100")
#root.config(bg="#FFFFFF")
##root.iconbitmap(r"Datei Icon.ico")
#root.attributes("-topmost", False)

#try:
    #import winsound as sound
#except:
    #messagebox.showerror \
                         #("!Error!", "Das Modul 'Winsound'\nKonnte nicht gefunden werden!")

#main = Frame(root, height=300, width=600, bg="#FFFFFF")
#main.place(x=0, y=0)

#D_Widerherstellen = Button(main, text="Dateien Widerherstellen >", width=20, bg="#FFFFFF",
                           #relief="raised", bd=1, font="Bahnschrift 14 bold", command = n1, justify="left")
#D_Widerherstellen.place(x=0, y=80)

#D_Hinzufuegen = Button(main, text="Dateien Verwalten >", width=20, bg="#FFFFFF",
                           #relief="raised", bd=1, font="Bahnschrift 14 bold", command = n2, justify="left")
#D_Hinzufuegen.place(x=0, y=120)

#root.mainloop()
Gruss wuf :-)
Take it easy Mates!
Code_Bender
User
Beiträge: 21
Registriert: Sonntag 6. Januar 2019, 12:32

Danke schön für die vielen Vorschläge, ich nehme mir die Zeit es durchzuarbeiten.
Ich bin das erste mal auf dem Python Forum, bin 13 Jahre alt und mache Python
erst seit 1 Jahr.
Danke und bis Bald!
gregix
User
Beiträge: 2
Registriert: Mittwoch 17. April 2019, 19:22

Code: Alles auswählen

from tkinter import *
Win = Tk()

file = ("a","b","c")

listbox = Listbox(Win, height=5)
listbox.pack()

for i in file:
	listbox.insert("end", i)

def DEL():
    sel = listbox.curselection()[0]
    print(sel, file[sel])

minus = Button(Win, text="Hallo", command = DEL)
minus.pack()
Win.mainloop()
Minimal Beispiel


mfg
Gregor
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gregix: Anmerkungen zum Quelltext: Sternchen-Importe sind Böse™. Damit holt man sich gerade bei `tkinter` deutlich mehr als 150 Namen ins Modul von denen nur ein ganz kleiner Bruchteil tatsächlich verwendet wird. Es wird schwerer nachzuvollziehen was woher kommt, und es besteht die Gefahr von Namenskollisionen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Noch unübersichtlicher wird es wenn zwischen dem Hauptprogramm auf Modulebene auch noch Funktionsdefinitionen stehen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen: Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Man sollte keine kryptischen Abkürzungen verwenden, sondern Dinge so benennen, das der Leser nicht raten muss was der Name bedeuten mag.

`file` ist kein Name für ein Tupel mit Zeichenketten. Bei einem Objekt das `file` heisst, erwartet der Leser das es sich um ein Dateiobjekt handelt, das `read()`- und/oder `write()`-Methoden besitzt. Das Tupel ist auch nicht die richtige Wahl. Tupel verwendet man für Werte wo der Index an dem jeder Wert steht, etwas über die Bedeutung des Wertes aussagt. Wenn alle Werte die gleiche Bedeutung haben, dann verwendet man eine Liste. Ausnahme wäre wenn man zwingend die Eigenschaft benötigt, dass die Sequenz ”hashbar” ist, um sie beispielsweise als Schlüssel in einem Wörterbuch oder als Element in einer Menge verwenden zu können.

Nach Kommas erhöht ein Leerzeichen die Lesbarkeit.

`i` ist kein guter Name für etwas anderes als eine ganze Zahl, insbesondere wenn es dann auch noch die Laufvariable in einer Schleife ist.

Um Gleicheitszeichen bei Schlüsselwortargumenten werden keine Leerzeichen gesetzt.

`minus` ist ein sehr komischer Name für eine Schaltfläche die in diesem Programm überhaupt gar keinen Namen braucht.

`DEL` wäre von der Schreibweise der Name für eine Konstante und nicht für eine Funktion. Die drei Buchstaben beschreiben auch nicht wirklich die Tätigkeit, die diese Funktion verrichtet.

Funktionen und Methoden sollten alles was sie ausser Konstanten benötigten als Argument(e) übergeben bekommen. In diesem Programm kommt man noch mit `functools.partial()` aus, aber bei jeder nicht-trivialen GUI wird man nicht wirklich um objektorientierte Programmierung herum kommen.

Der Code berücksichtigt nicht den Fall das *kein* Eintrag ausgewählt ist wenn auf der Benutzer auf die Schaltfläche klickt.

Code: Alles auswählen

#!/usr/bin/env python3
from functools import partial
import tkinter as tk


def print_selected_filename(listbox, filenames):
    indices = listbox.curselection()
    if indices:
        assert len(indices) == 1, 'more than one selected'
        index = indices[0]
        print(index, filenames[index])


def main():
    filenames = ['a', 'b', 'c']
    
    window = tk.Tk()

    listbox = tk.Listbox(window, height=5)
    listbox.pack()
    for filename in filenames:
        listbox.insert(tk.END, filename)

    tk.Button(
        window,
        text='Hallo',
        command=partial(print_selected_filename, listbox, filenames),
    ).pack()
    window.mainloop()


if __name__ == '__main__':
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Code_Bender
User
Beiträge: 21
Registriert: Sonntag 6. Januar 2019, 12:32

Danke!Mein Problem ist gelöst!!
Danke __blackjack__, dass du mir geholfen hast und ein
Danke schön an gregix, dass ihr mein Problem gelöst habt!

Code_Bender
Antworten