Calendar und SpinTimePickerModern lassen sich nicht mit dem Geometriemanager Grid platzieren

Fragen zu Tkinter.
Antworten
NinoBaumann
User
Beiträge: 77
Registriert: Samstag 25. April 2020, 19:03

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()
Sirius3
User
Beiträge: 18054
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
NinoBaumann
User
Beiträge: 77
Registriert: Samstag 25. April 2020, 19:03

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.
Antworten