python calendar widget qwidget qtgui

Botón de llamada de widget de Python QtGui Calendar



qwidget (1)

Estoy usando un widget de calendario para Python. Y necesito llamar al widget cuando se hace clic en un botón. La situación es que no puedo encontrar cuál es el método en la clase de calendario que muestra el widget en sí. La clase de calendario fue tomada desde aquí: http://www.eurion.net/python-snippets/snippet/Calendar_Date%20picker.html

Aquí están mis importaciones:

from tkinter import * from tkinter import ttk import tkinter.messagebox import time import requests #needs to be installed import pymysql #needs to be installed import csv import win32com.client #needs to be installed from calendar import Calendar import datetime

Aquí está la creación del botón:

# Calendar Buttons calBut=ttk.Button(f2, width=4, text="Cal", command=Calendar.what_method?).grid(column=3,row=1, sticky=W)

Por lo que sé, puedo simplemente configurar el comando del botón para llamar al método de visualización de widgets ubicado en la clase de calendario. ¿Cómo obtener el método que muestra el widget de calendario cada vez que se hace clic en mi botón? Ninguno de los que muestran muestran el widget.

Usando Python 3.3.5 Spider WinPython 3.3.5

**EDITAR**

El programa tiene pestañas y f2 indica la pestaña donde estará el botón.

from tkinter import * from tkinter import ttk import tkinter.messagebox import time import requests #needs to be installed import pymysql #needs to be installed import csv import win32com.client #needs to be installed import datetime from calendar import Calendar import calendar ################################# # Create Button Click Calendar def callback(): root2=Toplevel(f2) ttkcal = Calendar(root2,firstweekday=calendar.SUNDAY) ttkcal.pack(expand=1, fill=''both'') root2.update() root2.minsize(root2.winfo_reqwidth(), root2.winfo_reqheight()) # Calendar Buttons b=ttk.Button(f2, width=4, text="Cal", command=callback).grid(column=3,row=1, sticky=W)

Cuando presiono el botón, abre la ventana del calendario, pero está vacía. Y la consola me da error:

TypeError: __init__() got multiple values for argument ''firstweekday

Gracias


No tan fácil. El problema es que mezcla las dos bibliotecas de GUI. Por lo tanto, es necesario dos bucles de eventos principales (al menos): uno para el código de Tkinter y otro para el código de PyQt .
Una forma de hacer lo que quiera, utilizando subprocess y threading módulos para ejecutar calendar.py en diferentes subprocesos. Ejemplo:

from tkinter import * from tkinter import ttk import subprocess import threading master = Tk() def callback(): subprocess.call(''python calendar.py'') b=ttk.Button(master, width=4, text="Cal", command=lambda:threading.Thread(target=callback).start()).grid(column=3,row=1, sticky=W) mainloop()

Otra forma: crear un bucle de evento principal de Qt dentro de la función de devolución de llamada (solución sucia):

from tkinter import * from tkinter import ttk from calendar import Calendar import sys from PyQt4 import QtGui master = Tk() def callback(): app = QtGui.QApplication(sys.argv) gui = Calendar() gui.show() app.exec_() b=ttk.Button(master, width=4, text="Cal", command=callback).grid(column=3,row=1, sticky=W) mainloop()

EDITAR: Cómo llamar widget. Antes que nada, mira esta respuesta y modifica tu ttkcalendar.py como sugirió kalgasnik . Entonces prueba esto:

from tkinter import * from tkinter import ttk from ttkcalendar import Calendar import calendar master = Tk() def callback(): root2=Toplevel(master) ttkcal = Calendar(root2,firstweekday=calendar.SUNDAY) ttkcal.pack(expand=1, fill=''both'') root2.update() root2.minsize(root2.winfo_reqwidth(), root2.winfo_reqheight()) b=ttk.Button(master, width=4, text="Cal", command=callback).grid(column=3,row=1, sticky=W) mainloop()

EDIT 2. Solucionando los problemas
Ok, parece que encontré todos los problemas.

  1. En realidad, importa dos veces el mismo módulo: módulo de calendario estándar:

    from calendar import Calendar import calendar

Pero no importa la clase Calendar desde el módulo ttkcalendar (No olvide cambiarlo como se describe aquí ). Entonces, la importación debería verse así:

import ttkcalendar import calendar

Crear calendario (cambié el código un poco para mayor claridad):

ttkcal = ttkcalendar.Calendar(root2,firstweekday=calendar.SUNDAY)

  1. En su código, la ventana principal se inicializa dos veces:
    línea 15: master = Tk()
    línea 960: root = Tk()
    Debe eliminar la primera inicialización.

  2. Mezcla pack() y grid() en la misma ventana maestra. Según los documentos , es una mala idea:

Advertencia: nunca mezcle la cuadrícula y el paquete en la misma ventana maestra. Tkinter pasará el resto de su vida felizmente tratando de negociar una solución con la que ambos gerentes estén contentos. En lugar de esperar, elimine la aplicación y vuelva a examinar su código. Un error común es utilizar el padre incorrecto para algunos de los widgets.

Entonces, en vez de nb.pack(fill=''both'', expand=''yes'') tienes que escribir algo como esto nb.grid(column=0, row=0, sticky=(W, E))

Finalmente, aquí hay enlaces al código fijo:

ttkcalendar.py (ya modificado, listo para usar):
https://gist.github.com/anonymous/5e0d973f57e185572df2

Su script con las modificaciones descritas:
https://gist.github.com/anonymous/65cb808dc64e414c0c12