Combo anderen Wert als in der Auswahliste speichern

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

OK also Combox funktioniert, das ist soweit klar.

Beispiel, in einer readonly combobox gibt es aus Auswahl 'vor', 'zurück', 'stop' als Möglichkeiten, die stehen da je nachdem was ausgewählt ist auch im Eingabefeld. Die Eingaben sollen später in eine Datei geschrieben werden, welch dann ausgewertet wird. Für die spätere Auswertung, kann ich aber mit Text/String wenig anfangen, da in der Datei nur je Eingabefeld (über 160) nur ein Byte steht.
D.h. also in dem Byte das vor, zurück, stop hat steht z.B. für stop 0x00, für vor z.B. 0x02, für zurück. Das wäre ja noch über den Index zu lösen. An anderer Stelle gibt es z.B. links, mitte, rechts, bzw. leer und leer = 0x0, links = 0x01, mitte = 0x02, rechts = 0x04

so soll z.B.
Label text='Richtung'
Eingabefeld byte_56 bei Auswahl vor nicht 'vor' sondern 0x01 enthalten, angezeigt werden soll aber vor.
Dann könnte wenn alles ausgefüllt ist in einer Schleife die Werte von byte_0 bis byte_166 auslesen und in die Datei abspeichern.

Die Datei und alles dahinter steht schon, da will und kann ich nicht mehr ändern, ist ein größeres SmartHome Projekt im Produktiveinsatz.
Aktuell sieht die Datei z.B. so aus 0x05,0x22,0x2f, ....., beim Hochladen wird das dann ausgewertet und der jeweilige Binärwert in den EProm geschrieben.

Natürlich könnte ich die Strings der einzelnen Eingabewert auch beim auslesen entsprechend ihres Inhalts umwandeln, aber das gibt eine Abfrageorgie. Elegant wäre es eben den internen hex Wert gleich der Combobox mitzugeben.

Momentan sieht das so aus, Formatierung passt noch nicht.

Code: Alles auswählen

# Formular zum Erstellen und Ändern der CAN Knoten Konfiguration
# created 06.09.2024 by Rainer Müller-Knoche
import tkinter as tk
# nächste Zeile  ?
from tkinter.ttk import Label
from email.policy import default
from tkinter import messagebox, ttk


# großer Font
LARGE = 18
# byte 0,1
ADDRESS_FIELDS = 'node_ID', 'group_ID'
# 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 = 'click_Type', 'target_ID', 'target_GID', 'target_Port', 'target_Action', 'source_GID'
# 29-55 Taster 2, 56-82 Taster 3, 83-109 Taster 4

TYPE_TYPES = '1 Push n_o', '2 rev. Push n_c', '4 Switch n_o', '8 uSwitch', '16 tSwitch', '32 ptSwitch'
PORT_VALUES = '1 inPort 1', '2 inPort 2'	# ob das schon passt
ACTIVE_TYPES  = 'inactiv', 'activ'

def type_and_port():
	# loop mit Liste
	value_select(TYPE_TYPES, 'Typ',0)		# Taster ist default
	value_select(PORT_VALUES, 'Port 1',1)
	value_select(PORT_VALUES, 'Port 2',0)


def value_select(select_list,label_text,default_select):
	label = ttk.Label(text=label_text, width=10,  anchor=tk.W).pack(side=tk.LEFT)
	label_text = tk.Entry
	combo = ttk.Combobox(
		state="readonly",
		values=select_list
	)
	combo.set(select_list[default_select])
	combo.pack()
#	entries.append((label, label_text))



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=10, text=field, anchor=tk.W).pack(side=tk.LEFT)
		entry = tk.Entry(row, width=10)
		entry.pack(side=tk.LEFT, expand=tk.YES, fill=tk.X)
		entries.append((field, entry))

def printLabel(root, hinweis, attrib_color='white', attrib_size=12 ):
	Hinweis = tk.Label(root, text=hinweis, anchor='w',  fg=attrib_color, font=("Arial",attrib_size))
	Hinweis.pack()

def main():
	root = tk.Tk()
	root.title('CAN_Config')
	# Text + Felder Adressen
	printLabel(root, 'Byte 0,1 Node ID und Group ID eingeben', attrib_color='yellow')
	makeform(root, ADDRESS_FIELDS)
	# Start Taster 1
	printLabel(root,'Taster 1', "red", attrib_size=LARGE)
	printLabel(root,'Byte 2-4 Typ, Port 1, opt Port 2')

	type_and_port()		#



	#    makeform(root, CONFIG_FIELDS)
	#    printLabel(root,'Byte 5-10 Funktion Click')
	#    makeform(root, FUNCTION_FIELDS)
	#    printLabel(root,'Byte 11-16 Funktion doppel click')
	#    makeform(root, FUNCTION_FIELDS)
	#    printLabel(root,'Byte 17-22 Funktion langer  Click')
	#    makeform(root, FUNCTION_FIELDS)
	#    printLabel(root,'Byte 23-28 reserverd while Click')
	#    makeform(root, FUNCTION_FIELDS)
	root.mainloop()

if __name__ == '__main__':
	main()
Benutzeravatar
Dennis89
User
Beiträge: 1551
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

bin mir nicht sicher ob ich dich richtig verstanden habe, aber das gibt keine Abfrageorgie, wenn du den Namen der angezeigt werden soll als Schlüssel und den zugehörigen Byte-Wert als Wert in ein Wörterbuch schreibst.

Code: Alles auswählen

#!/usr/bin/env python

import tkinter as tk
from functools import partial
from tkinter import ttk

CHOICE_TO_VALUE = {"Vor": 0x02, "Stop": 0x00, "Rechts": 0x04}


def update_label(label, combo_box, event):
    label.config(text=f"Gewählt: {CHOICE_TO_VALUE[combo_box.get()]}")


def main():
    window = tk.Tk()
    combo_box = ttk.Combobox(
        window, values=list(CHOICE_TO_VALUE.keys()), state="readonly"
    )
    combo_box.grid(row=0, column=0)
    label = ttk.Label(window, text="Gewählt:")
    label.grid(row=0, column=1)
    combo_box.bind("<<ComboboxSelected>>", partial(update_label, label, combo_box))
    window.mainloop()


if __name__ == "__main__":
    main()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten