Tkinter eigenes Grid je Tab, verschiedene Elemente je Tab sinnvoll anordnen.

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
attega
User
Beiträge: 10
Registriert: Samstag 4. April 2015, 22:17

Hallo zusammen,

bin garde dabei ein kleines tkinter Script zu schreiben, welches mit verschiedenen Tabs arbeitet. Gleichzeitig sollen in jedem Tab verschiedene Elemente im grid plaziert werden.
Problem scheint un zu sein, dass das Grid nur einmal für die gesamte GUI zu existieren scheint.
Wenn nun sehr verschiedene Objekte wie z.b. eine Scrollbar oder ein Textfeld in der selben row (also z.B. row 0) angezeigt werden sollen, hab ich das Problem das beide, obwohl in verschiedenen Tabs die selbe Breite bekommen.
Die Scrollbar steht also verlohren im Breiten raum, welchen in einem anderen Tab das Textfeld hat.
Somit sehe ich keine möglichkeit die Elemnte sinnvoll zueinander in den verschiedenen Tabs anzuordnen.

Auch nach etwas Suche hab ich bisher keine Möglichkeit gefunden sozusagen für jedne TAB ein eigenes GRID zu erstellen.
Damit liese sich das Problem einfach lösen. Oder geht man hier eventuell generell ganz anders vor?
Wäre sehr super wenn jemand eine Idee, einen Link oder sonst eine Hilfe zur lösung dieses Problems hätte?

Schöne Grüße und schonmal vielen Dank, Attega
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie hast Du denn die Tabs erzeugt? Ohne Code lässt sich nur sagen, dass Du was falsch machst. Um Widgets flexibel zu positionieren, benutzt man Frames.
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ohne Code kann man nur raten. In diesem Fall versuche ich mal zu raten, dass zumindest bei einigen Widgets vergessen wurde das `master`-Argument anzugeben, oder ein falsches angegeben wurde. Ohne das Argument landen Widgets im Hauptfenster als Container-Widget.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
attega
User
Beiträge: 10
Registriert: Samstag 4. April 2015, 22:17

Wie hast Du denn die Tabs erzeugt? Ohne Code lässt sich nur sagen, dass Du was falsch machst. Um Widgets flexibel zu positionieren, benutzt man Frames.
Ich erzeuge sie mit dem Notebook-Widged, von dem ausgehend mache ich einzelne Frames, wobei jeder Tab ein eigenes Frame ist.
Die darin enthaltenen Widgeds kann ich nach Row/Column anordnen.
-->Problem ist hier das Row/Column der einzelnen Tabs nicht getrennt sind sondern zu ein und dem selben Grid gehören, also über alle Tabs identisch sind.
-->Daher muss die Länge/Breite/Größe aller Elemnente in den Row/Columns in allen Tabs identisch sein, bzw. sonst kommt da keine halbwegs schön formatierte Grafik dabei raus.
Ohne Code kann man nur raten. In diesem Fall versuche ich mal zu raten, dass zumindest bei einigen Widgets vergessen wurde das `master`-Argument anzugeben, oder ein falsches angegeben wurde. Ohne das Argument landen Widgets im Hauptfenster als Container-Widget.
Das Master-Argument wäre hier der entsprechende Tab, oder? Also z.B. Tab1 für Listbox1

Wenn sowas nicht geht, macht es nicht viel Sinn Tabs zu nutzen, also muss es auch eine Lösung geben...
Vielen Dank schonmal für die bisherigen Antworten :)

Code: Alles auswählen

import tkinter as tk
from tkinter import BOTH, END, LEFT
from tkinter import ttk
from tkinter import filedialog

from tkinter import *
import tkinter.messagebox
import tkinter

import sys

ft1=("Arial", 16)

root = tk.Tk()
root.title("Kleinanzeigen-Verwaltungstool")
tabControl = ttk.Notebook(root)
  
tab1 = ttk.Frame(tabControl)
tab2 = ttk.Frame(tabControl)

#----------------------------------------------------------------------------------------------
#-- Everythng in TAB1 - Start ---------------------------------------
#----------------------------------------------------------------------------------------------
Lb1 = Listbox(tab1,width=50, height=30, font=('Times', 14))
Lb2 = Listbox(tab1,width=15, height=30, font=('Times', 14))
Lb3 = Listbox(tab1,width=5, height=30, font=('Times', 14))

Lb1.grid(row=0, column=0)
Lb2.grid(row=0, column=2)
Lb3.grid(row=0, column=3)
scrollbary = tkinter.Scrollbar(tab1)
Lb1.config(yscrollcommand=scrollbary.set)
Lb2.config(yscrollcommand=scrollbary.set)
Lb3.config(yscrollcommand=scrollbary.set)
scrollbary.grid(row=0, column=0,sticky="wns")
#-- Everythng in TAB2 - Start ---------------------------------------
row=0
Anzeige_Titel_LB = tk.Label(tab2,text ='Anzeigenname',font=ft1)
Anzeige_Titel_LB.grid(column=0, row=0)
Anzeigetitel = tk.Entry(tab2,width=80,font=ft1)
Anzeigetitel.grid(column=1, row=0)
Cpy_Artikeltitel = tk.Button(tab2,text="Copy",font=ft1)
Cpy_Artikeltitel.grid(column=2, row=0)

row=row+1
Anz_Beschreibung_LB = tk.Label(tab2,text ='Anzeigenbeschreibung',font=ft1)
Anz_Beschreibung_LB.grid(column=0, row=row)
Anz_Beschreibung = tk.Text(tab2,height=10, width=80,font=ft1)
Anz_Beschreibung.grid(column=1, row=row)
Cpy_Anz_Beschreibung = tk.Button(tab2,text="Copy",font=ft1)
Cpy_Anz_Beschreibung.grid(column=2, row=row)
#-- Everythng in TAB2 - END ---------------------------------------
tabControl.add(tab1, text ='Angelegte-Artikel')
tabControl.add(tab2, text ='Neuer-Artikel')

tabControl.pack(expand = 1, fill ="both")

ttk.Label(tab1, 
          text ="").grid(column = 0, 
                               row = 0,
                               padx = 600,
                               pady = 300)  

 
root.mainloop()
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@attega: Also in `tab1` packst Du *selbst* ganze *drei* Widgets in die Grid-Zelle 0,0. Lass das einfach bleiben und alles wird gut. 🙂

Sonstiges: Von den den folgenden Importen sollte nur der erste stehen bleiben:

Code: Alles auswählen

import tkinter as tk
from tkinter import BOTH, END, LEFT
from tkinter import *
import tkinter
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Jede nicht-triviale GUI benötigt objektorientierte Programmierung (OOP), also das schreiben von eigenen Klassen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Namen sollten keine kryptischen Abkürzungen enthalten oder gar nur daraus bestehen. Der Name soll dem Leser vermitteln was der Wert dahinter im Programm bedeutet, nicht zum rätseln zwingen. Zum Beispiel wofür `lb` stehen mag. Momentan offenbar für `listbox` oder für `label`. `anz` wird von Abkürzern gerne für `anzahl` verwendet. Hier scheint es für `anzeige` zu stehen.
Was war die Idee bei `Cpy_Artikeltitel` und `Cpy_Anz_Beschreibung` das `o` bei `copy` weg zu lassen? "O"s kosten nichts extra. 😉 Wobei die beiden Namen auch nicht nach Anzeigeelementen klingen, denn die sind ja eher ”Dinge” und keine Tätigkeiten. Tätigkeiten verwendet man für Funktions- und Methodennamen.

Man nummeriert keine Namen. Dann will man sich entweder bessere Namen überlegen, oder gar keine Einzelnamen/-werte verwenden, sondern eine Datenstruktur. Oft eine Liste.

Namen sollten nicht zu weit von der Stelle entfernt definiert werden an der sie dann tatsächlich verwendet werden. Also nicht `tab2` definieren, und erst den ganzen Code schreiben der `tab1` befüllt.

Man muss auch nicht alles an einen Namen binden, wenn man da später gar nicht mehr wirklich drauf zugreift.

Die erste Zuweisung an `row` wird nirgends wirklich verwendet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
attega
User
Beiträge: 10
Registriert: Samstag 4. April 2015, 22:17

@attega: Also in `tab1` packst Du *selbst* ganze *drei* Widgets in die Grid-Zelle 0,0. Lass das einfach bleiben und alles wird gut. 🙂

Vielen Dank für die Info, daran lag es tatsächlich :)
Auch vielen Dank für die Anderen Tips zur verständlicheren und besseren Strukturierung und auch die anderen Beiträge 🙂

-->Werde ich demnächst umsetzen, das Programm hat inzwischen 550Zeilen es kommen sicherlich nochmal 100 dazu und dafür sind die ratschläge absolut nützlich 🙂
Antworten