Vorlage für Comboboxen

Fragen zu Tkinter.
Antworten
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

Hallo Ihr Spezialisten da hätte ich noch eine Frage:
Ich brauche 45 Comboboxen. Gibts da eine Möglichkeit eine Vorlage zu haben,
für z.B.: Die Breite ist immer gleich, die Höhe und Breite ist immer gleich.
Ich hab das mit "class" versucht, eine Combobox geht aber nicht mehrere.
Könnte ihr mir da bitte mit einer Vorlage helfen. Danke im Voraus.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Eine Klasse ist schon die Antwort. Wenn das bei dir nicht geht, muss du zeigen, was du versucht hast.
EmilEmilchen
User
Beiträge: 10
Registriert: Freitag 23. Oktober 2020, 12:20

STR + A, STR + C, STR + V?
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hoffentlich nicht. DRY ist ein recht wichtiges Prinzip...
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

Das ist mein Versuch der class kombo:

meter = ("1,00", "2,00")

class kombo:
def __init__(self, master):
self.mybox = ttk.Combobox(master, width="10")
self.mybox.set("1,00")
self.mybox.place(x=160, y=3)


Der Aufruf:
kombo01 = kombo(root)

Ein Combobox wird auch angezeigt. Aber wie zeige ich weitere an,
auf einem anderen Platz.

Bitte um weiter Hilfe Danke.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das aus verschiedenen Aspekten heraus falsch. Du solltest Kombo (grosses K) von Combobox *ableiten*. Und die kann ihre Breite und was weiss ich nicht setzen, aber was sie niemals machen darf ist sich selbst zu platzieren. Das macht man von aussen drumrum. Womit dann auch die Frage nach der Platzierung geklaert ist.

place benutzt man eh nicht, weil das unflexibel und anfaellig bei Aenderungen von Bildschirmaufloesung, Schriftgroessen, Monitor-DPI etc ist. Benutze grid und pack.
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

Danke __deets__ für die guten Ratschläge, aber interessanter wäre es wie es richtig gemacht werden sollte.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist dein Job, den Code zu schreiben. Und ihn gemaess der Empfehlungen eben anzupassen. Es ist dein 5000 Zeilen Programm, nicht meines.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Lass so unsinnige Präfixe wie my am besten von Anfang an weg.
Du brauchst keine Klasse, sondern eine Schleife:

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk

def main():
    root = tk.Tk()
    for index in range(48):
        row, column = divmod(index, 4)
        box = ttk.Combobox(root, width=10)
        box.set("1,00")
        box.grid(row=row, column=column)
    root.mainloop()

if __name__ == "__main__":
    main()
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

Hallo Sirius, danke für deinen Vorschlag es mit einer Schleife zu machen. Nachstehend ein paar Infos zu dem Programm: Es stehen halt nicht alle Comboboxen gleich untereinander. Es gibt halt einmal 6 Comboboxen, dann gibts einen Frame für Summen, dann gibts z.B.: wieder 4 Comboboxen und einen Frame mit Summen. Das alles in einem Notebook mit 6 Seiten. Ich war der Meinung mit der class ich könnte mir einige Codezeilen ersparen, aber das scheint nicht so zu sein. Danke nochmal für das Interesse.

__deets__ Dein Überheblichen Kommentare könnte man eventuell etwas reduzieren, weil was mein Job ist weis ich schon selbst. Und mit einigen deiner Empfehlungen bin ich nicht auch nicht einverstanden und ob ich Kombobox groß oder klein schreibe löst nicht meine Frage. Trotzdem nochmal Dankeschön für dein Interesse.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man kann so manches hier reduzieren. ZB auch anmassenden Forderungen nach Code basierend auf lueckenhaften Problembeschreibungen. Oder selbstherrliche Ignoranz etablierter Konventionen, die es anderen einfacher machen, einem zu helfen.

Mal schauen, welcher von unseren jeweiligen Wuenschen zu erst eintritt.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@ossi047: man kann Dir halt nur helfen, wenn man weiß, was Du brauchst. Aus Deinen Beschreibungen werde ich nicht wirklich schlau. Was Du mit einem Notebook mit 6 Seiten meinst ??? Hilfreich wäre z.B. Code, der das Fenster erzeugt, das Du Dir wüsnchst, und dann kann man daran diskutieren, wie man es besser machen könnte.

Sobald Du nicht mehr alleine bist, und das bist Du sofort, wenn Du Dich hier im Forum bewegst, muß man sich an Konventionen halten, denn das beugt Mißverständnissen vor. Jeder Verbesserungsvorschlag hat seinen Sinn, wenn Du ihn nicht verstehst, dann frage nach. Man kann auch manche Punkte diskutieren (mit Argumenten). Wer hier im Forum fragt, sollte den Willen haben, etwas zu lernen.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: Notebook mit 6 Seiten wird ein `ttk.Notebook` mit 6 Tabs meinen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

Hallo __deets__
Was ich mit so einer Aussage anfangen: "Das aus verschiedenen Aspekten heraus falsch." Was kann mir diese Aussage helfen: "Du solltest Kombo (grosses K) von Combobox *ableiten*." Die Breite einer Combobox kann man sehr wohl bestimmen " Und die kann ihre Breite und was weiss ich nicht setzen" Was soll ich mit dieser Aussage anfangen " aber was sie niemals machen darf ist sich selbst zu platzieren" Und was macht man jetzt von aussen drumrum?: " Das macht man von aussen drumrum"

Leider kann ich mit solchen Hilfen nichts anfangen, mit solchen Aussagen fühle ich mich eher verarscht!!. Ich habe auch nicht um eine Code ersucht, sondern ein kleiner Gedankenanstoß wie z.B.: von @Sirius3 finde ich super. Ich weis und sehe es auch das Ihr alle sehr bemüht seit den Leuten zu helfen
aber man sollte auch dann nicht vergessen etwas am Boden zu bleiben.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ossi047: Ich kann mit den Frage was Du mit den Fragen anfangen sollst nicht so wirklich viel Anfangen. Wenn Dir jemand sagt das ist aus verschiedenen Aspekten heraus falsch, dann ist das halt die Information das Du da was ändern musst. Und nicht nur eine Sache, sondern mehrere. Das sagt dieser Satz aus.

Im zweiten Satz wird auf die Schreibweise von Klassen hingewiesen und das man da eher von Combobox ableitet statt eine Combobox in einer eigenen Klasse zu verpacken.

Widgets platzieren sich nicht selbst. Das macht kein Widget das es schon fertig in `tkinter` gibt, also sollte man bei eigenen Ableitungen (oder Wrappern) nicht damit anfangen. Unter anderem weil Du ja selbst bemerkt hast, dass es dadurch nicht wirklich wiederverwendbar ist wenn die Klasse selbst schon ihren Platz in der GUI festlegen will.

Letztlich macht aber auch das Ableiten von Combobox hier nicht so wirklich viel Sinn, denn da passiert in diesem Fall ja nichts was man nicht auch mit einer einfachen Funktion erreichen könnte, die ein `Combobox`-Objekt erstellt und entsprechend konfiguriert. Folgendes würde das vergleichbares ohne eine Klasse machen:

Code: Alles auswählen

...

def create_combobox(master):
    box = ttk.Combobox(master, width=10)
    box.set("1,00")
    box.place(x=160, y=3)
    return box


def main():
    ...
    box = create_combobox(root)
Wobei ja schon gesagt wurde das man `place()` nicht verwendet. Und auch `kombo01` lässt die Alarmglocken leuten, denn Namen nummerieren ist auch nicht das gelbe vom Ei.

Notebook mit 6 Seiten und 5000 Zeilen Code, mit nummerierten Namen und `place()` klingt alles ziemlich falsch. Du solltest keine kleinen Detailverbesserungen suchen, sondern mal das Grundproblem komplett darlegen. Ich vermute der gesamte Ansatz das lösen ist bisher eher suboptimal.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

Hallo __blackjack__ danke für deine informative Antwort. Grundsätzlich möchte ich ein sehr spezifisches Programm für eine Branche machen. Es sollen eben viele Auswahlmöglichkeiten von Dimensionen, Mengen und Type vorhanden sein, welche ich mit den Comboboxen lösen möchte. Nach der Auswahl der Daten gibts dann Rechenprogramme welche die Auswahlen berechnen auf Type und Längen summiert und danach die ausgewählten Artikel speichere ich in eine Sqlite Datenbank. Viele Rechenvorgänge habe ich schon als Funktionen definiert in einem eigenen Modul. Was an und für sich funktioniert. Die Überlegung war eben weil es viele Comboboxen werden können habe ich diese in einem ttk.Notebook auf mehreren Tabs unterteilt. Daher auch place, weil ich eine bestimmte Größe einhalten möchte. Die Überlegung war einfach mit der Klasse, sich ev. Programmzeilen zu ersparen (wie z.B.: bei Funktionen) um etwas Übersicht zu bekommen da ich jetzt bei dem kleineren Programm bereits so ca. 120 Comboboxen verwenden werde. Ich bedanke mich für Deinen Vorschlag und werde das auch so machen. Da ich halt noch nicht so lange Programmiere sind mir halt so spezielle Ausdrücke wie " aber was sie niemals machen darf ist sich selbst zu platzieren" leider nichts anfangen. Danke nochmals für Dein Verständnis.
Antworten