【问题标题】:Tkinter Calendar doesn't grid at the right placeTkinter 日历没有在正确的位置网格化
【发布时间】:2021-07-17 21:12:29
【问题描述】:

所以我正在使用包含 DateEntry 的最小应用程序,但我无法在正确的位置网格化小部件,它应该被打包在包含其他输入的容器内,但实际上它在底部被网格化页面。

下面是视图的实际代码。我不明白为什么会这样,但我认为这可能与我在 class MyDateEntry(DateEntry) 中继承的 DateEntry 类有关。

import tkinter as tk
from tkinter import ttk
from tkcalendar import DateEntry
from datetime import date


class View(tk.Tk):
    PAD = 10

    LABELS_LIST = [
        'Selecione o estado: ',
        'Digite o municipio: ', 
        'Selecione o dia: ',
        'Digite a temperatura máxima: ',
        'Digite a temperatura minima: '
    ]

    STATE_LIST = [
        'AC',
        'AL',
        'AP',
        'AM',
        'BA',
        'CE',
        'DF',
        'ES',
        'GO',
        'MA',
        'MT',
        'MS',
        'MG',
        'PA',
        'PB',
        'PR',
        'PE',
        'PI',
        'RJ',
        'RN',
        'RS',
        'RO',
        'RR',
        'SC',
        'SP',
        'SE',
        'TO'
    ]

    def __init__(self, controller):
        super().__init__()
        self.controller = controller
        self.title('EToCalc1.0')
        self.temp_max_var = tk.StringVar()
        self.temp_min_var = tk.StringVar()
        self._change_style()
        self._make_main_frm()
        self._make_labels()
        self._make_combobox_state()
        self._make_city_entry()
        self._make_calendar()
        self._make_max_temp_entry()

    def main(self):
        self.mainloop()

    def _make_main_frm(self):
        self.main_frm = ttk.Frame(self)
        self.main_frm.pack(padx=self.PAD, pady=self.PAD)

    def _make_city_entry(self):
        frm = ttk.Frame(self.outer_frm)
        frm.grid()
        self.city_entry = ttk.Entry(frm)
        self.city_entry.pack(pady=self.PAD, padx=self.PAD)

    def _make_calendar(self):
        frm = ttk.Frame(self.outer_frm)
        frm.grid()
        self.de = MyDateEntry(frm)
        self.de.pack(pady=self.PAD, padx=self.PAD)

    def _change_style(self):
        style = ttk.Style(self)
        style.theme_use('clam')

    def _make_labels(self):
        frm = ttk.Frame(self.main_frm)
        frm.grid(row=0,column=0)
        i = 0
        for item in self.LABELS_LIST:
            label = ttk.Label(frm, text=item)
            label.grid(row=i, column=0, padx=self.PAD,pady=self.PAD)
            i += 1

    def _make_combobox_state(self):
        self.outer_frm = ttk.Frame(self.main_frm)
        self.outer_frm.grid(row=0, column=1)
        frm = ttk.Frame(self.outer_frm)
        frm.grid()
        self.state_combobox = ttk.Combobox(frm, values=self.STATE_LIST)
        self.state_combobox.pack(pady=self.PAD, padx=self.PAD)
        self.state_combobox.set(value='Escolha um estado')

    def _make_max_temp_entry(self):
        frm = ttk.Frame(self.outer_frm)
        frm.grid()
        temp_max_entry = ttk.Entry(frm, textvariable=self.temp_max_var)
        temp_min_entry = ttk.Entry(frm, textvariable=self.temp_min_var)
        temp_max_entry.pack(padx=self.PAD, pady=self.PAD)
        temp_min_entry.pack(padx=self.PAD, pady=self.PAD)
        


class MyDateEntry(DateEntry):
    def __init__(self, master=None, **kw):
        DateEntry.__init__(self, master=None, **kw)
        # add black border around drop-down calendar
        self._top_cal.configure(bg='black', bd=1)
        # add label displaying today's date below
        tk.Label(self._top_cal, bg='gray90', anchor='w',
            text='Hoje: %s' % date.today().strftime('%d/%m/%Y')).pack(fill='x')

There's the printscreen of the window, note that the DateEntry is at the bottom

谢谢!

解决方案

感谢@jasonharper 对解决方案的评论,如引用:

DateEntry.__init__(self, master=None, **kw) - 您正在丢弃传递给您的类的主参数,而是显式地将 None 传递给超类(使小部件成为根窗口的子窗口)。>

所以我刚刚从master=None 中删除了=None,并且正确的帧作为参数传递。

谢谢@jasonharper!

【问题讨论】:

  • DateEntry.__init__(self, master=None, **kw) - 您正在丢弃传递给您的类的master 参数,而是显式地将None 传递给超类(使小部件成为根窗口的子窗口)。
  • 谢谢@jasonharper,刚刚从def __init__(self, master=None, **kw)DateEntry.__init__(self, master=None, **kw) 中删除了=None

标签: python tkinter tkcalendar


【解决方案1】:

在这行代码中,您使用master=None 明确强制小部件位于根窗口中:

DateEntry.__init__(self, master=None, **kw)

相反,您应该传入调用者传入的 master 的值:

DateEntry.__init__(self, master, **kw)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多