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.
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)
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.Mezcla
pack()
ygrid()
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