Mehrere Eingabefelder in einer zeile

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
muekno
User
Beiträge: 20
Registriert: Dienstag 28. Januar 2020, 18:20

Untenstehender Code ist nur ein unvollständiger Anfang. Ich brauche mehrere Zeilen mit mehreren Eingabefeldern. Die Felder jeder Zeile gehören zusammen und sind als Liste gespeichert. Aktiv momentan nur die erste Zeile.

Code: Alles auswählen

# Formular zum Erstellen und Ändern der CAN Knoten Konfiguration
# created 06.09.2024 by Rainer Müller-Knoche
from dataclasses import field
from tkinter import *

# byte 0,1
address_fields = 'nodeID', 'groupID'
# byte 2-4
config_fields = 'type', 'port_1', 'port_2'
# 5-10 click, 11-16 double click, 17-22 long click, 23-28 while click n/a
function_fields = 'clickType', 'targetID', 'targetGID', 'targetPort', 'targetAction', 'sourceGID'
# 29-55 Taster 2, 56-82 Taster 3, 83-109 Taster 4

# def fetch

def makeform(root, fields):
    entries = []
    for field in fields:
        row = Frame(root)
        lab = Label(row, width=2, text=field, anchor='w')
        ent = Entry(row)
        row.pack(side=TOP, fill=X, padx=5, pady=5)
        lab.pack(side=LEFT)
        ent.pack(side=RIGHT, expand=YES, fill=X)
        entries.append((field, ent))
    return entries


if __name__ == '__main__':
    root = Tk()
    ents = makeform(root, address_fields)
 # root.bind('<Return>', (lambda event, e=ents:))
    b1 = Button(root, text='Show')
    b1.pack(side=LEFT, padx=5, pady=5)
    b2 = Button(root, text='Quit', command=root.quit)
    b2.pack(side=LEFT, padx=5,pady=5)
    root.mainloop()


So werden es aber zwei Zeilen, wie bekomme ich es hin, dass es nur eine Zeile je Liste wird.
Danke

Gruß

Rainer
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

*-Importe benutzt man nicht, weil man damit unkontrolliert Namen in den eigenen Namensraum lädt.
Konstanten werden nach Konvention komplett GROSS geschrieben
6 Eingabefelder in einer Zeile werden ein bißchen viel. Vielleicht überdenkst Du Deine Idee nocheinmal.
Wenn Du alles ein einer Zeile haben möchtest, darfst Du auch nur einen row-Frame erzeugen.
Das Hauptprogramm steht in einer Funktion.
Man benutzt keine kryptischen Abkürzungen, Variablennamend dürfen mehr als 3 Buchstaben haben.

Code: Alles auswählen

import tkinter as tk

# byte 0,1
ADDRESS_FIELDS = 'nodeID', 'groupID'
# byte 2-4
CONFIG_FIELDS = 'type', 'port_1', 'port_2'
# 5-10 click, 11-16 double click, 17-22 long click, 23-28 while click n/a
FUNCTION_FIELDS = 'clickType', 'targetID', 'targetGID', 'targetPort', 'targetAction', 'sourceGID'
# 29-55 Taster 2, 56-82 Taster 3, 83-109 Taster 4


def makeform(root, fields):
    entries = []
    row = tk.Frame(root)
    row.pack(fill=tk.X, padx=5, pady=5)
    for field in fields:
        tk.Label(row, width=2, text=field, anchor=tk.W).pack(side=tk.LEFT)
        entry = tk.Entry(row)
        entry.pack(side=tk.LEFT, expand=tk.YES, fill=tk.X)
        entries.append((field, entry))
    return entries

def main():
    root = tk.Tk()
    address_fields = makeform(root, ADDRESS_FIELDS)
    config_fields = makeform(root, CONFIG_FIELDS)
    function_fields = makeform(root, FUNCTION_FIELDS)
    b1 = tk.Button(root, text='Show')
    b1.pack(side=tk.LEFT, padx=5, pady=5)
    b2 = tk.Button(root, text='Quit', command=root.quit)
    b2.pack(side=tk.LEFT, padx=5,pady=5)
    root.mainloop()

if __name__ == '__main__':
    main()
muekno
User
Beiträge: 20
Registriert: Dienstag 28. Januar 2020, 18:20

Erst mal vielen Dank für die Antwort. Sorry ich bin fast blutiger Python Anfänger. Der Code basiert auf einem Beispiel aus einem Tutorial oder Kurs, müsste nochmal raussuchen woher. Da war das so geschrieben. Aber Danke für die Hinweise, werde mich in Zukunft daran halten.
Das mit den 6 Feldern ist schon OK, ausser in der ersten Zeile können die Inhalte nur per DropDown Liste gewählt werden, eine manuelle Eingabe wird nicht möglich sein. Ausgewertet, werden dann die Indizes die dem endgültigen Wert entsprechen.
Sinn ist damit eine große Konfigurationstabelle zu erstellen (ca. 160 Byte), wobei jedes Byte eine bestimmte Funktion/Einstellung bedeutet.
Ein Arduino Programm wird dann entsprechend der Tabelle gesteuert. Letzteres ist vorhanden und funktioniert seit 5 Jahren 1A. Allerdings ist das händische Pflegen der Tabellen (mehrere für mehrere Arduinos) lästig. Diese Arbeit will ich mir damit vereinfachen. D.h. in der endgültigen Form, will ich eine vorhandene Tabelle einlesen, die Werte lesbar anzeigen, notfalls anpassen und wieder speichern.

Dabei noch eine Frage, wie kann ich die Größe Label Felder bzw. der Eingabefelder begrenzen.

Gruß

Rainer
Antworten