Seite 1 von 1

Calendar und SpinTimePickerModern lassen sich nicht mit dem Geometriemanager Grid platzieren

Verfasst: Donnerstag 21. März 2024, 11:11
von NinoBaumann
Hallo,

ich möchte mir hier einen DateTime-Picker basteln und versuche gerade sowohl den Kalender, als auch die Uhr in ein Frame zu packen. Beides lässt sich auch problemlos mit grid positionieren. Wenn ich jedoch ein Label darin ebenfalls mit grid platzieren möchte, sind die beiden Objekte dann übereinander (siehe Bild). Woran lieg das und wie behebe ich das Problem?

Bild

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk
from tktimepicker import SpinTimePickerModern
from tktimepicker import constants
from tkcalendar import Calendar


class Date_Time_Picker(ttk.Frame):
    def __init__(self, container, name):
        super().__init__(container)
        
        self.name = name
        self.__create_widgets(self.name)

    def __create_widgets(self, name):
        
        self.name = name
        self.header = ttk.Label(text=self.name)
        self.header.grid(row=0, column=0)
        
        self.time_picker = SpinTimePickerModern(self)
        self.time_picker.addAll(constants.HOURS24)  # adds hours clock, minutes and period
        self.time_picker.configureAll(bg="#404040",
                                      height=1, fg="#ffffff",
                                      font=("Times", 16),
                                      hoverbg="#404040",
                                      hovercolor="#d73333",
                                      clickedbg="#2e2d2d",
                                      clickedcolor="#d73333")
        self.time_picker.configure_separator(bg="#404040",
                                             fg="#ffffff")
        self.time_picker.grid(row=1, column=0)
        
        self.cal = Calendar(self,
                            selectmode = 'day',
                            year = 2020, 
                            month = 5,
                            day = 22)
        self.cal.grid(row=2, column=0)
        
        for widget in self.winfo_children():
            widget.grid(padx=5, pady=5)

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('Replace')
        self.__create_widgets()

    def __create_widgets(self):
        input_frame = Date_Time_Picker(self, 'start')
        input_frame.grid(column=0, row=0)
        
if __name__ == "__main__":
    app = App()
    app.mainloop()

Re: Calendar und SpinTimePickerModern lassen sich nicht mit dem Geometriemanager Grid platzieren

Verfasst: Donnerstag 21. März 2024, 11:43
von Sirius3
In __init__ werden alle Attribute angelegt. Die Methoden __create_widgets sind unnötig. Das führt sonst zu solchen Sachen, dass Du self.name an verschiedenen Stellen setzt.
Das erste Argument von Widgets ist immer das Parent-Widget. Wenn man das nicht angibt, dann wird implizit root angenommen, was man aber nicht nutzen sollte, weil das undurchsichtig ist. Vor allem sollte kein untergeordnetes Widget irgendwas in root platzieren. Das macht dann die Probleme, die Du hier siehst.
Warum setzt Du das Padding auf so komische Weise nachträglich, statt gleich beim ersten Aufruf von grid? Das führt zumindest bei mir auch zu Darstellungsfehlern.

Re: Calendar und SpinTimePickerModern lassen sich nicht mit dem Geometriemanager Grid platzieren

Verfasst: Donnerstag 21. März 2024, 12:50
von NinoBaumann
Hallo Sirius,

danke für die Tipps und Anmerkungen. Werde ich beachten und umsetzen.
Das war natürlich ein doofer Flüchtigkeitsfehler mit dem fehlenden Argument.

VG
Nino

Sirius3 hat geschrieben: Donnerstag 21. März 2024, 11:43 In __init__ werden alle Attribute angelegt. Die Methoden __create_widgets sind unnötig. Das führt sonst zu solchen Sachen, dass Du self.name an verschiedenen Stellen setzt.
Das erste Argument von Widgets ist immer das Parent-Widget. Wenn man das nicht angibt, dann wird implizit root angenommen, was man aber nicht nutzen sollte, weil das undurchsichtig ist. Vor allem sollte kein untergeordnetes Widget irgendwas in root platzieren. Das macht dann die Probleme, die Du hier siehst.
Warum setzt Du das Padding auf so komische Weise nachträglich, statt gleich beim ersten Aufruf von grid? Das führt zumindest bei mir auch zu Darstellungsfehlern.