¿Hay alguna manera estándar de que las aplicaciones tkinter le permitan al usuario elegir una fecha?¿Cómo creo un selector de fecha en tkinter?
Respuesta
No, Tk no incluye un widget de selector de fecha. Hay un par de widgets de calendario Python podría intentar:
http://svn.python.org/projects/sandbox/trunk/ttk-gsoc/samples/ttkcalendar.py
Gracias lo echaré un vistazo. Mi pregunta era, dado que no tienen un widget, ¿qué hicieron la mayoría de los desarrolladores de tk/tkinter? ¿Solo tienes tres cajas giratorias? ¿Qué hay de variar meses? ¿Qué hay de los años bisiestos? – MKaras
hablando como un desarrollador ex-tcl/tk, simplemente hice mi las pocas veces que necesité uno. Son bastante triviales de crear ya que tcl (y python) tienen rutinas de fecha que pueden alimentar los datos. Todo lo que necesitas hacer es crear una grilla de botones o algo similar. –
Sí, lo mismo aquí; Tcl/Tk (y Tkinter) hacen que sea muy trivial crear nuevos widgets. Si desea alguna estructura, consulte el Kit de construcción de widgets (utilizado por el calendario de WCK vinculado anteriormente). –
No, pero lo puede conseguir por parte del usuario como elemento de fecha y hora a partir de una cadena con formato ..
Ejemplo:
import datetime
userdatestring = '2013-05-10'
thedate = datetime.datetime.strptime(userdatestring, '%Y-%m-%d')
Consulte http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior. Es práctico, aunque no la forma más fácil de obtener una cita.
No fue tan lejos como pude encontrar. Para cualquier persona que quiera hacer esto en el futuro:
Solía tkSimpleDialog y ttkcalendar.py (con modificaciones de this SO post) para hacer una CalendarDialog. Los tres archivos están disponibles en mi github.
A continuación se muestra el código en mi CalendarDialog.py:
import Tkinter
import ttkcalendar
import tkSimpleDialog
class CalendarDialog(tkSimpleDialog.Dialog):
"""Dialog box that displays a calendar and returns the selected date"""
def body(self, master):
self.calendar = ttkcalendar.Calendar(master)
self.calendar.pack()
def apply(self):
self.result = self.calendar.selection
# Demo code:
def main():
root = Tkinter.Tk()
root.wm_title("CalendarDialog Demo")
def onclick():
cd = CalendarDialog(root)
print cd.result
button = Tkinter.Button(root, text="Click me to see a calendar!", command=onclick)
button.pack()
root.update()
root.mainloop()
if __name__ == "__main__":
main()
Heh, el archivo de origen python que vinculó en realidad NO TIENE esas modificaciones: me encontré con un obstáculo hasta que me di cuenta de que tenía que modificarlo para que funcionara bien con una aplicación Tkinter real: P –
Sí, por eso También me vinculé a las versiones parcheadas en mi github. – Moshe
Ahh gotcha, gracias. Simplemente asumí que todos los enlaces fueron al mismo lugar porque no los leí lo suficientemente cerca como para ver que no eran todos github: P –
Ésta es la forma en que codificamos un selector de fechas pitón en tkinter.
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Rambarun Komaljeet
# License: Freeware
# ---------------------------------------------------------------------------
import calendar
import tkinter as tk
import time
from tkinter import ttk
class MyDatePicker(tk.Toplevel):
"""
Description:
A tkinter GUI date picker.
"""
def __init__(self, widget=None, format_str=None):
"""
:param widget: widget of parent instance.
:param format_str: print format in which to display date.
:type format_str: string
Example::
a = MyDatePicker(self, widget=self.parent widget,
format_str='%02d-%s-%s')
"""
super().__init__()
self.widget = widget
self.str_format = format_str
self.title("Date Picker")
self.resizable(0, 0)
self.geometry("+630+390")
self.init_frames()
self.init_needed_vars()
self.init_month_year_labels()
self.init_buttons()
self.space_between_widgets()
self.fill_days()
self.make_calendar()
def init_frames(self):
self.frame1 = tk.Frame(self)
self.frame1.pack()
self.frame_days = tk.Frame(self)
self.frame_days.pack()
def init_needed_vars(self):
self.month_names = tuple(calendar.month_name)
self.day_names = tuple(calendar.day_abbr)
self.year = time.strftime("%Y")
self.month = time.strftime("%B")
def init_month_year_labels(self):
self.year_str_var = tk.StringVar()
self.month_str_var = tk.StringVar()
self.year_str_var.set(self.year)
self.year_lbl = tk.Label(self.frame1, textvariable=self.year_str_var,
width=3)
self.year_lbl.grid(row=0, column=5)
self.month_str_var.set(self.month)
self.month_lbl = tk.Label(self.frame1, textvariable=self.month_str_var,
width=8)
self.month_lbl.grid(row=0, column=1)
def init_buttons(self):
self.left_yr = ttk.Button(self.frame1, text="←", width=5,
command=self.prev_year)
self.left_yr.grid(row=0, column=4)
self.right_yr = ttk.Button(self.frame1, text="→", width=5,
command=self.next_year)
self.right_yr.grid(row=0, column=6)
self.left_mon = ttk.Button(self.frame1, text="←", width=5,
command=self.prev_month)
self.left_mon.grid(row=0, column=0)
self.right_mon = ttk.Button(self.frame1, text="→", width=5,
command=self.next_month)
self.right_mon.grid(row=0, column=2)
def space_between_widgets(self):
self.frame1.grid_columnconfigure(3, minsize=40)
def prev_year(self):
self.prev_yr = int(self.year_str_var.get()) - 1
self.year_str_var.set(self.prev_yr)
self.make_calendar()
def next_year(self):
self.next_yr = int(self.year_str_var.get()) + 1
self.year_str_var.set(self.next_yr)
self.make_calendar()
def prev_month(self):
index_current_month = self.month_names.index(self.month_str_var.get())
index_prev_month = index_current_month - 1
# index 0 is empty string, use index 12 instead,
# which is index of December.
if index_prev_month == 0:
self.month_str_var.set(self.month_names[12])
else:
self.month_str_var.set(self.month_names[index_current_month - 1])
self.make_calendar()
def next_month(self):
index_current_month = self.month_names.index(self.month_str_var.get())
try:
self.month_str_var.set(self.month_names[index_current_month + 1])
except IndexError:
# index 13 does not exist, use index 1 instead, which is January.
self.month_str_var.set(self.month_names[1])
self.make_calendar()
def fill_days(self):
col = 0
# Creates days label
for day in self.day_names:
self.lbl_day = tk.Label(self.frame_days, text=day)
self.lbl_day.grid(row=0, column=col)
col += 1
def make_calendar(self):
# Delete date buttons if already present.
# Each button must have its own instance attribute for this to work.
try:
for dates in self.m_cal:
for date in dates:
if date == 0:
continue
self.delete_buttons(date)
except AttributeError:
pass
year = int(self.year_str_var.get())
month = self.month_names.index(self.month_str_var.get())
self.m_cal = calendar.monthcalendar(year, month)
# build dates buttons.
for dates in self.m_cal:
row = self.m_cal.index(dates) + 1
for date in dates:
col = dates.index(date)
if date == 0:
continue
self.make_button(str(date), str(row), str(col))
def make_button(self, date, row, column):
"""
Description:
Build a date button.
:param date: date.
:type date: string
:param row: row number.
:type row: string
:param column: column number.
:type column: string
"""
exec(
"self.btn_" + date + " = ttk.Button(self.frame_days, text=" + date
+ ", width=5)\n"
"self.btn_" + date + ".grid(row=" + row + " , column=" + column
+ ")\n"
"self.btn_" + date + ".bind(\"<Button-1>\", self.get_date)"
)
def delete_buttons(self, date):
"""
Description:
Delete a date button.
:param date: date.
:type: string
"""
exec(
"self.btn_" + str(date) + ".destroy()"
)
def get_date(self, clicked=None):
"""
Description:
Get the date from the calendar on button click.
:param clicked: button clicked event.
:type clicked: tkinter event
"""
clicked_button = clicked.widget
year = self.year_str_var.get()
month = self.month_str_var.get()
date = clicked_button['text']
self.full_date = self.str_format % (date, month, year)
print(self.full_date)
# Replace with parent 'widget' of your choice.
try:
self.widget.delete(0, tk.END)
self.widget.insert(0, self.full_date)
except AttributeError:
pass
if __name__ == '__main__':
def application():
MyDatePicker(format_str='%02d-%s-%s')
root = tk.Tk()
btn = tk.Button(root, text="test", command=application)
btn.pack()
root.mainloop()
- 1. ¿Cómo configuro la fecha para un selector de fecha?
- 2. Selector de fecha en Android
- 3. Cómo creo varias casillas de verificación de una lista en un ciclo for en python tkinter
- 4. tkinter en un widget
- 5. selector de fecha años mínimo
- 6. iPhone SDK: ¿Cómo implementar un selector de fecha modal?
- 7. selector de fecha en jqGrid, ejemplo simple?
- 8. iPhone OS: ¿Cómo creo un NSDate para una fecha específica?
- 9. En SQLAlchemy, ¿cómo creo una columna de 'fecha de MySQL'?
- 10. jQuery de fecha y hora MVC3 selector
- 11. Validación del selector de fecha WPF
- 12. ¿Cómo creo una fecha y hora en Python desde milisegundos?
- 13. utilizar el calendario como selector de fecha
- 14. jQuery - Control de selector de fecha móvil
- 15. Selector de fecha jQuery - deshabilitar fechas pasadas
- 16. ¿Cómo creo la fecha actual (o cualquier fecha) como un NSDate sin horas, minutos y segundos?
- 17. Buena selector de fecha para ASP.NET
- 18. ASP.NET selector de fecha y hora?
- 19. selector de fecha jQuery - TimeZone Issue
- 20. selector de fecha y hora para jsf
- 21. Establecer la fecha predeterminada del selector de fecha WPF en la fecha actual
- 22. Código de selector de fecha dinámico de JQuery
- 23. Cambiar el idioma del selector de fecha
- 24. selector de fecha de jquery dividido en campos múltiples
- 25. ¿Cómo creo un DateFormat con un argumento de tiempo opcional?
- 26. ¿Cómo puedo agregar un nuevo botón en el selector de fecha en android?
- 27. ¿Cómo se crea un botón en un Canvas de tkinter?
- 28. jQuery Selector de fecha no funciona en Chrome
- 29. Selenio IDE: ¿Cómo seleccionar próxima fecha disponible de selector de fecha
- 30. Rails 3 fecha del selector de fecha de jquery no guardada en la base de datos
Impropiable, ya que tkinter es muy minimalista. Si desea algo sofisticado sin construirlo usted mismo, su mejor opción es uno de los juegos de herramientas GUI más grandes, que incluyen baterías (recomiendo Qt). – delnan
+1 pregunta totalmente razonable. Este es el tipo de interfaz de usuario que debería estandarizarse dentro de un conjunto de herramientas. Sorprendido tk no lo ofrece. – Anne