因此,我正在使用包含 DateEntry 的最小应用程序,但是我无法在正确的位置对小部件进行网格化,它应该打包在包含其他输入的容器内,但实际上它已在页面底部网格化.
下面是视图的实际代码。我不明白为什么会这样,但我认为这可能与我继承的 DateEntry 类有关class MyDateEntry(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')
谢谢!
解决方案
感谢@jasonharper,他对解决方案发表了评论,引用如下:
DateEntry.__init__(self, master=None, **kw)
- 您正在丢弃传递给您的类的主参数,而是显式地将 None 传递给超类(使小部件成为根窗口的子窗口)。>
所以我只是删除了=None
frommaster=None
并且正确的框架作为参数传递。
谢谢@jasonharper!