Dynamisches Eingabefenster

Fragen zu Tkinter.
Antworten
DanielFackler
User
Beiträge: 5
Registriert: Montag 13. November 2017, 10:41

Montag 13. November 2017, 10:55

Hallo Python-Gemeinde,

ich beschäftige mich leider erst seit kurzem mit der mächtigen Programmiersprache Python, bin daher noch ein Python-Anfänger.

Ich habe folgendes Problem:

Ich muss ein Eingabefenster kreieren, dass seine Eingabefelder und Labels je nach Auswahl des vorliegenden Falls ändert. Sprich: Wenn ich den Wert des Dropdown-Button ändere, soll sich die Anzahl der Eingabefelder und der Text der Labels ändern.

Momentan komme ich einfach nicht weiter. Das Programm ändert zwar die Anzahl der Labels, Entrys und Radiobuttons, jedoch plaziert das Programm diese willkürlich. Ich gebe ihm zwar eigentlich über .grid die Position, jedoch führt es dies nicht aus. Da die Labels ebenfalls dynamisch erzeugt werden, will ich den Text, der in den Labels steht, über eine Liste (evtl. bessere Lösung?) eingeben können.
Der Inhalt der Entrys soll noch ein ein Textfile geschrieben werden.

Ich hoffe Ihr könnt mir weiterhelfen und bedanke mich bereits im vorraus.
Anbei noch mein bisheriger Code.

Code: Alles auswählen

import tkinter as tk
from tkinter import *

def open_window():
    X = fenster()                      

    Eingabemaske(X)
    X.mainloop()
    
    
#Fenster kreiren
def fenster():
 
    X = tk.Tk()                                                                          
    X.wm_title('test')   
    X.wm_geometry('600x600')
    return X 
        
#Fenster je nach Auswahl verändern (Eingabefelder löschen und hinzufügen)    

def Eingabemaske(X):
    
    def onChange(val):
        if val == "test1":
            numb_ent = 4
            numb_lab = 4
            numb_radio = 2
            l_text = ['Label1', 'Label2']
            rb_text = ['option1', 'option2']
            
        elif val == "test2":
            numb_ent = 3
            numb_lab = 3
            numb_radio = 0
            l_text = ['Label3', 'Label4']
            
        else:
            numb_ent = 2
            numb_lab = 2
            numb_radio = 0
            l_text = ['Label5', 'Label6']
           

        #Zerstört alle Steuerelemente in den Containern
        for wid in container1.winfo_children():
            wid.destroy() # Using destory instead of grid_forget
        
        for label in container2.winfo_children():
            label.destroy()
            
        for Radiobutton in container3.winfo_children():
            Radiobutton.destroy()
            
        #Erstellt dynamisch die Steuerelemente im Container Frame
        #Anzahl entspricht den Variablen oben
        for u in range(numb_lab):
    
            l = tk.Label(container2, text=l_text)
            l.grid(row=1 + u, column = 2)
       
        for v in range(numb_ent):
            e = tk.Entry(container1)
            e.grid(row=1 + v, column = 2)
   
        for w in range(numb_radio): 
            var1 = IntVar(X)
            var1.set(2)
            rb = tk.Radiobutton(container3, text=rb_text, variable=var1, value=1)
            rb.grid(row=1 + w, column = 2)

    options = ["test1", "test2", "test3"]
    var = tk.StringVar()
    var.set("test1")

    op_menu = tk.OptionMenu(X, var, *options, command = onChange)
    op_menu.grid(row = 0, column = 0)

    # Container Frame für die Steuerelemente
    
    container1 = tk.Frame(X)
    container2 = tk.Frame(X)
    container3 = tk.Frame(X)
    container1.grid()
    container2.grid()
    container3.grid()

    
open_window()
Antworten