Ich möchte die drei Combobox über eine Filterfunktion aus dem sqlite füllen.
Ich stoße aber programmiertechnisch an meine Grenzen.
Das auslesen der sqlite-DB versuche ich über eine Klasse zu lösen. Ob das sinn macht, sei mal noch in Frage gestellt. ich weiß es nicht.
Für mich ist erst mal klar, ich weiß so ungefähr und rudimentär was man mit einer Klasse machen kann.
Ich möchte nach einander die Combobox Hersteller, Model, Polpaare über die sqlite füllen.
Könnt ihr mich in die richtige Richtung schieben?
Wie kann ich aus den einzelnen Boxen die Variablen rüber schaufeln ohne das ich die Fehlermeldung bekomme, das die aufgerufenen Variable oder Funktion unbekannt ist.
Ich hab hier wahrscheinlich einen extrem fehlerhaften Aufbau in meinen Code.
Es müssen ja die StringVar() der einzelnen Combobox gesetz werden und mit .get() ausgelesen werden. Aber wie?
Code: Alles auswählen
from tkinter import SUNKEN, Frame, Menu, Toplevel,Label,Entry, W, messagebox, ttk, StringVar
import pyudev
import serial,sqlite3
from ttkthemes import ThemedTk
import sick_error, sick_device
verbindung = sqlite3.connect("servo.db", timeout=10)
db_abfrage = verbindung.cursor()
class Datenbank():
def __init__(self, motorhersteller_combo, motormodel_combo, motor_polpaare_combo):
self.motorhersteller_combo = motorhersteller_combo
self.motormodel_combo = motormodel_combo
self.motor_polpaare_combo = motor_polpaare_combo
def motorhersteller_sqlite(self):
try:
db_abfrage.execute("SELECT DISTINCT motorhersteller FROM motor_table")
self.motorhersteller_combo['values'] = db_abfrage.fetchall()
self.motormodel_sqlite()
except verbindung.DatabaseError as error:
print(error)
def motormodel_sqlite(self):
try:
db_abfrage.execute("SELECT DISTINCT motormodel FROM motor_table WHERE motorhersteller = " + self.motorhersteller_combo.get() )
self.motormodel_combo['values'] = db_abfrage.fetchall()
except verbindung.DatabaseError as error:
print(error)
def motor_polpaare_sqlite(self):
try:
db_abfrage.execute("SELECT DISTINCT motorpolpaare FROM motor_table WHERE motorhersteller = " + self.motormodel_combo.get())
self.motor_polpaare_combo['values'] = db_abfrage.fetchall()
except verbindung.DatabaseError as error:
print(error)
#self.motorhersteller_combo.after(1,self.motorhersteller_sqlite)
BACKGROUND_COLOR = "white"
NOTEBOOK_BACKGROUND_COLOR = "white"
def create_hyperface_window():
window = Toplevel()
window.title("Hyperface")
window.geometry("800x200")
xpos = 100
ypos = 150
window.geometry("+%d+%d" % (xpos, ypos))
menu = Menu(window)
window.config(menu=menu)
window_menu = Menu(menu)
menu.add_cascade(label="Datei", menu=window_menu)
window_menu.add_command(label="Beenden", command=window.destroy)
def opengeberfenster():
print("test")
def create_resolver_window():
window = Toplevel()
window.title("Resolver")
window.geometry("800x200")
xpos = 120
ypos = 170
window.geometry("+%d+%d" % (xpos, ypos))
menu = Menu(window)
window.config(menu=menu)
window_menu = Menu(menu)
menu.add_cascade(label="Datei", menu=window_menu)
window_menu.add_command(label="Beenden", command=window.destroy)
info_frame = Frame(window, borderwidth=1, relief=SUNKEN)
info_frame.grid(column=0, row=0, sticky=W, padx=2, pady=2)
reset_frame = Frame(window, borderwidth=1, relief=SUNKEN)
reset_frame.grid(column=0, row=1, sticky=W, padx=2, pady=2)
def create_endat_analog_window():
window = Toplevel()
window.title("Endat analog")
window.geometry("800x200")
xpos = 140
ypos = 190
window.geometry("+%d+%d" % (xpos, ypos))
menu = Menu(window)
window.config(menu=menu)
window_menu = Menu(menu)
menu.add_cascade(label="Datei", menu=window_menu)
window_menu.add_command(label="Beenden", command=window.destroy)
info_frame = Frame(window, borderwidth=1, relief=SUNKEN)
info_frame.grid(column=0, row=0, sticky=W, padx=2, pady=2)
reset_frame = Frame(window, borderwidth=1, relief=SUNKEN)
reset_frame.grid(column=0, row=1, sticky=W, padx=2, pady=2)
def create_endat_digital_window():
window = Toplevel()
window.title("Endat analog")
window.geometry("800x200")
xpos = 150
ypos = 200
window.geometry("+%d+%d" % (xpos, ypos))
menu = Menu(window)
window.config(menu=menu)
window_menu = Menu(menu)
menu.add_cascade(label="Datei", menu=window_menu)
window_menu.add_command(label="Beenden", command=window.destroy)
info_frame = Frame(window, borderwidth=1, relief=SUNKEN)
info_frame.grid(column=0, row=0, sticky=W, padx=2, pady=2)
reset_frame = Frame(window, borderwidth=1, relief=SUNKEN)
reset_frame.grid(column=0, row=1, sticky=W, padx=2, pady=2)
def create_analog_window():
window = Toplevel()
window.title("Analog")
window.geometry("800x200")
xpos = 180
ypos = 230
window.geometry("+%d+%d" % (xpos, ypos))
menu = Menu(window)
window.config(menu=menu)
window_menu = Menu(menu)
menu.add_cascade(label="Datei", menu=window_menu)
window_menu.add_command(label="Beenden", command=window.destroy)
info_frame = Frame(window, borderwidth=1, relief=SUNKEN)
info_frame.grid(column=0, row=0, sticky=W, padx=2, pady=2)
reset_frame = Frame(window, borderwidth=1, relief=SUNKEN)
reset_frame.grid(column=0, row=1, sticky=W, padx=2, pady=2)
def create_rs485_window():
window = Toplevel()
window.title("Endat digital")
window.geometry("800x200")
xpos = 210
ypos = 230
window.geometry("+%d+%d" % (xpos, ypos))
menu = Menu(window)
window.config(menu=menu)
window_menu = Menu(menu)
menu.add_cascade(label="Datei", menu=window_menu)
window_menu.add_command(label="Beenden", command=window.destroy)
info_frame = Frame(window, borderwidth=1, relief=SUNKEN)
info_frame.grid(column=0, row=0, sticky=W, padx=2, pady=2)
reset_frame = Frame(window, borderwidth=1, relief=SUNKEN)
reset_frame.grid(column=0, row=1, sticky=W, padx=2, pady=2)
def main():
for device in pyudev.Context().list_devices(
subsystem="tty", ID_VENDOR_ID="0403"
):
print(device.device_node)
if device.device_node:
try:
with serial.Serial(
device.device_node, parity=serial.PARITY_EVEN, timeout=3
) as connection:
root = ThemedTk(theme="blue")
root.title(f"Servo-Box Version 1 {connection.port}")
root.config(bg=BACKGROUND_COLOR)
#root.attributes("-zoomed", True)
root.geometry("800x800")
XPOS = 50
YPOS = 15
root.geometry("+%d+%d" % (XPOS, YPOS))
menu = Menu(root)
root.config(menu=menu)
file_menu = Menu(menu)
geber_menu = Menu(menu)
messung_menu = Menu(menu)
info_menu = Menu(menu)
menu.add_cascade(label="Datei", menu=file_menu)
file_menu.add_command(
label="Beenden", command=root.destroy
)
menu.add_cascade(label="Geber", menu=geber_menu)
geber_menu.add_command(
label="Hyperface", command=create_hyperface_window
)
geber_menu.add_command(
label="Resolver", command=create_resolver_window
)
geber_menu.add_command(
label="Endat analog", command=create_endat_analog_window
)
geber_menu.add_command(
label="Endat digital", command=create_endat_digital_window
)
menu.add_cascade(
label="Data", menu=messung_menu
)
messung_menu.add_command(
label="Analog", command=create_analog_window
)
messung_menu.add_command(
label="RS485", command=create_rs485_window
)
menu.add_cascade(label="Info", menu=info_menu)
info_menu.add_command(
label=f"Schnittstelle : {connection.port}"
)
projekt_label = Label(root, text="Projekt",bg=BACKGROUND_COLOR)
projekt_label.grid(column=0, row=0,padx=2,pady=2, sticky='W')
projekt = Entry(root)
projekt.grid(column=1, row=0,padx=2,pady=2 )
motorhersteller_label=Label(root, text="Motor - Hersteller",bg=BACKGROUND_COLOR)
motorhersteller_label.grid(column=0, row=1,padx=2,pady=2 , sticky='W')
motorhersteller = StringVar()
motorhersteller_combo = ttk.Combobox(root,
state="readonly",
textvariable= motorhersteller
)
motorhersteller_combo.grid(column=1, row=1,padx=2,pady=2, sticky='E' )
motormodel_label=Label(root, text="Motor - Model" ,bg=BACKGROUND_COLOR)
motormodel_label.grid(column=0, row=2,padx=1,pady=2 , sticky='W')
motormodel_combo = ttk.Combobox(root,
state="readonly"
)
motormodel_combo.grid(column=1, row=2,padx=2,pady=2, sticky='E' )
motor_polpaare=Label(root, text="Polpaare",bg=BACKGROUND_COLOR)
motor_polpaare.grid(column=0, row=3,padx=1,pady=2 , sticky='W' )
motor_polpaare_combo = ttk.Combobox(root,
state="readonly"
)
motor_polpaare_combo.grid(column=1, row=3,padx=2,pady=2 , sticky='E')
datenbank = Datenbank(motorhersteller_combo, motormodel_combo, motor_polpaare_combo)
datenbank.motorhersteller_sqlite()
root.mainloop()
break
except serial.SerialException as error:
messagebox.showerror(
"Fehler", f"{device.device_node}:\n{error}."
)
else:
messagebox.showerror(
"Beenden",
(
"Keine Schnittstelle/kein Gerät vorhanden.\n"
"Bitte Anlage überprüfen und Programm neu starten."
),
)
if __name__ == "__main__":
main()
