Werte einer Liste auslesen je Klick eines Buttons in tkinter

Fragen zu Tkinter.
Antworten
Tobias1987
User
Beiträge: 4
Registriert: Dienstag 6. April 2021, 20:57

Hi,

es soll ein Button angeklickt werden, danach soll der erste Wert von einer Liste in einem Textfeld unterhalb angezeigt werden, beim nächsten klick der zweite Wert usw.

Ich kann ein Fenster erstellen, ein Button, ein Textfeld und weiß irgendwie muss ich die Liste mit einer for Schleife auslesen.

wahrscheinlich ein ziemlich einfaches Problem, dennoch komm ich nicht auf die Lösung was daran liegen könnte das ich Anfänger bin.

Schon mal vielen Dank für eure Hilfe
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, die Liste muss nicht per for-Schleife ausgelesen werden. Du willst ja einen bestimmten Wert haben, und das durch ein Ereignis. Sowas wie “warte auf Button, dann hier weitermachen” gibt’s bei GUIs (so ohne weiteres) nicht.

Was hast du bis jetzt geschrieben?
Tobias1987
User
Beiträge: 4
Registriert: Dienstag 6. April 2021, 20:57

from openpyxl import load_workbook
wb=load_workbook(r"C:\test.xlsx")
ws=wb.active

cell_values = []
for row_of_cells in ws['F2':'F99']:
for cell in row_of_cells:
if cell is not None:
cell_values.append(cell.value)

print(cell_values)

Gibt aus der Excel Datei meine Daten als Liste aus. Jetzt möchte ein Wert nach dem anderen bei mausklick auf einen Button ausgeben. Was mir jetzt noch eingefallen aus der Liste eine mySQL Datenbank zu machen, auch bei numpy war ich schon und komm da nicht weiter. Vielleicht mit einem Array?

Mir wäre es lieber wenn die Daten aus der Excel Tabelle lokal auf dem PC höchstens in der Zwischenablage gespeichert werden würden :)

Danke
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich sehe da keinen Button. Wo soll der herkommen?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich verstehe Dein Problem nicht. Du hast doch schon Code, der die Excel-Tabelle liest, was willst Du denn jetzt mit einer anderen Datenhaltung? Da hängst Du doch dann am selben Problem, dass Du eine GUI programmieren willst.

Da niemand hier weiß, wie weit Du schon mit GUIs bist, mit Wissen, wie man Klassen schreibt, mit Funktionen im Allgemeinen, weiß ich jetzt nicht, wo ich ansetzen muß.

Als erster Schritt wäre es, eine saubere GUI aufzubauen. Dazu gibt es hier im Forum etliche Posts, wo gezeigt wird, wie so eine GUI grundsätzlich aussiehte. Du brauchst ein Fenster, einen Button und ein Eingabefeld. Wenn Du soweit bist, können wir hier den nächsten Schritt diskutieren, wie man den Button mit Deiner Exceltabelle zusammenbringt.
Tobias1987
User
Beiträge: 4
Registriert: Dienstag 6. April 2021, 20:57

Hallo, hab jetzt mal folgende GUI gebaut:

import pandas as pd
from tkinter import *

def einlesen():
df=pd.read_excel(input_field.get())
print(df)

window =Tk()
window.title("Excel Listen Ausgabe")
window.geometry("450x300")

input_field =Entry(window)
input_field.place(x=0, y=25)

output_field= Text(window)
output_field.grid(row=0, column=1)
output_field.place(x=0 , y=00)
output_field.insert(END,"Hier Ausgabe")
ok_button=Button(window,text="Datei einlesen",command=einlesen)
ok_button.place(x=0, y=50)

Nächster_Datensatz=Button(window,text="hier draufdrücken um Wert A1 in der Excel auszugeben nochmal drauf dann A2 usw.")
Nächster_Datensatz.place(x=0, y=100)

input_field.pack()
ok_button.pack()
Nächster_Datensatz.pack()
output_field.pack()
window.mainloop()

Wie könnte es jetzt weiter gehen??

Mein Problem ist es immer noch bei einer Aktion (z.B. drücken von p) der ersten Wert einer Liste auzugeben, dann wieder drücken von p zweiter wert etc.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

*-Importe benutzt man nicht, globale Variablen genausowenig.
Du benutzt place, grid und pack gleichzeitig, auf den selben Widgets. Das ist alles mehr Hoffen und Raten, als Programmieren.

Code: Alles auswählen

from functools import partial
import pandas as pd
import tkinter as tk

def einlesen(input_field):
    df = pd.read_excel(input_field.get())
    print(df)
 
def main():
    window = tk.Tk()
    window.title("Excel Listen Ausgabe")
    window.geometry("450x300")

    input_field = tk.Entry(window)
    input_field.pack()

    output_field = tk.Text(window)
    output_field.insert(tk.END, "Hier Ausgabe")
    output_field.pack()

    tk.Button(window, text="Datei einlesen", command=partial(einlesen, input_field)).pack()
    tk.Button(window, text="hier draufdrücken um Wert A1 in der Excel "
        "auszugeben nochmal drauf dann A2 usw.").pack()
    window.mainloop()

if __name__ == "__main__":
    main()
Jetzt ist aber `df` nur eine lokale Variable, und Du hast auch keine Möglichkeit, zu zählen, wie oft Dein Button schon gedrückt worden ist.
Das geht nur, in dem Du eine Klasse definierst.
Wie man das macht, solltest Du als erstes lernen, bevor Du hier mit Deinem eigentlichen Problem weiter machen kannst.
Tobias1987
User
Beiträge: 4
Registriert: Dienstag 6. April 2021, 20:57

OK hab das mit den Klassen jetzt etwas genauer angeschaut. Komm leider aber dennoch nicht weiter wie ich diese in dieser Anwendung verwenden könnte. Gib mir doch bitte noch einen Tipp

Danke für deine bisherigen Bemühungen
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

einen weiteren Tipp kann man dir geben, wenn du deine Klasse mal zeigst. Jetzt weis gerade keine wo dein Problem liegt und wie man weiterhelfen kann.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten