Seite 1 von 1

auf dynamisch erstellte Label zugreifen oder deren Namen ändern?

Verfasst: Freitag 24. April 2020, 19:15
von Phraya
Ich möchte gerne eine Funktion schreiben, die mir dynamisch eine Tabelle aus Label Widgets baut. Das funktioniert auch soweit schon gut. Aber WIE kann ich den einzelnen Labelfeldern später ihren Inhalt zuweisen?

Wie bekomme ich die Namen heraus und weiss dann auch noch welches sich wo in der Tabelle befindet?
Kann ich die Namen dann nachträglich noch irgendwie ändern?
Oder gibt es irgendeine Möglichkeit bei der Erstellung bereits eigene Namen zu vergeben - wie in meinem Beispiel z.B. der text in den Labels (C1R1) fur column1 row1 ???


application.py

Code: Alles auswählen

from test_layout_class import *
import tkinter as tk


class Window():
    def __init__(self,title="dhd", size="1200x600", bg_color="#181a23"):
        self.win = tk.Tk()
        self.win.title(title)
        self.win.geometry(size)

    def foo(self):
        new_table = LayoutClass(self.win)
        new_table.sipmple_table()


new_app = Window()
new_app.foo()
mainloop()



test_layout_class

Code: Alles auswählen

from tkinter import *

class LayoutClass():

    def __init__(self, target):
        self.target = target

    def sipmple_table(self):
        table = Frame(self.target, bg="#b0bbce", padx=1, pady=1)
        height = 11
        width = 10

        table_title = Label(table, text="Titel", bg="#bad2fc")
        table_title.grid(row=0, column=0, columnspan=width, sticky="nsew")

        for y in range(1, width):
            for x in range(1, height):
                cell = Label(table,text="C"+str(y)+"R"+str(x))
                cell.config(bg="#d7e4fb", padx=4, pady=4, width=10)
                cell.grid(row=x, column=y-1, padx=1, pady=1)
        table.pack()
        
        

Re: auf dynamisch erstellte Label zugreifen oder deren Namen ändern?

Verfasst: Freitag 24. April 2020, 19:37
von __deets__
Du musst die in eine Datenstruktur speichern. Zb eine Liste von Listen. Dann kannst du mit

labels[x][y]

auf eines zugreifen.

Re: auf dynamisch erstellte Label zugreifen oder deren Namen ändern?

Verfasst: Samstag 25. April 2020, 14:40
von Sirius3
Eine Klasse pro Datei ist Java, das macht man aber in Python nicht. Die Layout-Klasse ist auch nicht wirklich sinnvoll. Sie besteht ja nur aus einer Methode.
Benutze keine *-Importe, was Du ja komischerweise in application.py auch beherzigt hast.
In __init__ sollte das komplette Fenster erzeugt werden.
Klassen erkennt man am großen Anfangsbuchstaben, da muß nicht Class im Namen sein.
Row `x` und Column `y` zu nennen, ist sehr verwirrend.
Strings stückelt man nicht mit + zusammen sondern benutzt Stringformatierung.
Warum heißen Deine Variablen new_xxx, die sind ziemlich schnell nicht mehr neu, das hat überhaupt keine Aussagekaft.

Code: Alles auswählen

import tkinter as tk

class Table(tk.Frame):
    def __init__(self, target, rows=11, columns=10):
        super().__init__(target, bg="#b0bbce", padx=1, pady=1)
        self.target = target
        self.table_title = tk.Label(self, text="Titel", bg="#bad2fc")
        self.table_title.grid(row=0, column=0, columnspan=columns, sticky="nsew")
        self.cells = []
        for row in range(1, rows + 1):
            cell_row = []
            for column in range(columns):
                cell = tk.Label(self, text=f"C{column}R{row}")
                cell.config(bg="#d7e4fb", padx=4, pady=4, width=10)
                cell.grid(row=row, column=column, padx=1, pady=1)
                cell_row.append(cell)
            self.cells.append(cell_row)

class Window(tk.Tk):
    def __init__(self,title="dhd", size="1200x600", bg_color="#181a23"):
        super().__init__()
        self.title(title)
        self.geometry(size)
        self.table = Table(self)
        self.table.pack()


def main():
    app = Window()
    app.mainloop()

if __name__ == '__main__':
    main()

Re: auf dynamisch erstellte Label zugreifen oder deren Namen ändern?

Verfasst: Samstag 25. April 2020, 16:22
von Phraya
Vielen Dank fur die Hilfe! macht Sinn... Danke!